redis的复制功能包括:同步和命令传播
- 同步:是将从服务器的数据库状态更新与主服务器当前所处的数据库状态
- 命令传播:当主服务器的数据库状态被修改,导致主从不一致,让主从重新一致
同步:
当客户端向服务器发送slaveof命令,(假设现在有127.0.0.1:12345和127.0.0.1:6379两个服务器)
127.0.0.1:12345>SLAVEOF 127.0.0.1 6379
OK
则127.0.0.1:12345变成127.0.0.1 6379的从服务器
具体步骤:(同步操作需要向主服务器发送SYNC命令(旧版同步))
- 从服务器向主服务器发送SYNC命令
- 收到后主服务器执行BGSAVE命令,在后台生成RDB文件,并用缓冲区记录从现在开始的所有写命令
- 当主服务器BGSAVE命令执行完毕后,将RDB文件发送给从服务器,从服务器载入这个RDB文件
- 主服务器将记录再缓冲区的所有命令发送从服务器,从服务器执行这些命令更新自己
旧版同步命令有个缺陷:
当从服务器断线重启后,即便只有大部分相同,也会从头到尾再同步一次
新版复制(PSYNC):
PSYNC:具有完整同和部分同步:
完整同步:发生在第一次同步
部分同步:发生在断线重连
部分重同步的实现:
1.主服务器和从服务器的复制偏移量
2.主服务器的复制积压缓冲区
3.服务器的运行ID
复制偏移量:
主服务器每次发送后(假设当前未10086+33=10109(33为本次发送后增加的量)),更新自己的复制偏移量,若从服务器正常更新后复制偏移量应该也为10109,若挂了,则为上次的10086
复制积压缓冲区:
复制积压缓冲区是服务器维护的一个固定长度的先进先出的队列,默认大小为1mb,因此每次存储的都是最新的1mb数据
当从服务器连上主服务器后,PSYNC命令会发送自己的复制偏移量offset给主服务器,主服务器根据这个进行何种同步操作
1.若复制偏移量任然存在于复制积压缓冲区,则部分同步
2.若已有部分不存在,则完整同步
服务器运行ID
每个服务器都有自己的ID,主服务器通过保存从服务器的ID,判断连接的从服务器是否自己的从服务器,如果不是,直接完整同步
心跳检测,默认从服务器每秒一个桑主服务器发送命令
- 检测主从服务器的网络连接状态:默认0~1秒,若超过则说明主从故障
- 辅助实现min-slaves配置选项(min-slavers-to-write 3和min-slaves-max-lag 10),当从服务器数量少于3个或延迟大于等于10秒,主服务器拒绝执行写命令
- 检测命令丢失,主服务器发送复制偏移量给从服务器,检测是否丢失