MemoryDB 2024 论文分享

论文地址点这里。

TL;DR

  • MemoryDB 通过底层依赖 AWS 内部系统 Multi-AZ Transaction Log 实现了 11 个 9 的持久性保证。

  • 通过依赖 Transaction Log 的 Condition API 和租约机制来实现了一致性和可用性保证。

  • 通过周期性调度 Off-box 节点来外部 Rewrite binlog 避免了内存 Fork 影响用户业务可用性。

  • 通过 Binlog 的 checksum 校验机制来保证数据的正确性。

MemoryDB 是 AWS 推出的内存数据库,兼容 Redis API,与 ElastiCache 相比,可以提供 11 个 9 的可用性。本篇文章对 AWS 刚发布的 MemoryDB 论文进行讲解。
在这里插入图片描述

图 1. MemoryDB 架构图
  1. 架构上支持一个 Primary + 多 Replica 结构。

  2. 写入流程

    1. 客户端写入到 Primary

    2. Primary 修改内存结构,将回复暂存,并将 AOF 写穿到 Transaction Log

    3. Transaction Log 写入成功之后,Primary 再回复客户端,如果写入失败,需要重试直到成功,否则一直无法回复客户端。

    4. 之后同链接的读取可见。

  3. 读取流程

    1. 读取 primary,能保证读取到最新数据,且能保证读取到的数据一定是写入到 Transaction Log 中的。

    2. 读取 replica,不保证能读取到最新数据,replica 消费可能有延迟。

  4. 全量数据是 S3 中的最新 RDB 加上对应 offset 开始 Transaction Log。

  5. Control Plane 是多租户的,主要负责以下几件事情:

    1. 集群生命周期管理。

    2. 周期性调度 Off-box 实例来重写 binlog,重写操作是 Load 之前的全量数据到内存,然后重新 dump 一份新的 RDB 到 S3

Failover 流程

在这里插入图片描述

图 2. MemoryDB Failover 流程

以上图一个 primary + 两个 replica 的集群为例,描述 Failover 过程:

  1. T1,Primary 会周期性的写入 heartbeat 消息,注意,此时的 heartbeat 消息也提供了租约机制,replica 消费到租约消息之后,会进入 backoff timer(timer 强制大于 heartbeat 携带的时间长度),replica 在 backoff timer 中不会发起新的选举。

  2. T2,Primary Down,heartbeat loss,假设此时 heartbeat 的 ID 是 5,replica-1 和 replica-2 结束 backoff timer 之后,未观察到续租消息,将会主动发起选举,他们会携带自己消费到的最新 heartbeat ID + 1 去选举。

    1. replica1 writes “replica1 is primary” to the log with ID 6

    2. replica2 writes “replica2 is primary” to the log with ID 6

  3. T3,replica-2 成功,成为新的 Primary,replica-1 收到 replica-2 选举的 binlog,自己也会进入 backoff 时间,不再尝试选举。replica-2 会通过 gossip 消息向集群中同步自己竞选成功的消息。

脑裂问题

MemoryDB 本身不会脑裂,因为通过 Transaction Log 的唯一接口来选主,假设 T2 时刻,死去的 Primary 再次复活,尝试选举:

  • Case 1:Primary 此时还是拥有最新的 binlog,所有的备存在都没有消费完的可能,那么 primary 带着最新 ID + 1 去竞选就可能成功,一旦成功,剩余的 replica 发起的竞选就会失败。

  • Case 2:Primary 再次恢复时候,别的 replica 已经竞选成功了,那么它带着自己一个落后的 ID + 1 来竞选发现会失败,此时去消费 binlog,则会知道别人已经是 master 了,则进入 backoff timer,不再参与。

扩缩容流程

  1. 扩容 replica 节点数量

    1. 申请或者销毁新的 ECS,然后从 S3 获取 SNAPSHOT,并且继续消费最新的 binlog。
  2. 改变实例 ECS 类型

    1. 滚动升级的过程,先操作 replica,最后切换 primary,切换 primary 会造成重新选主。

    2. 如果用户指定的 ECS 类型太小产生了内存满的情况,则回滚。

  3. 扩容分片数量

    1. 申请新分片,通过 slot 迁移来传输数据。新节点先接收 slot snapshot,然后源端会 pasue write,并且将增量都发送过去。之后会进行数据握手检查。失败就终止流程,成功继续。

    2. 更新元数据表,用了 2pc 的方式,如果此时源或者新奔溃,可以拉起后恢复。

测试情况

性能测试

Redis 版本:7.0.7

