redis replication的完整运行流程和原理

1. 复制的完整流程

a) slave-node启动,仅仅保存master-node的信息,包括master-node的host和ip,但是复制流程还没开始
master-node的host和ip来源于redis.conf中的slaveof配置的
b) slave-node内部有个定时任务,每秒检查是否有新的master-node要连接和复制,如果发现,就跟master-node建立socket网络连接
c) slave-node发送ping命令给master-node
d) 口令认证,如果master设置了requirepass,那么slave-node必须发送masterauth的口令过去认证
e) master-node第一次执行全量复制,将所有数据发送给slave-node
f) master-node后续持续将写命令,同步复制给slave-node

2. 数据同步相关核心机制

指的就是第一次slave连接master的时候,执行的全量复制,那个过程里面的一些细节的机制
a) master和slave都会维护一个offset
master会在自身不断累加offset,slave也会在自身不断累加offset
slave每秒都会上报自己的offset给master,同时master也会保存每个slave的offset
这个倒不是说特定的就用在全量复制,主要是master和slave都要知道各自的数据的offset,才能知道互相之前的数据不一致的地方
b) backlog
master-node有一个backlog,默认是1MB大小
master-node给slave-node复制数据时,也会将数据在backlog中同步写一份,主要是做全量复制中断后的增量复制,就是实现断点续传
c) master-node的+ run id
登录redis-cli后,info server,就可以看到master run id
如果根据host+ip定位master-node,是不靠谱的,如果master-node重启或者数据出现了变化,那么slave-node应该根据不同的run id区分,run id不同就做全量复制,
解释一下:master如果要做故障恢复,通过冷备的rdb,直接取到以前的一份rdb的备份,然后恢复到master中,此时master中的数据就完全不一样了,而且run id也变化了,slave-node重新连上来的话,还是拿着以前旧的offset信息来进行同步,这时候已经出问题了,只要发现run id 变化了,就触发一次全量复制,
如果需要不更改run id重启redis,可以使用redis-cli debug reload命令
d) psync
slave-node使用psync从master-node进行复制,发送psync run id offset
master-node会根据自身的情况返回相应信息,可能是FULLRESYNC run id offset触发全量复制,可能是CONTINUE触发增量复制
e) 全量复制
1.master-node执行bgsave,在本地生成一份rdb快照文件
2.master-node将rdb快照文件发送给slave-node,如果rdb复制时间超过60秒(repl-timeout),那么slave-node就会认为复制失败,可以适当调节大这个参数
3.对于千兆网卡的机器,一般每秒传输100MB,6G文件,很可能超过60s
4.master-node在生成rdb的时候,会将所有新的写命令缓存在内存中,在slave-node保存了rdb之后,再将新的写命令复制给slave-node
5.client-output-buffer-limit slave 256MB 64MB 60 这个配置命令是说,如果在复制期间,内存缓冲区持续消耗超过64MB,或者一次性超过256MB,那么停止复制,复制失败,这时候是因为写命令太多了,内存缓冲区已经不够了
6.slave-node接收到rdb之后,清空自己的数据,然后重新加载rdb到自己的内存中,同时基于旧的数据版本对外提供服务
7.如果slave-node开启了AOF,那么会立即执行BGREWRITEAOF,重写AOF

总体流程就是:rdb生成,rdb通过网络拷,slave-node旧数据的清理,slave aof rewrite很耗费时间的

f) 增量复制

  1. 如果是全量复制的过程中,master-node的网络连接断掉,那么slave会重新连接master-node时,会触发增量复制
  2. master-node直接从自己的backlog中获取部分丢失的数据,发送给slave-node,默认backlog就是1MB
  3. master-node就是根据slave-node发送的psync来从offset和backlog来获取数据的
    g) heartbeat
    主从节点互相都会发送heartbeat信息
    master默认,每隔10秒发送一次heartbeat,slave-node每隔1秒发送一次heartbeat
    h) 异步复制
    Master-node在接收到写命令后,现在内部写入数据,然后异步发送给slave-node
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值