您现在的位置是:首页 >其他 >Redis 主从数据同步网站首页其他
Redis 主从数据同步
简介Redis 主从数据同步
Redis 的高可靠性 :
- 数据尽量少丢失 : AOF/RDB 保证
- 服务尽量少中断 : 增加副本冗余量,同数据保存多个实例
Redis 提供主从库模式,保证数据副本的一致
主从库间采用 : 读写分离的方式
- 读操作:主库、从库都接收
- 写操作:先到主库执行,再把主库的写操作同步给从库
主从库同步的模式:全量复制、基于长连接的命令传播,增量复制
主从库第一次同步
设置实例 2 (172.16.19.5) 为实例 1 (172.16.19.3) 的从库 :
replicaof 172.16.19.3 6379
主从库第一次同步流程 :
- 主从库间建立连接,并告知主库同步,为全量复制做准备
- 从库给主库发 psync (参数 : runID : 随机 ID ; offset=-1 : 第一次复制) ,表示要数据同步
- 主库发 FULLRESYNC (第一次复制用 : 全量复制) 给从库
- 主库将所有数据同步给从库。从库收到数据后,在本地完成数据加载
- 主库执行 bgsave ,生成 RDB ,并把文件发给从库
- 从库收到 RDB 后,先清空当前数据库,再加载 RDB
- 为了主从库的数据一致性,主库会用
replication buffer
,记录 RDB 生成后的所有写操作
- 主库会把 2 阶段中 , 新收到的写命令 , 发给从库
- 主库完成 RDB 发送后,把
replication buffer
的新修改操作 ,发给从库,从库再执行这些操作
- 主库完成 RDB 发送后,把
主从级联模式
主从库间第一次的全量复制同步 :
- 对主库,要完成两个耗时操作:生成 RDB 文件 , 传输 RDB 文件
当从库数量很多,并都和主库进行全量复制的问题 :
- 主库忙于
fork
子进程生成 RDB 文件 fork
会阻塞主线程处理正常请求,并导致主库响应请求速度变慢- 传输 RDB 会占用主库的网络带宽,导致主库的资源使用压力
分担主库压力的解决方案 :
主-从-从
模式 : 将主库生成 RDB/传输 RDB 压力,以级联方式分散到从库
级联的 主-从-从 模式 :
主从库间网络断
当主从库断后,主库会把写操作写入 replication buffer
,并也写入 repl_backlog_buffer
环形缓冲区
- 主库会记录自己写的位置,从库会记录自己已读的位置
- 主从同步偏移量
master_repl_offset
: 当主库的写操作越多,该值会越大 - 当从库的读取速度较慢,环形缓冲区写满后,主库会覆盖之前写操作 , 可能会导致主从库间的数据不一致
repl_backlog_buffer :
Redis 增量复制流程 :
- 主从库的连接恢复后,从库先给主库发 psync ,并把自己当前
slave_repl_offset
发给主库 - 主库会判断自己的 master_repl_offset 和 slave_repl_offset 之间的差距
- 主库把
master_repl_offset ~ slave_repl_offset
间的写操作,同步给从库就行
避免主从库间的数据不一致 :
- 方案 : 调整
repl_backlog_size
- 计算公式 : 缓冲空间大小 = 主库写入命令速度 * 操作大小 - 主从库间网络传输命令速度 * 操作大小
- repl_backlog_size = 缓冲空间大小 * 2
例子 : 主库每秒写入 2000 个操作,每个操作的大小 : 2KB,网络每秒能传输 1000 个操作
- 缓冲空间大小 = 2000*2 - 1000 *2 = 2MB
- 为了应对突发压力,repl_backlog_size = 2MB * 2 = 4MB
当并发请求量非常大 :
- 调大 repl_backlog_size ,如 : 缓冲空间大小 * 4
- 切片集群 : 分担单个主库的请求压力
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。