测试机器:10 ec2(和 MemoryDB 同 AZ)

key 数量:100w

key 大小:100bytes

开启多 IO:Redis 和 MemroyDB 相同数量。
在这里插入图片描述
在这里插入图片描述

  • 纯读

    • QPS: MemoryDB 在 2X Large 之前比 Redis 高一点,之后会高比较多,原因是自己的 Multi IO 实现的比较好。

    • 延迟:差不多。

  • 纯写

    • QPS:MemoryDB 是 Redis 的一半左右。

    • 延迟:MemroyDB 是 Redis 的五倍。

  • 混合负载,80%读,20%写。

    • 延迟:MemoryDB 是 Redis 三倍左右。

备份 RDB 的影响

机型:2 vCPU,16GB RAM,maxmemory 配置 12g,相当于 Reserved 25%内存。

key 数量:2000w,value 500 bytes,大约 10g 数据量。

在这里插入图片描述

Redis 的表现,从开始 bgsave 之后,latency 会从 10 抖动到 70 左右,直到内存用完,开始交换 swap 之后,latency 会急剧恶化,到不可用的级别。

在这里插入图片描述
MemoryDB 利用 Off-box 节点来外部进行 SNAPSHOT 流程,延迟和吞吐不变。

一致性的其余考量

  1. 升级保护机制:当升级过程中,遇到不认识的 binlog 怎么办?

默认升级过程会先升级备,最后升级主,但是假设此时正有一个 replica 被加入,却用了旧版本,新的主升级完成之后发送的 binlog 这个备不会处理。因为 binlog 上面会表示这个流是来自于那个引擎版本的。这里不会主动 crash 或者默认加载,防止后续出问题。

  1. Snapshot 校验机制:

MemoryDB 维护整个事务日志的运行校验和,并定期将当前校验和值写入事务日志,off-box 节点启动之后,下载快照,首先通过加载快照数据对比其文件中记录的校验和,然后找到快照中记录的 binlog 位置,从 binlog 位置开始 load,并且继续计算校验和,并最终和 load 到的最新日志进行对比。

  1. 一致性验证(这部分想了解但提及较少):
  • 形式化验证:https://dl.acm.org/doi/pdf/10.1145/2499370.2462184

  • 一致性测试框架:https://github.com/anishathalye/porcupine

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/13705.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言基础——循环(2)+关机程序

欢迎点赞支持 个人主页:励志不掉头发的内向程序员; 专栏主页:C语言基础; 文章目录 目录 前言 一、for循环的补充 二、循环的嵌套 1、嵌套的介绍 1.1 练习: 题目解析: 优化: 三、goto语句 1、go…

3DEXPERIENCE DELMIA Role: RFP - Fabrication Robot Programmer

Discipline: Robotics Role: RFP - Fabrication Robot Programmer 在虚拟工厂中定义、验证和编程机器人弧焊和密封剂沉积系统 模拟和验证完整的焊接、密封剂沉积和搬运机器人系统,以消除代价高昂的碰撞并优化生产率提供精确的生产就绪型机器人程序,同…

Day 38 防火墙技术IPtables

一:防火墙简介 1.简介 ​ iptables其实并不是真正的防火墙,我们可以把他理解为一个客户端的代理,用户是通过iptables这个代理,将用户的安全设定执行到对应的“安全框架”中,这个“安全框架”才是真正的防火墙。这个框…

mac安装Redis

官网: https://redis.io中文网: Redis中文网 安装 brew install redis 查看版本 redis-server --version 开启关闭服务 方式一(不推荐) 这种方式不太建议,因为控制台不用输出相应的日志 开启服务 brew service…

K8S认证|CKA题库+答案| 1. 权限控制RBAC

1、权限控制RBAC 您必须在以下Cluster/Node上完成此考题: Cluster Master node Worker node k8s master …

园区网的基本了解

园区网使用的典型技术---IEEE802.3标准/IEEE802.11标准 封闭式园区网络 ---由内部人员使用,不能访问互联网。 ---制订各式各样的规章制度 ---NAC,网络接入控制 开放式园区网络 ---服务于公众的,认证 园区网的发展 第一代:…

神经网络模型结构和参数可视化

神经网络模型结构和参数可视化 一、前言二、Netron2.1Netron简介2.2TensorFlow、Keras、Caffe模型文件实测结果2.3PyTorch、scikit-learn模型文件实测结果 三、NN-SVG四、Netscope五、PlotNeuralNet六、Graphviz七、总结参考文档 一、前言 在神经网络的某些应用场景中&#xf…

.NET快速实现网页数据抓取

