完整重同步用于处理初次复制情况:完整重同步的执行步骤和sync命令的执行步骤一样,他们是通过让主服务器创建并发送rdb文件,以及向从服务器发送保存在缓冲区里面的写命令来进行同步。
Redis 2.8 以前的复制功能不能高效地处理断线后重复制情况, 但 Redis 2.8 新添加的部分重同步功能可以解决这个问题。
部分重同步通过复制偏移量、复制积压缓冲区、服务器运行 ID 三个部分来实现。
复制偏移量
执行复制的双方-主服务器和从服务器会分别维护一个复制偏移量。
复制积压缓冲区
复制积压缓冲区是由服务器维护的一个固定长度(fixed-size)先进先出(FIFO)队列,默认大小为1MB。当主服务器进行命令传播时,它不仅会将命令发送给所有从服务器,还会将命令写入复制积压缓冲区里面。
在复制操作刚开始的时候, 从服务器会成为主服务器的客户端, 并通过向主服务器发送命令请求来执行复制步骤, 而在复制操作的后期, 主从服务器会互相成为对方的客户端。
主服务器通过向从服务器传播命令来更新从服务器的状态, 保持主从服务器一致, 而从服务器则通过向主服务器发送命令来进行心跳检测, 以及命令丢失检测。
复制的实现
1.设置主服务器的地址和端口
127.0.0.1:12345> slaveof 127.0.0.1:6379
2.建立套接字连接
3.发送ping命令
4.身份验证
5.发送端口信息
6.同步
7.命令传播
心跳检测
1.检测主从服务器的网络连接状态
127.0.0.1:6379> info repliaction
2.辅助实现min-slaves配置选项
min-slaves-to-write 3
min-slaves-max-lag 10
ps:在从服务器的数量小于3个,或者三个服务器的延迟(lag)值都大于或等于10秒时,主服务器将拒绝执行写命令
3.检测命令丢失
内容来自:<redis设计与实现>这本书
已有 0 条评论