这节介绍Redis的主从复制过程,包括创建和复制。redis
Redis支持主从模式以提供读写分离,能够经过在从服务器的客户端上执行以下命令以链接主服务器:数据库
SLAVEOF IP PORT
或者在配置文件中配置SLAVEOF选项。服务器
SLAVEOF命令包括如下几个步骤:性能
从服务设置主服务器的地址和端口,从服务器会保存客户端上送的地址和端口。ui
从服务器同主服务器创建套接字链接。code
从服务器向主服务器发送PING命令,经过判断响应是否为PONG或者有没超时,以检查套接字链接是否正常和主服务器可否正常处理命令请求。blog
身份验证。主服务器的requirepass选项和从服务器的masterauth选项用于身份验证,必须同时设置或者同时去除,才能让身份验证经过(或者不进行身份证验证)。队列
发送端口信息。文档
从服务器经过字符串
REPLCONF listening-port 从服务器端口
命令向主服务器发送本身的监听端口号。主服务器收到命令后会将信息进行存储,用于后续INFO replication命令的输出。
执行同步。
从服务器向主服务器发送同步命令,复制主服务器上的数据使之保持一致。
命令传播。
同步完成后,主服务器会一直将本身执行的写命令发送给从服务器以保持同步。在这个过程,从节点会以每秒一次的频率,向主节点发起心跳检测,以保证链接的正常。
Redis的复制分为同步和命令传播两个操做:
同步操做使用SYNC或者PSYNC命令将从服务器的数据库状态更新至主服务器当前所处的数据库状态。
命令传播操做用于在主服务器的数据库状态被修改,致使主从服务器的数据库状态出现不一致时,主服务器会将该命令发送给从服务器执行,使主从服务器保持一致状态。
SYNC命令会触发全量同步,执行步骤包括:
从服务器向主服务器发送SYN命令
主服务器收到命令后执行BGSAVE命令,并将以后的写命令记录到一个缓冲区中。
主服务器会将生成的RDB文件传给从服务器,从服务器接收到文件后会清空本身的本地的数据,而后载入该RDB文件。
主服务器将缓冲区中的记录发送给从服务器。
SYNC命令的不足在于,从节点同主节点链接断开从新链接后若是距离上一次的同步时间不久,数据量不大的状况下也会执行全量同步,会影响性能。为了处理这种状况,Redis 2.8后的版本提供PSYNC命令。
PSYNC命令分为增量同步和全量同步两种状况。全量同步用于初次复制的状况,对于断线重连后的状况,主节点会判断是否知足条件,若是知足则会执行增量同步,不然使用全量同步,这个条件依赖于PSYNC命令的实现,包括:
主从节点的复制偏移量
主节点的复制积压缓冲区
服务器的运行ID。
复制偏移量:主节点在向从节点传播N个字节的数据时,会将本身的复制偏移量加N;从节点收到数据后,也会更新本身的复制偏移量,该值能够用于判断主从节点是否状态一致。
复制积压缓冲区:固定长度的先进先出队列,存储着偏移量和字节值的关系。主节点在进行命令传播时,将命令发送给从节点后,会同时将其写入复制积压缓冲区中。当断线重连后,若是从节点上送的复制偏移量还存在队列中,则执行增量同步,将缓冲区中,复制偏移量后的字节传播给从节点,不然将执行全量同步。
服务器运行ID:长度40的16进制字符串,由Redis服务器在启动后自动分配。主从节点创建链接后会互换ID,在断线重连后,从节点可使用ID来判断新链接上的主节点是否同上次的一致,若是不是直接执行全量同步,不然尝试使用增量同步。
PSYNC的执行步骤以下:
关于过时键的复制,持久化对复制的影响,以及4.0后提供的从节点到从节点的复制等,能够参考官方的文档。
我的公众号:啊驼