 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 Strong Eventually replicas, and where it is always mathematically possible to resolve inconsistencies which might result. 并发冲突 举个栗子: LWW(Last Writer Wins)-Register: 适用于 K/V 类型的存储 解决数据冲突的方式是通过使用 unix timestamp 或类似自然时间的计数0 码力 | 45 页 | 1.74 MB | 1 年前3 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 Strong Eventually replicas, and where it is always mathematically possible to resolve inconsistencies which might result. 并发冲突 举个栗子: LWW(Last Writer Wins)-Register: 适用于 K/V 类型的存储 解决数据冲突的方式是通过使用 unix timestamp 或类似自然时间的计数0 码力 | 45 页 | 1.74 MB | 1 年前3
 Python 标准库参考指南 3.10.15 ctypes 参考手册 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 785 17 并发执行 799 17.1 threading --- 基于线程的并行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . not a == b 会被解读为 not (a == b) 而 a == not b 会 引发语法错误。 4.3 比较运算 在 Python 中有八种比较运算符。它们的优先级相同(比布尔运算的优先级高)。比较运算可以任意串连;例 如,x < y <= z 等价于 x < y and y <= z,前者的不同之处在于 y 只被求值一次(但在两种情况下当 x < y 结果为假值时 z 都不会被求值)。 Reference, 发布 3.10.15 此代码实际上会在 Python 运行于 交互模式时自动运行 (参见Readline 配置)。 以下示例实现了同样的目标,但是通过只添加新历史的方式来支持并发的交互会话。 import atexit import os import readline histfile = os.path.join(os.path.expanduser("~"), ".python_history")0 码力 | 2207 页 | 10.45 MB | 9 月前3 Python 标准库参考指南 3.10.15 ctypes 参考手册 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 785 17 并发执行 799 17.1 threading --- 基于线程的并行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . not a == b 会被解读为 not (a == b) 而 a == not b 会 引发语法错误。 4.3 比较运算 在 Python 中有八种比较运算符。它们的优先级相同(比布尔运算的优先级高)。比较运算可以任意串连;例 如,x < y <= z 等价于 x < y and y <= z,前者的不同之处在于 y 只被求值一次(但在两种情况下当 x < y 结果为假值时 z 都不会被求值)。 Reference, 发布 3.10.15 此代码实际上会在 Python 运行于 交互模式时自动运行 (参见Readline 配置)。 以下示例实现了同样的目标,但是通过只添加新历史的方式来支持并发的交互会话。 import atexit import os import readline histfile = os.path.join(os.path.expanduser("~"), ".python_history")0 码力 | 2207 页 | 10.45 MB | 9 月前3
 Python 标准库参考指南 3.8.20 ctypes --- Python 的外部函数库 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 722 17 并发执行 755 17.1 threading --- 基于线程的并行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . not a == b 会被解读为 not (a == b) 而 a == not b 会 引发语法错误。 4.3 比较运算 在 Python 中有八种比较运算符。它们的优先级相同(比布尔运算的优先级高)。比较运算可以任意串连;例 如,x < y <= z 等价于 x < y and y <= z,前者的不同之处在于 y 只被求值一次(但在两种情况下当 x < y 结果为假值时 z 都不会被求值)。 readline --- GNU readline 接口 145 The Python Library Reference, 发布 3.8.20 以下示例实现了同样的目标,但是通过只添加新历史的方式来支持并发的交互会话。 import atexit import os import readline histfile = os.path.join(os.path.expanduser("~"), ".python_history")0 码力 | 2052 页 | 9.74 MB | 9 月前3 Python 标准库参考指南 3.8.20 ctypes --- Python 的外部函数库 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 722 17 并发执行 755 17.1 threading --- 基于线程的并行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . not a == b 会被解读为 not (a == b) 而 a == not b 会 引发语法错误。 4.3 比较运算 在 Python 中有八种比较运算符。它们的优先级相同(比布尔运算的优先级高)。比较运算可以任意串连;例 如,x < y <= z 等价于 x < y and y <= z,前者的不同之处在于 y 只被求值一次(但在两种情况下当 x < y 结果为假值时 z 都不会被求值)。 readline --- GNU readline 接口 145 The Python Library Reference, 发布 3.8.20 以下示例实现了同样的目标,但是通过只添加新历史的方式来支持并发的交互会话。 import atexit import os import readline histfile = os.path.join(os.path.expanduser("~"), ".python_history")0 码力 | 2052 页 | 9.74 MB | 9 月前3
 Python 标准库参考指南 3.7.13 ctypes --- Python 的外部函数库 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 678 17 并发执行 709 17.1 threading --- 基于线程的并行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . not a == b 会被解读为 not (a == b) 而 a == not b 会 引发语法错误。 4.3 比较运算 在 Python 中有八种比较运算符。它们的优先级相同(比布尔运算的优先级高)。比较运算可以任意串连;例 如,x < y <= z 等价于 x < y and y <= z,前者的不同之处在于 y 只被求值一次(但在两种情况下当 x < y 结果为假值时 z 都不会被求值)。 write_history_file, histfile) 此代码实际上会在 Python 运行于 交互模式时自动运行 (参见Readline(类库)配置)。 以下示例实现了同样的目标,但是通过只添加新历史的方式来支持并发的交互会话。 import atexit import os import readline histfile = os.path.join(os.path.expanduser("~"), ".python_history")0 码力 | 1961 页 | 9.14 MB | 9 月前3 Python 标准库参考指南 3.7.13 ctypes --- Python 的外部函数库 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 678 17 并发执行 709 17.1 threading --- 基于线程的并行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . not a == b 会被解读为 not (a == b) 而 a == not b 会 引发语法错误。 4.3 比较运算 在 Python 中有八种比较运算符。它们的优先级相同(比布尔运算的优先级高)。比较运算可以任意串连;例 如,x < y <= z 等价于 x < y and y <= z,前者的不同之处在于 y 只被求值一次(但在两种情况下当 x < y 结果为假值时 z 都不会被求值)。 write_history_file, histfile) 此代码实际上会在 Python 运行于 交互模式时自动运行 (参见Readline(类库)配置)。 以下示例实现了同样的目标,但是通过只添加新历史的方式来支持并发的交互会话。 import atexit import os import readline histfile = os.path.join(os.path.expanduser("~"), ".python_history")0 码力 | 1961 页 | 9.14 MB | 9 月前3
 Python 标准库参考指南 3.9.20 ctypes 参考手册 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 760 17 并发执行 775 17.1 threading --- 基于线程的并行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . not a == b 会被解读为 not (a == b) 而 a == not b 会 引发语法错误。 4.3 比较运算 在 Python 中有八种比较运算符。它们的优先级相同(比布尔运算的优先级高)。比较运算可以任意串连;例 如,x < y <= z 等价于 x < y and y <= z,前者的不同之处在于 y 只被求值一次(但在两种情况下当 x < y 结果为假值时 z 都不会被求值)。 配置)。 152 Chapter 6. 文本处理服务 The Python Library Reference, 发布 3.9.20 以下示例实现了同样的目标,但是通过只添加新历史的方式来支持并发的交互会话。 import atexit import os import readline histfile = os.path.join(os.path.expanduser("~"), ".python_history")0 码力 | 2146 页 | 10.17 MB | 9 月前3 Python 标准库参考指南 3.9.20 ctypes 参考手册 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 760 17 并发执行 775 17.1 threading --- 基于线程的并行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . not a == b 会被解读为 not (a == b) 而 a == not b 会 引发语法错误。 4.3 比较运算 在 Python 中有八种比较运算符。它们的优先级相同(比布尔运算的优先级高)。比较运算可以任意串连;例 如,x < y <= z 等价于 x < y and y <= z,前者的不同之处在于 y 只被求值一次(但在两种情况下当 x < y 结果为假值时 z 都不会被求值)。 配置)。 152 Chapter 6. 文本处理服务 The Python Library Reference, 发布 3.9.20 以下示例实现了同样的目标,但是通过只添加新历史的方式来支持并发的交互会话。 import atexit import os import readline histfile = os.path.join(os.path.expanduser("~"), ".python_history")0 码力 | 2146 页 | 10.17 MB | 9 月前3
 Python 标准库参考指南 3.11.10 ctypes 参考手册 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 847 17 并发执行 863 17.1 threading --- 基于线程的并行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . not a == b 会被解读为 not (a == b) 而 a == not b 会 引发语法错误。 4.3 比较运算 在 Python 中有八种比较运算符。它们的优先级相同(比布尔运算的优先级高)。比较运算可以任意串连;例 如,x < y <= z 等价于 x < y and y <= z,前者的不同之处在于 y 只被求值一次(但在两种情况下当 x < y 结果为假值时 z 都不会被求值)。 Reference, 发行版本 3.11.10 此代码实际上会在 Python 运行于 交互模式时自动运行 (参见Readline 配置)。 以下示例实现了同样的目标,但是通过只添加新历史的方式来支持并发的交互会话。 import atexit import os import readline histfile = os.path.join(os.path.expanduser("~"), ".python_history")0 码力 | 2399 页 | 11.19 MB | 9 月前3 Python 标准库参考指南 3.11.10 ctypes 参考手册 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 847 17 并发执行 863 17.1 threading --- 基于线程的并行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . not a == b 会被解读为 not (a == b) 而 a == not b 会 引发语法错误。 4.3 比较运算 在 Python 中有八种比较运算符。它们的优先级相同(比布尔运算的优先级高)。比较运算可以任意串连;例 如,x < y <= z 等价于 x < y and y <= z,前者的不同之处在于 y 只被求值一次(但在两种情况下当 x < y 结果为假值时 z 都不会被求值)。 Reference, 发行版本 3.11.10 此代码实际上会在 Python 运行于 交互模式时自动运行 (参见Readline 配置)。 以下示例实现了同样的目标,但是通过只添加新历史的方式来支持并发的交互会话。 import atexit import os import readline histfile = os.path.join(os.path.expanduser("~"), ".python_history")0 码力 | 2399 页 | 11.19 MB | 9 月前3
 Python 标准库参考指南 3.13 15.2 ctypes 参考手册 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 841 17 并发执行 855 17.1 threading --- 基于线程的并行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . not a == b 会被解读为 not (a == b) 而 a == not b 会 引发语法错误。 4.3 比较运算 在 Python 中有八种比较运算符。它们的优先级相同(比布尔运算的优先级高)。比较运算可以任意串连; 例如,x < y <= z 等价于 x < y and y <= z,前者的不同之处在于 y 只被求值一次(但在两种情况下 当 x < y 结果为假值时 z 都不会被求值)。 write_history_file, histfile) 此代码实际上会在 Python 运行于 交互模式时自动运行 (参见Readline 配置)。 以下示例实现了同样的目标,但是通过只添加新历史的方式来支持并发的交互会话。 import atexit import os import readline histfile = os.path.join(os.path.expanduser("~"), ".python_history")0 码力 | 2246 页 | 11.74 MB | 9 月前3 Python 标准库参考指南 3.13 15.2 ctypes 参考手册 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 841 17 并发执行 855 17.1 threading --- 基于线程的并行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . not a == b 会被解读为 not (a == b) 而 a == not b 会 引发语法错误。 4.3 比较运算 在 Python 中有八种比较运算符。它们的优先级相同(比布尔运算的优先级高)。比较运算可以任意串连; 例如,x < y <= z 等价于 x < y and y <= z,前者的不同之处在于 y 只被求值一次(但在两种情况下 当 x < y 结果为假值时 z 都不会被求值)。 write_history_file, histfile) 此代码实际上会在 Python 运行于 交互模式时自动运行 (参见Readline 配置)。 以下示例实现了同样的目标,但是通过只添加新历史的方式来支持并发的交互会话。 import atexit import os import readline histfile = os.path.join(os.path.expanduser("~"), ".python_history")0 码力 | 2246 页 | 11.74 MB | 9 月前3
 Python 标准库参考指南 3.13 15.2 ctypes 参考手册 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 837 17 并发执行 851 17.1 threading --- 基于线程的并行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . not a == b 会被解读为 not (a == b) 而 a == not b 会 引发语法错误。 4.3 比较运算 在 Python 中有八种比较运算符。它们的优先级相同(比布尔运算的优先级高)。比较运算可以任意串连; 例如,x < y <= z 等价于 x < y and y <= z,前者的不同之处在于 y 只被求值一次(但在两种情况下 当 x < y 结果为假值时 z 都不会被求值)。 write_history_file, histfile) 此代码实际上会在 Python 运行于 交互模式时自动运行 (参见Readline 配置)。 以下示例实现了同样的目标,但是通过只添加新历史的方式来支持并发的交互会话。 import atexit import os import readline histfile = os.path.join(os.path.expanduser("~"), ".python_history")0 码力 | 2242 页 | 11.73 MB | 9 月前3 Python 标准库参考指南 3.13 15.2 ctypes 参考手册 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 837 17 并发执行 851 17.1 threading --- 基于线程的并行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . not a == b 会被解读为 not (a == b) 而 a == not b 会 引发语法错误。 4.3 比较运算 在 Python 中有八种比较运算符。它们的优先级相同(比布尔运算的优先级高)。比较运算可以任意串连; 例如,x < y <= z 等价于 x < y and y <= z,前者的不同之处在于 y 只被求值一次(但在两种情况下 当 x < y 结果为假值时 z 都不会被求值)。 write_history_file, histfile) 此代码实际上会在 Python 运行于 交互模式时自动运行 (参见Readline 配置)。 以下示例实现了同样的目标,但是通过只添加新历史的方式来支持并发的交互会话。 import atexit import os import readline histfile = os.path.join(os.path.expanduser("~"), ".python_history")0 码力 | 2242 页 | 11.73 MB | 9 月前3
 Python 标准库参考指南 3.12 16.2 ctypes 参考手册 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 813 17 并发执行 827 17.1 threading --- 基于线程的并行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . not a == b 会被解读为 not (a == b) 而 a == not b 会 引发语法错误。 4.3 比较运算 在 Python 中有八种比较运算符。它们的优先级相同(比布尔运算的优先级高)。比较运算可以任意串连; 例如,x < y <= z 等价于 x < y and y <= z,前者的不同之处在于 y 只被求值一次(但在两种情况下 当 x < y 结果为假值时 z 都不会被求值)。 write_history_file, histfile) 此代码实际上会在 Python 运行于 交互模式时自动运行 (参见Readline 配置)。 以下示例实现了同样的目标,但是通过只添加新历史的方式来支持并发的交互会话。 import atexit import os import readline histfile = os.path.join(os.path.expanduser("~"), ".python_history")0 码力 | 2253 页 | 11.81 MB | 9 月前3 Python 标准库参考指南 3.12 16.2 ctypes 参考手册 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 813 17 并发执行 827 17.1 threading --- 基于线程的并行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . not a == b 会被解读为 not (a == b) 而 a == not b 会 引发语法错误。 4.3 比较运算 在 Python 中有八种比较运算符。它们的优先级相同(比布尔运算的优先级高)。比较运算可以任意串连; 例如,x < y <= z 等价于 x < y and y <= z,前者的不同之处在于 y 只被求值一次(但在两种情况下 当 x < y 结果为假值时 z 都不会被求值)。 write_history_file, histfile) 此代码实际上会在 Python 运行于 交互模式时自动运行 (参见Readline 配置)。 以下示例实现了同样的目标,但是通过只添加新历史的方式来支持并发的交互会话。 import atexit import os import readline histfile = os.path.join(os.path.expanduser("~"), ".python_history")0 码力 | 2253 页 | 11.81 MB | 9 月前3
 Python 标准库参考指南 3.12 16.2 ctypes 参考手册 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 813 17 并发执行 827 17.1 threading --- 基于线程的并行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . not a == b 会被解读为 not (a == b) 而 a == not b 会 引发语法错误。 4.3 比较运算 在 Python 中有八种比较运算符。它们的优先级相同(比布尔运算的优先级高)。比较运算可以任意串连; 例如,x < y <= z 等价于 x < y and y <= z,前者的不同之处在于 y 只被求值一次(但在两种情况下 当 x < y 结果为假值时 z 都不会被求值)。 write_history_file, histfile) 此代码实际上会在 Python 运行于 交互模式时自动运行 (参见Readline 配置)。 以下示例实现了同样的目标,但是通过只添加新历史的方式来支持并发的交互会话。 import atexit import os import readline histfile = os.path.join(os.path.expanduser("~"), ".python_history")0 码力 | 2253 页 | 11.81 MB | 9 月前3 Python 标准库参考指南 3.12 16.2 ctypes 参考手册 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 813 17 并发执行 827 17.1 threading --- 基于线程的并行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . not a == b 会被解读为 not (a == b) 而 a == not b 会 引发语法错误。 4.3 比较运算 在 Python 中有八种比较运算符。它们的优先级相同(比布尔运算的优先级高)。比较运算可以任意串连; 例如,x < y <= z 等价于 x < y and y <= z,前者的不同之处在于 y 只被求值一次(但在两种情况下 当 x < y 结果为假值时 z 都不会被求值)。 write_history_file, histfile) 此代码实际上会在 Python 运行于 交互模式时自动运行 (参见Readline 配置)。 以下示例实现了同样的目标,但是通过只添加新历史的方式来支持并发的交互会话。 import atexit import os import readline histfile = os.path.join(os.path.expanduser("~"), ".python_history")0 码力 | 2253 页 | 11.81 MB | 9 月前3
共 54 条
- 1
- 2
- 3
- 4
- 5
- 6














