redis为了充分发挥自己的性能,在生产上经常使用一台master主机和一台slave或者几台slave机器来做读写分离,而这个里面的机制就是用了redis服务器间的复制。 对应两台服务器,可以直接用slaveof这个命令来设置主从,但是这个仅仅是测试用,一般是在服务器里面设置,修改redis.conf,配置slaveof master的ip master的port,再设置只读属性,建立两台机器的主从次序。
老版复制
redis在老版复制功能用了同步(sync)和命令传播(command propagate)两个操作:
- 同步操作将从服务器的数据库状态更新到主服务器所处的数据库状态。
- 命令传播操作则用于在主服务器的数据库状态被修改后,主从服务器的数据库状态不一致时,让他们保持一致。
SYNC命令解析:
- 从服务器向主服务器发送sync命令。
- 收到sync命令的主服务器执行BGSAVE命令,后台生成一个rdb文件,使用缓冲区记录到现在开始执行的所有写命令。
- 主服务器发送rdb文件给从服务器,从服务器接收并载入,将数据库状态更新至主服务器执行bgsave命令时的数据库状态。
- 主服务器将记录在缓冲区里的写命令发送给从服务器,从服务器执行写命令,使数据库状态更新与主服务器状态一致。
命令传播解析: 当同步之后,主服务器状态又发生改变的时候,同时发送一条命令让从服务器状态更新,最终保持一致。
老版的复制是在从服务器断线重连后的sync效率很低,因为它默认从头到尾整体复制,当数据量比较大的时候,会非常耗资源。
新版复制
redis2.8开始之后,使用了PSYNC来代替SYNC,主要处理断线重连的问题。PSYNC有完整重同步和部分重同步,其中完整重同步和SYNC几乎一致。而部分重同步专门处理断线后复制的情况,从服务器在断线后重连到主服务器时,主服务器将这之间的写命令发送给从服务器,这样数据库最后更新一致,节能环保高效。
部分重同步的实现方式:
- 记录主服务器的复制偏移量和从服务器的复制偏移量。
- 命令传播的时候还把主服务器命令写到的复制积压缓冲区。
- 记录二者服务器的运行ID,如果一致就部分重同步,如果不一致则完整复制。
PSYNC详细步骤:
- 设置主服务器地址和端口。
- 建立套接字连接(设置slaveof参数)。
- 发送ping命令(检查)。
- 身份验证。
- 发送端口信息。
- 同步。
- 命令传播。
此外,redis主从之间还提供了心跳检测的相关功能。