这是我参与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.命令传播
完成同步后,主从服务器进入命令传播阶段,主服务器将自己执行的写命令发送给从服务器,从服务器接收并执行写命令就可以保证数据一致。
近期评论