完整复制流程
(1)slave node 启动,仅仅保存master node的信息,包括master node的host和ip,但是复制还没有开始。master host和ip从redis.conf里边配置的。
(2)slave node内部有定时任务,每秒检查是否有新的master node要连接和复制,如果发现就和master node建立socket网络连接。
(3)slave node发送ping命令给master node。
(4)口令认证,如果master设置了requirepas,那么salve node必须发送masterauth的口令过去进行认证。
(5)master node第一次执行全量复制,将所有数据发送给slave node。
(6)master node后续持续将写命令,异步复制给slave node。
数据同步相关核心机制
第一次slave连接master的时候,执行全量复制,这个过程中存在一些细节机制。
(1)master和slave都会维护一个offset
master会在自身不断累加offset,slave会在自身不断累加offset。
slave每秒会上报自己的offset给master,同时master会保存每个slave的offset。
(2)backlog
master node有一个backlog,默认1MB大小
master node给slave node复制数据时,也会将数据在backlog中同步写一份。
backlog主要是用来做全量复制中断后的增量复制。
(3)master run id
info server,可以看到master run id
如果根据host+ip定位master node,是不靠谱的,如果master node重启或者数据出现变化,那么slave node应该根据不同的run id区分,run id 不同就做全量复制。
如果需要不更改run id重启redis,可以使用redis-cli debug reload命令。
全量复制
- master 执行bgsave,在本地生成一份rdb快照文件。
- master node将rdb快照文件发送给salve node,如果rdb复制时间超过60秒(repl-timeout),那么slave node就会认为复制失败,可以适当调节大这个参数。
- 对于千兆网卡,一般每秒传输100MB,6G文件,很可能超过60秒。
- master node在生成rdb时,会将所有新的写命令缓存到内存中,在salve node中保存了rdb之后,再将新写的命令复制给salve node。
- client-output-buffer-limit slave 256MB 64MB 60,如果在复制期间,内存缓冲区持续消耗超过64MB,或者一次性超过256MB,那么停止复制,复制失败。
- slave node接收到rdb之后,清理自己的旧数据,然后重新加载rdb到自己的内存中,同时基于旧数据版本对外提供服务。
- 如果slave node开启了AOF,那么会立即执行重写AOF
rdb生成,rdb通过网络拷贝,slave旧数据的清理,slave aof rewrite,很耗费时间,如果复制的数据量在4G-6G之间,那么很可能全量复制时间消耗到1分半到2分钟。
增量复制
- 如果全量复制过程中,master-slave网络连接断掉,那么salve重新连接master时,会触发增量复制
- master直接从自己的backlog中获取部分丢失数据,发送给salve node,墨粉backlog就是1MB
-
master就是根据slave发送的paync中的offset来从backlog中获取数据的
maste run id的作用.png
网友评论