MemoryDB 2024 论文分享

news2024/11/27 14:39:01

论文地址点这里。

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.coloradmin.cn/o/1708579.html

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

相关文章

FastReport 主子表关系

代码中只需要绑定主表的数据就可以,子表的数据会通过报表中的关连关系自动到数据库中带出。 using CloudSaaS.DB.Handler; using CloudSaaS.Model; using CloudSaaS.DAL; using FastReport; using FastReport.Web; using System; using System.Collections.Generic;…

Llama模型家族训练奖励模型Reward Model技术及代码实战(一)

LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (一) 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (二) 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (三) 基于 LlaMA…

安全术语 | 软件包purl详解:跨工具、数据库、API和语言之间可靠地识别和定位软件包

软件包URL(purl,Package URL)是一个URL字符串,用于在编程语言、包管理器、包约定、工具、API和数据库中以最通用和统一的方式识别和定位软件包。purl是对现有方法进行标准化的尝试,以可靠地识别和定位软件包。 有望取代…

服务案例|网络攻击事件的排查与修复

LinkSLA智能运维管家V6.0版支持通过SNMP Trap对设备进行监控告警,Trap是一种主动推送网络设备事件或告警消息的方式,与SNMP轮询(polling)不同,具有以下几点优势: 1. 实时监控与快速响应 SNMP Trap能够实时…

【网络协议】应用层协议HTTPS

文章目录 为什么引入HTTPS?基本概念加密的基本过程对称加密非对称加密中间人攻击证书 为什么引入HTTPS? 由于HTTP协议在网络传输中是明文传输的,那么当传输一些机密的文件或着对钱的操作时,就会有泄密的风险,从而引入…

Mowgli用于配对多组学整合

对同一组细胞的多个分子层进行分析逐渐流行。越来越需要能够联合分析这些数据的多视图学习方法。Mowgli是一种支持配对多组学数据的整合方法。值得注意的是,Mowgli将非负矩阵分解和最优传输相结合,同时提高了非负矩阵分解的聚类性能和可解释性。作者将Mo…

AIGC 010-CLIP第一个文本和图像对齐的大模型!

AIGC 010-CLIP第一个文本和图像对齐的大模型! 文章目录 0 论文工作1 论文方法2 效果 0 论文工作 不客气的说CLIP和扩散模型的成功让计算式视觉领域几乎所有工作都重新做了一遍。 CLIP(对比语言-图像预训练)论文提出了一种新的对比学习方法&a…

adb获取包名和界面名

adb获取包名和界面名 mac adb shell dumpsys window windows | grep mFocusedApp windows adb shell dumpsys window windows | findstr mFocusedApp 这个是在当前手机打开哪个界面获取的就是哪个界面的包名与界面 注意第一次连接时会有提示,需要连接两次才可以 …

Java设计模式(23种设计模式 重点介绍一些常用的)

创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。行为型模式,共十一种:…

SpringBoot整合SpringSecurit,实现ajax的登录、退出、权限校验

1、本文章中SpringBoot整合SpringSecurity&#xff0c;只是基于session方式&#xff0c;并且没有使用到redis。 2、登录、登出都是通过ajax的方式进行。 项目目录&#xff1a; 1、pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xm…

Leecode热题100---二分查找---搜索插入位置

题目&#xff1a; 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 nums 为 无重复元素 的 升序 排列数组 常规思路&#xff1a; class Solution { public:int f…

走进全球LED显示龙头艾比森,深挖逆势增长43%的数智化逻辑

在大环境不景气的情况下&#xff0c;有一家智能制造企业在2023年营收40亿&#xff0c;同比增长高达43%&#xff0c;海外营收增长约 46%&#xff0c;并且连续12年单品牌出口额第一。 这就是全球LED显示龙头艾比森。 5月9日&#xff0c;纷享销客带领近70位企业高管走进纷享销客…

设计模式 22 访问者模式 Visitor Pattern

设计模式 22 访问者模式 Visitor Pattern 1.定义 访问者模式是一种行为型设计模式&#xff0c;它允许你在不改变已有类结构的情况下&#xff0c;为一组对象添加新的操作。它将算法与对象结构分离&#xff0c;使你能够在不修改现有类的情况下&#xff0c;为这些类添加新的操作。…

922. 按奇偶排序数组 II - 力扣

1. 题目 给定一个非负整数数组 nums&#xff0c; nums 中一半整数是 奇数 &#xff0c;一半整数是 偶数 。 对数组进行排序&#xff0c;以便当 nums[i] 为奇数时&#xff0c;i 也是 奇数 &#xff1b;当 nums[i] 为偶数时&#xff0c; i 也是 偶数 。 你可以返回 任何满足上述…

大学生简历写作指南:让你的简历脱颖而出

在求职过程中&#xff0c;简历不仅是展示自己的镜子&#xff0c;更是赢得面试机会的敲门砖。本文将从简历排版、专业简历定制、内容筛选等方面&#xff0c;提供全面的指导&#xff0c;帮助打造一份既有深度又接地气的简历。 一、简历排版 1.1 根据岗位要求调整排版 准备简历…

LeetCode215数组中第K个最大元素

题目描述 给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不是第 k 个不同的元素。你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。 解析 快速排序的思想&#xff…

【机器学习】【深度学习】批量归一化(Batch Normalization)

概念简介 归一化指的是将数据缩放到一个固定范围内&#xff0c;通常是 [0, 1]&#xff0c;而标准化是使得数据符合标准正态分布。归一化的作用是使不同特征具有相同的尺度&#xff0c;从而使模型训练更加稳定和快速&#xff0c;尤其是对于使用梯度下降法的算法。而标准化的作用…

Pytorch环境配置2.0.1+ Cuda11.7

查找cuda、cudnn、Pytorch(GPU)及cuda和NVIDIA显卡驱动对应关系 查询可支持的最高cuda版本 nvidia-smi查看支持的cuda的版本 CUDA版本对应表 我的显卡驱动是Driver Version&#xff1a;535.40.&#xff0c;那么左边对应的CUDA都可以兼容 右上角为CUDA 版本&#xff0c;可以看…

OTFS系统建模、通信性能分析、信道估计、模糊函数【附MATLAB代码】

文献来源&#xff1a;​微信公众号&#xff1a;EW Frontier OTFS简介 OTFS信道估计 % Clear command window, workspace variables, and close all figures clc; clear all; close all; ​ % Define Eb values in dB EbdB -10:2:10; ​ % Convert Eb values from dB to lin…

【计算机毕业设计】基于SSM++jsp的汽车客运站管理系统【源码+lw+部署文档】

目录 第1章 绪论 1.1 课题背景 1.2 课题意义 1.3 研究内容 第2章 开发环境与技术 2.1 MYSQL数据库 2.2 JSP技术 2.3 SSM框架 第3章 系统分析 3.1 可行性分析 3.1.1 技术可行性 3.1.2 经济可行性 3.1.3 操作可行性 3.2 系统流程 3.2.1 操作流程 3.2.2 登录流程 3.2.3 删除信息流…