redis的复制
redis的复制包含什么:同步(sync)和命令传播(command propagate)
- 同步:指的是从机初次连接或者宕机后重连进行同步追上主服务器的过程
- 命令传播:正常工作状态下,为了主从一直,主将执行的命令传播给从的过程
一、同步
-
旧版的复制同步的问题
sync
image.png
旧版的问题在哪,从机初次复制没有问题,但当断线后重连也要从头同步一次,而sync,因为主要执行bgsave,发送rdb文件等,会占用很大的cpu,内存,I/O资源。短线重连可能只有一小部分的数据没有更新,却要执行负担那么重的命令是很不划算的
-
新版同步 psync
p是什么,partial sync
psync有2中模式,完整重同步和部分重同步。
1.full resynchronization 用于初次同步复制,执行sync命令。
2.partial resynchronzation 处理断线后重连复制,在条件符合时,主服务器将主从连接断开期间的写命令发送给从服务器
image.png
partial resynchronzation功能构成
1.主服务器的复制偏移量(replication offset)和从的复制偏移量
2.主服务器的复制积压缓存区(replication backlog)
3.服务器的运行ID
复制偏移量
主服务器当发送后,偏移量就增加,从服务器接收到之后,就更新偏移量。当主从偏移量不一致时,代表主从服务器不一致。这时,主就要去补偿从丢失的那部分数据,至于如何补偿,则和复制挤压缓冲区有关
复制缓冲区
当主进行命令传播时,不仅会将写命令发送给所有的从服务器,还会将写命令积压到复制缓冲区里面
这时一个FIFO的队列,默认大小1MB
缓冲区里有偏移量和内容,当从连接上主之后,从会发送从的复制偏移量给主。主检查缓冲区,如果偏移量在缓冲区内,则选择部分复制,否则,全量复制
tip缓冲区大小的合理设置,可以通过secondwrite_size_per_second,每秒写入时间来估算,看平均断线后,多久会连接上。估算后修改repl-backlog-size
id
每个服务器启动时,都会生成40位随机数字id,当主连接上从后,主会把id发给从,从保留主机的id,这样,当重连后,从将自己保留原来的主id发给新的主,新的主就可以比较主是否是原来的主机,如果不是 ,肯定是需要进行全量重同步。
最终肯定是主服务器通过判断,决定执行哪种同步的
二、命令传播
当完成同步后,主从服务器进入命令传播阶段。这样主服务将写命令传播给从服务器即可
命令传播里有一个心跳检测是需要注意的
心跳检测,会包含3个内容
- 1.检测网络连接,我们在redis里执行info命令可以看到复制情况,里面包含state,offset,lag
代表了从的复制偏移量,延迟了几秒。默认redis每秒心跳检测一次,因此正常情况下lag为0或1 - 2.辅助min-slaves配置选项
如果你的从宕机了,你觉得你的高可用或安全性受到影响,可以配置这个选项
min-slave-to-write 3
min-slaves-max-lag 10
意味着至少要有3个从,且3个从的lag不能都大于10s,不然主会拒绝写入 - 3.检测命令丢失
因为心跳检测的时候,从会发当前的offset,所以主可以比对出之前发的命令是否有丢失的情况,如果丢失,则补发