Redis 多数据中心双向同步 祝辰
Redis 多数据中心双向同步 祝辰 • 携程框架架构部门 • 资深研发工程师 • 专注于 Redis 高可用系统的 研发工作 • 对分布式存储系统有所涉猎 讲师介绍 祝辰 1 开篇 2 3 4 5 目 录 CONTENTS 携程的Redis架构 分布式理论 双向/多向同步的问题 CRDT 19 世纪的通讯 “At 12:30 am on April 4th 成每个站点的单独写入读取, 而不用关心 底层存储的一致性和同步问题. 对此需求进行分析后, 我们决定开发一个 Redis 的 DRC 架构, 来支撑携程集群的应 用单元化部署, 而不仅仅是限制于Redis 数 据的双向同步. Redis For DRC 高可用性 一致性 分区容忍性 传统关系型数据库为代表的 CA 新兴的NO-SQL为代表的 CP 分布式数据库则更多的关心AP Availability Partition 技 术 选 型 首先,P(网络分区)是首 要考虑因素 其次, 跨区域部署就是 为了提高可用性 最后,我们使用"最终一 致性"来解决数据冲突 双向回 环 环形复 制 数据一 致性 网络模 型的选 择 双向/多向同步有哪些共同的问题 网络通讯的 模型选择 Redis A: • set k v Redis B: • set k v 发生在端对端的互相同步过程中0 码力 | 45 页 | 1.74 MB | 1 年前3携程 Redis 多数据中心 双向同步实践 祝辰
携程 Redis 多数据中心 双向同步实践 祝辰 祝辰 目前任职携程框架架构部门资深 研发工程师 负责框架Redis团队的开发工作 目录 1 业务背景 2 3 双向同步 4 CRDT 高可用 开篇 & 背景 Redis 在携程的规模 25,000,0 00 QPS 2000+Clust er 200TB + 跨公网同步 SHANGHAI CANADA 海外重复收费的问 题 • 无法解决上海重复 收费的问题 业务痛点 仓位信息供应商 国内 海外 双向同步 • 我们希望可以通过 Redis的双向同步 解决重复收费的问 题 双向同步 Redis双向同步 双向同步 Redis Master Redis Master Redis双向同步 1. slaveof2. Sync data • slaveof命令 slaveof命令 • redis变成slave, 同步数据 • Slave无法写入 Redis双向同步 1. peerof 2. Sync data • 新的命令“peerof” • 同步数据 • 继续保持Master的 角色 如何解决 • 新的协议支持 双向同步 • 兼容Slaveof命 令 slaveof slaveof peerof 0 码力 | 33 页 | 2.15 MB | 1 年前3Hello 算法 1.0.0b2 Swift版
队列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 5.3. 双向队列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 5.4. 小结 . 得到一个环形链表。在环形链表中,我 们可以将任意结点看作是头结点。 双向链表。单向链表仅记录了一个方向的指针(引用),在双向链表的结点定义中,同时有指向下一结点(后 继结点)和上一结点(前驱结点)的「指针(引用)」。双向链表相对于单向链表更加灵活,即可以朝两个方向 遍历链表,但也需要占用更多的内存空间。 /* 双向链表结点类 */ class ListNode { var val: Int 数组支持随机访问、内存空间占用小;但插入与删除元素效率低,且初始化后长度不可变。 ‧ 链表可通过更改指针实现高效的结点插入与删除,并且可以灵活地修改长度;但结点访问效率低、占用 内存多。常见的链表类型有单向链表、循环链表、双向链表。 ‧ 列表又称动态数组,是基于数组实现的一种数据结构,其保存了数组的优势,且可以灵活改变长度。列 表的出现大大提升了数组的实用性,但副作用是会造成部分内存空间浪费。 ‧ 下表总结对比了数组与链表的各项特性。0 码力 | 199 页 | 15.72 MB | 1 年前3Hello 算法 1.0.0b1 Swift版
队列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 5.3. 双向队列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 5.4. 小结 . 得到一个环形链表。在环形链表中,我 们可以将任意结点看作是头结点。 双向链表。单向链表仅记录了一个方向的指针(引用),在双向链表的结点定义中,同时有指向下一结点(后 继结点)和上一结点(前驱结点)的「指针(引用)」。双向链表相对于单向链表更加灵活,即可以朝两个方向 遍历链表,但也需要占用更多的内存空间。 /* 双向链表结点类 */ class ListNode { var val: Int 数组支持随机访问、内存空间占用小;但插入与删除元素效率低,且初始化后长度不可变。 ‧ 链表可通过更改指针实现高效的结点插入与删除,并且可以灵活地修改长度;但结点访问效率低、占用 内存多。常见的链表类型有单向链表、循环链表、双向链表。 ‧ 列表又称动态数组,是基于数组实现的一种数据结构,其保存了数组的优势,且可以灵活改变长度。列 表的出现大大提升了数组的实用性,但副作用是会造成部分内存空间浪费。 ‧ 下表总结对比了数组与链表的各项特性。0 码力 | 190 页 | 14.71 MB | 1 年前3Hello 算法 1.0.0b1 JavaScript版
队列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 5.3. 双向队列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 5.4. 小结 . 得到一个环形链表。在环形链表中,我 们可以将任意结点看作是头结点。 双向链表。单向链表仅记录了一个方向的指针(引用),在双向链表的结点定义中,同时有指向下一结点(后 继结点)和上一结点(前驱结点)的「指针(引用)」。双向链表相对于单向链表更加灵活,即可以朝两个方向 遍历链表,但也需要占用更多的内存空间。 /* 双向链表结点类 */ class ListNode { val; next; 数组支持随机访问、内存空间占用小;但插入与删除元素效率低,且初始化后长度不可变。 ‧ 链表可通过更改指针实现高效的结点插入与删除,并且可以灵活地修改长度;但结点访问效率低、占用 内存多。常见的链表类型有单向链表、循环链表、双向链表。 ‧ 列表又称动态数组,是基于数组实现的一种数据结构,其保存了数组的优势,且可以灵活改变长度。列 表的出现大大提升了数组的实用性,但副作用是会造成部分内存空间浪费。 ‧ 下表总结对比了数组与链表的各项特性。0 码力 | 185 页 | 14.70 MB | 1 年前3Hello 算法 1.0.0b1 TypeScript 版
队列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 5.3. 双向队列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 5.4. 小结 . 得到一个环形链表。在环形链表中,我 们可以将任意结点看作是头结点。 双向链表。单向链表仅记录了一个方向的指针(引用),在双向链表的结点定义中,同时有指向下一结点(后 继结点)和上一结点(前驱结点)的「指针(引用)」。双向链表相对于单向链表更加灵活,即可以朝两个方向 遍历链表,但也需要占用更多的内存空间。 /* 双向链表结点类 */ class ListNode { val: number; 数组支持随机访问、内存空间占用小;但插入与删除元素效率低,且初始化后长度不可变。 ‧ 链表可通过更改指针实现高效的结点插入与删除,并且可以灵活地修改长度;但结点访问效率低、占用 内存多。常见的链表类型有单向链表、循环链表、双向链表。 ‧ 列表又称动态数组,是基于数组实现的一种数据结构,其保存了数组的优势,且可以灵活改变长度。列 表的出现大大提升了数组的实用性,但副作用是会造成部分内存空间浪费。 ‧ 下表总结对比了数组与链表的各项特性。0 码力 | 186 页 | 14.71 MB | 1 年前3Hello 算法 1.0.0b2 C++版
队列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 5.3. 双向队列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 5.4. 小结 . 则得到一个环形链表。在环形链表中,我 们可以将任意结点看作是头结点。 双向链表。单向链表仅记录了一个方向的指针(引用),在双向链表的结点定义中,同时有指向下一结点(后 继结点)和上一结点(前驱结点)的「指针(引用)」。双向链表相对于单向链表更加灵活,即可以朝两个方向 遍历链表,但也需要占用更多的内存空间。 /* 双向链表结点结构体 */ struct ListNode { int val; 数组支持随机访问、内存空间占用小;但插入与删除元素效率低,且初始化后长度不可变。 ‧ 链表可通过更改指针实现高效的结点插入与删除,并且可以灵活地修改长度;但结点访问效率低、占用 内存多。常见的链表类型有单向链表、循环链表、双向链表。 ‧ 列表又称动态数组,是基于数组实现的一种数据结构,其保存了数组的优势,且可以灵活改变长度。列 表的出现大大提升了数组的实用性,但副作用是会造成部分内存空间浪费。 ‧ 下表总结对比了数组与链表的各项特性。0 码力 | 197 页 | 15.72 MB | 1 年前3Hello 算法 1.0.0b2 Python版
队列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 5.3. 双向队列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 5.4. 小结 . 得到一个环形链表。在环形链表中,我 们可以将任意结点看作是头结点。 双向链表。单向链表仅记录了一个方向的指针(引用),在双向链表的结点定义中,同时有指向下一结点(后 继结点)和上一结点(前驱结点)的「指针(引用)」。双向链表相对于单向链表更加灵活,即可以朝两个方向 遍历链表,但也需要占用更多的内存空间。 """ 双向链表结点类 """ class ListNode: def __init__(self 数组支持随机访问、内存空间占用小;但插入与删除元素效率低,且初始化后长度不可变。 ‧ 链表可通过更改指针实现高效的结点插入与删除,并且可以灵活地修改长度;但结点访问效率低、占用 内存多。常见的链表类型有单向链表、循环链表、双向链表。 ‧ 列表又称动态数组,是基于数组实现的一种数据结构,其保存了数组的优势,且可以灵活改变长度。列 表的出现大大提升了数组的实用性,但副作用是会造成部分内存空间浪费。 ‧ 下表总结对比了数组与链表的各项特性。0 码力 | 186 页 | 15.69 MB | 1 年前3Hello 算法 1.0.0b1 C++版
队列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 5.3. 双向队列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 5.4. 小结 . 则得到一个环形链表。在环形链表中,我 们可以将任意结点看作是头结点。 双向链表。单向链表仅记录了一个方向的指针(引用),在双向链表的结点定义中,同时有指向下一结点(后 继结点)和上一结点(前驱结点)的「指针(引用)」。双向链表相对于单向链表更加灵活,即可以朝两个方向 遍历链表,但也需要占用更多的内存空间。 /* 双向链表结点结构体 */ struct ListNode { int val; 数组支持随机访问、内存空间占用小;但插入与删除元素效率低,且初始化后长度不可变。 ‧ 链表可通过更改指针实现高效的结点插入与删除,并且可以灵活地修改长度;但结点访问效率低、占用 内存多。常见的链表类型有单向链表、循环链表、双向链表。 ‧ 列表又称动态数组,是基于数组实现的一种数据结构,其保存了数组的优势,且可以灵活改变长度。列 表的出现大大提升了数组的实用性,但副作用是会造成部分内存空间浪费。 ‧ 下表总结对比了数组与链表的各项特性。0 码力 | 187 页 | 14.71 MB | 1 年前3Hello 算法 1.0.0b2 Java版
队列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 5.3. 双向队列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 5.4. 小结 . 中,我 们可以将任意结点看作是头结点。 双向链表。单向链表仅记录了一个方向的指针(引用),在双向链表的结点定义中,同时有指向下一结点(后 继结点)和上一结点(前驱结点)的「指针(引用)」。双向链表相对于单向链表更加灵活,即可以朝两个方向 遍历链表,但也需要占用更多的内存空间。 4. 数组与链表 hello‑algo.com 54 /* 双向链表结点类 */ class ListNode 数组支持随机访问、内存空间占用小;但插入与删除元素效率低,且初始化后长度不可变。 ‧ 链表可通过更改指针实现高效的结点插入与删除,并且可以灵活地修改长度;但结点访问效率低、占用 内存多。常见的链表类型有单向链表、循环链表、双向链表。 ‧ 列表又称动态数组,是基于数组实现的一种数据结构,其保存了数组的优势,且可以灵活改变长度。列 表的出现大大提升了数组的实用性,但副作用是会造成部分内存空间浪费。 ‧ 下表总结对比了数组与链表的各项特性。0 码力 | 197 页 | 15.72 MB | 1 年前3
共 283 条
- 1
- 2
- 3
- 4
- 5
- 6
- 29