持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情
集群中的数据同步
Redis通常以集群的方式搭建,集群中有一个master节点和若干slave节点,主从节点需要进行数据同步。同步方式分为全量同步和增量同步,slave节点请求同步发送replicaof
命令,该命令中包含了 replication id
和 offset
两个标识
- replication id:每个master有唯一的id,以它为主节点的集群中,slave会继承这个master的replication id
- offset:表示同步数据的偏移量,如果slave中的offset小于master中的offset,就需要同步数据
如果是刚加入集群的slave节点,请求中的replication id和master的不同,那么执行的是第一次同步(全量同步)
简述全量同步的流程
-
slave向master发送同步请求
- slave节点请求同步,master节点判断replid不一致,返回主节点的replid和offset
-
master生成RDB文件发送给slave
- master节点执行BGSAVE命令生成RDB,将RDB发送给slave
- slave清空本地数据,加载master的RDB
-
发送生成RDB期间的命令日志给slave
- master将生成RDB期间的命令记录在repl_baklog,发送给slave
- slave执行接收到的命令,保持与master的同步
如果是slave节点重启,那么执行增量同步
-
slave向master请求同步
- slave请求同步,master判断replid和offset一致
-
发送命令日志给slave
- 根据offset获取需要同步的命令发送给slave
-
关于repl_baklog日志的覆盖
repl_baklog日志中新写入的数据会覆盖最早的数据,因此如果offset标记的数据已经被覆盖,无法进行增量同步,会进行全量同步
优化主从集群的方式
-
在master中配置
repl-diskless-sync yes
,生成的RDB文件不会落入磁盘,直接放到网络IO流 -
redis单节点的内存上限不要太高,减少RDB文件的大小
-
适当提高repl-baklog的大小,尽量避免全量同步
-
采用主-从-从链式结构,减少master数据同步的压力