15.6 复制的实现
SLAVEOF 是一个异步命令
以SLAVEOF 127.0.0.1 6379为例进行新复制版本的讲解
15.6.1 步骤1:设置主服务器的地址和端口
从服务器将客户端给定的主服务器的ip和端口保存到redisServer的char *masterhost和int masterport属性
保存完毕之后,从服务器向客户端返回OK,开始实际的复制工作
15.6.2 步骤2:建立socket连接
从服务器根据ip和端口,向主服务器发起连接
连接成功后,从服务器将为这个socket关联一个处理复制工作的文件事件处理器,用来负责执行后续的复制工作,如接收RDB文件、接收传播的命令等
主服务器接受连接后,为从服务器创建相应的客户端状态,即从服务器为主服务器的客户端
此时的状态:
15.6.3 步骤3:发送PING命令
从服务器成为主服务器的客户端之后,发送PING命令
作用:
从服务器收到的回复有三种情况:命令超时、返回错误、返回PONG
15.6.4 步骤4:身份验证
从服务器收到”PONG“后,根据是否设置了masterauth选项来决定是否进行身份验证:如果设置了,则进行
如果需要,则向主服务器发送一条AUTH命令,参数为masterauth选项的值,主服务器则使用requirepass选项来与masterauth对比,流程如下:
15.6.5 步骤5:发送端口信息
身份验证之后,从服务器执行命令REPLCONF listening-port < port-number > ,向主服务器发送从服务器的监听端口号
主服务器会将从服务器的端口号记录在其redisClient结构的int slave_listening_port属性中
唯一作用:主服务器执行INFO replication命令时打印出从服务器的端口号
15.6.6 步骤6:同步
从服务器发送PSYNC命令给主服务器,执行同步操作,并将自己的数据库更新至主服务器数据库当前所处的状态
注意:在此步骤之后,主服务器也会成为从服务器的客户端
因此到了这里,主从服务器互为对方的客户端
15.6.7 步骤7:命令传播
完成了同步之后,进入命令传播阶段,主服务器将自己执行的写命令发送给从服务器,从服务器接收并执行即可保持一致
15.7 心跳检测
在命令传播阶段,从服务器默认以每秒1次的频率,向主服务器发送命令REPLCONF ACK < replication_offset(从服务器当前偏移量) >
- 作用
1.检测主从服务器的网络连接状态
2.辅助实现min-slaves选项
3.检测命令丢失
接下来逐一介绍
15.7.1 检测主从服务器的网络连接状态
如果主服务器超过1秒钟没有收到从服务器发来的REPLCONF ACK命令,那么主服务器就知道连接出现问题了
查看:INFO replication的l从服务器列表的lag栏目
15.7.2 辅助实现min-slaves选项
min-slaves-to-write和min-slaves-max-lag两个选项可以防止主服务器在不安全的情况下执行写命令
例子:
15.7.3 检测命令丢失
如果因为网络故障,主服务器传播给从服务器的写命令丢失,那么当从服务器向主服务器发送REPLCONF ACK命令时,主服务器将发觉从服务器的复制偏移量少于自己的偏移量,此时主服务器就会根据从服务器提交的复制偏移量,在复制积压缓冲区里面找到从服务器缺少的数据,并将这些数据重新发送给从服务器
原理类似部分重同步,区别在于补发缺失数据是服务器没断线的情况下执行的,而部分重同步是断线重连进行的