4. 【Redis主从架构】Redis replication完整流程和深入讲解
1. Replication完整复制流程
-
slave node启动,仅仅保存 master node 的信息,包括 master node 的host和ip,但是复制流程还没有开始,master host和ip从哪里来,redis.conf里面的slaveof配置的。
-
salve node 内部有个定时任务,每秒检查是否有master node要连接和复制,如果发现, slave node 就跟 master node 建立socket网络连接。
-
slave node 发送ping命令给master node。
-
口令认证,如果master 设置了 requiress,那么 salve node必须发送masterauth的口令过去进行认证。
-
slave node第一次连接到master,会执行全量复制,将所有数据发送给slave node
-
master node后续持续写命令,异步复制到slave node。
2. 数据同步相关的核心机制
第一次slave 连接 master 的时候,执行的全量复制,这个过程中一些细节的机制
master 会在自身不断累积offset,slave也会在自身不断累加offset
slave 每秒都会上报自己的offset给master,同时master也会保存每个slave的offset,主要作用是:master和slave都要知道各自数据的offset,才能知道互相之间数据不一致的情况。
master node有一个backlog,默认大小是1M。
master node给salve复制数据的时候,会同步将数据写到backlog中。
backlog主要是用来做全量复制中断时的增量复制
- master runid的作用
- info server命令可以看到 master 的run id
如果根据host+ip命令定位master node,是不靠谱的,如果master node重启或者数据出现了变化,那么 slave node应该根据不同的run id的不同做全量复制。
如果需要不更改run id重启redis,可以使用redis-cli debug reload命令。
- psync
slave 节点 使用 psync 命令从 master node进行复制,psync runid offset
master node 会根据自身的情况返回响应信息,可能是 fullresync runid offset 触发全量复制,可能是continue触发增量复制。
3. 全量复制详细介绍
- master 执行 bgsave 命令,在本地生成一份rdb快照文件。
- master node 将rdb快照文件发送到 salve node,如果rdb复制事件超过60s(repl-timeout),那么 slave node 就会认为复制失败,可以适当的调大这个参数。
- 对于千兆网卡的机器,一般一秒传输100MB文件,6G文件很可能超过60s秒,导致复制失败
- master node 生成rdb时,会将所有新增的命令存储到内存中,在slave node 保存了rdb之后,再讲新的写命令复制给 slave node。
- client-output-buffer-limit slave 256MB 64MB 60,如果在复制期间,新增的数据超过内存缓存区大小64MB,或者一次性到达256MB,那么停止复制,复制失败
- 如果slave node 开启了AOF,那么会立即执行BGRWRITEAOF,重新AOF。
rdb生成,rdb通过网络拷贝,slave旧数据的清理、slave aof rewrite,很好时间。
4. 增量复制
- 如果复制过程中,master-slave网络连接中断,那么salve重新连接到master,是进行增量复制,而不是全量复制。
- master 直接从自己的backlog中获取部分丢失的数据,发送给slave node,默认backlog的大小是1MB
- master 会根据salve发送的psync中的offset来从backlog中获取数据。
5. heartbeat
主从节点互相都会发送heartbeat信息
master 默认每隔10秒发送一次heartbeat,slave node每秒发送一个heartbeat。
6. 异步复制
master 介绍到写命令之后,现在内部写入数据,然后异步发送给slave node。
参考 石衫老师 《亿级流量教程》课程笔记