Redis复制的实现

这是我参与11月更文挑战的第15天,活动详情查看:2021最后一次更文挑战

Redis复制的实现

向从服务器发送SLAVEOF命令,可以让从服务器复制一个主服务器 命令格式SLAVEOF 主服务器ip 主服务器port

1. 设置主服务器地址和端口

客户端向从服务器发送SLAVEOF命令后,从服务器会将客户端给定的主服务器的ip和port保存到redisServe的masterhost属性和masterport属性中

SLAVEOF命令是异步命令,完成masterhost属性和masterport属性的设置工作后,从服务器向客户端返回OK,实际的复制工作在OK返回之后才真正开始执行

2. 建立套接字连接

在SLAVEOF命令执行后,从服务器将根据命令设置的IP和port创建连向🔗主服务器的套接字,如果从服务器创建的套接字成功连接到主服务器,从服务器会为这个套接字关联一个文件事件处理器,这个处理器将负责执行后续的复制工作。主服务接受从服务器的套接字后,为该套接字创建客户端状态。

3. 发送PING命令

从服务器成为主服务器的客户端后,向主服务器发送PING命令,检查套接字的读写状态是否正常,检查主服务器是否正常处理命令请求。

4. 身份验证

从服务器收到主服务器返回的PONG后,如果从服务器设置了masterauth则需要进行身份验证,如果主从服务器设置的密码相同,则可以进行复制,否则进行重试

5. 发送端口信息

身份验证通过后从服务器执行命令REPLCONF listening-port 端口号,向主服务器发送从服务器的监听端口号,主服务收到命令后记录redisClient的slave_listening_port属性中

6. 同步

从服务器向主服务器发送PSYNC命令,执行同步,将自己数据库更新和主服务器一样

7.命令传播

完成同步后,主从服务器进入命令传播阶段,主服务器将自己执行的写命令发送给从服务器,从服务器接收并执行写命令就可以保证数据一致。