网页数据抓取需求 本文我们以抓取博客园10天推荐排行榜第一页的文章标题、文章简介和文章地址为示例,并把抓取下来的数据保存到对应的txt文本中。 请求地址:https://www.cnblogs.com/aggsite/topdiggs 创建控制台应用 创建名为DotnetSpiderExercise的控…

【Spring security】【pig】Note01-pig登录验证过程

🌸🌸 pig 登录验证 🌸🌸 pig后端源码 一、大概执行顺序,便于理解 pig spring-security 二、配置过滤器 配置SecurityFilterChain 三、执行过程分析 请求拦截: 当客户端发送请求时,Sprin…

Kubernetes——Pod详解

目录 一、Pod基础概念 1.概念 2.使用方式 3.Pause容器 3.1网络 3.2存储 4.Pod容器分类 4.1自主式Pod 4.2控制器管理的Pod 二、Pod的分类 1.基础容器(infrastructure container) 2.初始化容器(initcontainers) 2.1Ini…

CR80清洁卡都能用在什么地方?

CR80清洁卡(也被称为ISO 7810 ID-1清洁卡)的规格确实使其在各种需要读取磁条或接触式智能卡的设备中都有广泛的用途。这些设备包括但不限于: ATM自动终端机:当ATM机的磁条读卡器出现故障或读卡不灵敏时,可以使用CR80清…

Python 渗透测试:MySQL 数据库 弱密码测试.(3306 端口)

什么是 MySQL 数据库 MySQL 是一种开源的关系型数据库管理系统(RDBMS)。它是目前世界上最流行的数据库之一,被广泛应用于各种类型的网站和应用程序中。MySQL 数据库爆破是一种非法和危险的黑客攻击手段。它指的是通过暴力猜测密码的方式,试图获取未授权访问 MySQL 数据库的行为…

【qt】下拉列表组件

下拉列表组件 一.Combo Box1.可以直接双击编辑下拉内容2.代码初始化下拉内容3.一次性添加多个下拉内容4.下拉框手动编辑5.下拉内容添加附加值6.下拉添加图标7.获取下拉值 二.总结 一.Combo Box 还是老样子,咱们边做边练 目标图: 1.可以直接双击编辑下…

存储+调优:存储-Cloud

存储调优:存储-Cloud Master Server 配置: IP192.168.1.254 useradd mfs tar zxf mfs-1.6.11.tar.gz.gz cd mfs-1.6.11 ./configure --prefix/usr --sysconfdir/etc --localstatedir/var/lib --with-default-usermfs --with-default-groupmfs --disabl…

掌握一个面试小心机,就业离你只差这一步!

马上进6月份,大家是已经在工作岗位上了,还是正在面试呀!不知道大家在面试过程中有没有遇到这样的问题,面试完几家公司之后进行总结,还是不知道自己为什么被pass掉,今天小编带大家搞清测试岗位面试的底层逻辑…

成为领导心腹:测试新人如何提高影响力?

作为一名新入行的测试人员,如何提高自己在工作中的影响力呢? 可能有人会问了:“测试人员不是只要安分守己的做好自己的测试工作不就行了吗?又不是当管理者,为什么要提高影响力呢?” 说实话,我…

【C++】学习笔记——二叉搜索树

文章目录 十四、二叉搜索树1. 二叉搜索树的概念2. 二叉搜索树的实现查找插入中序遍历删除拷贝构造析构函数赋值重载完整代码 3. 二叉搜索树的应用K搜索模型KV搜索模型 未完待续 十四、二叉搜索树 1. 二叉搜索树的概念 二叉搜索树又称二叉排序树,它或者是一棵空树&…

同旺科技 FLUKE ADPT 隔离版发布 ---- 2

所需设备: 1、FLUKE ADPT 隔离版 内附链接; 应用于:福禄克Fluke 12E / 15BMax / 17B Max / 101 / 106 / 107 应用于:福禄克Fluke 15B / 17B / 18B 正面: 反面: 侧面: 开孔位置(可…

面试八股之MySQL篇4——事务篇

🌈hello,你好鸭,我是Ethan,一名不断学习的码农,很高兴你能来阅读。 ✔️目前博客主要更新Java系列、项目案例、计算机必学四件套等。 🏃人生之义,在于追求,不在成败,勤通…

react组件中的共享数据

在前面的示例中,每个 MyButton 都有自己独立的 count,当每个按钮被点击时,只有被点击按钮的 count 才会发生改变: 然而,你经常需要组件 共享数据并一起更新。 为了使得 MyButton 组件显示相同的 count 并一起更新&…