Redis 复制的实现
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.命令传播
完成同步后,主从服务器进入命令传播阶段,主服务器将自己执行的写命令发送给从服务器,从服务器接收并执行写命令就可以保证数据一致。
版权声明: 本文为 InfoQ 作者【周杰伦本人】的原创文章。
原文链接:【http://xie.infoq.cn/article/cadcad3be302e8f1b8a11d1be】。文章转载请联系作者。
评论