1.介绍

redis的高可用性主要体现在两部分,分别是数据少丢失与服务尽量少中断。

其中数据少丢失可以通过RDB与AOF日志实现,服务少中断可以通过redis的主从实现。本文介绍redis主从同步过程中的实现

2.redis主从实现

假设目前有三台redis实例,分别是172.16.19.3,172.16.19.4,172.16.19.5 。使用172.16.19.3作为主实例。登录到172.16.19.4,172.16.19.5中分别输入如下命令建立主从关系。关系确定之后,首先会进行一次全量复制,将主实例中的数据复制到两台从机

replicaof  172.16.19.3  6379

 

3.redis主从数据复制过程

java redis两台 高可用 两台redis互为主从_redis

 

 

 

主从同步过程分为两种类型,1:首次接入的全量同步,2:后续的增量同步

3.1全量同步

1、第一次使用replicaof命令建立同步,从实例向主实例发送同步命令psync {runid} {offset}

redis实例启动后每次都会生成一个唯一的runid。第一次同步时,从实例不知道主实例的runid,使用?代替,offset为-1表示第一次同步

2、主实例回送FULLRESYNC {runid} {offset} 命令,FULLRESYNC 表示全量复制,runid代表当前主实例的runid,offset表示当期主实例的复制进度。从实例更新自己的slave_repl_offset为master_repl_offset。

3、主实例使用bgsave生成rdb快照,生成快照期间到达的修改操作记录到replication_buffer和repl_backlog_buffer中。将rdb同步到从实例

4、主实例后的修改命令通过replication_buffer发送到从实例,从实例通过replication_buffer中的操作更新数据

3.2增量同步

主从实例完成全量同步后,后续的同步为增量同步。

增量同步将全量同步后主实例接受到的修改操作同步给从实例,完成数据同步,避免全量同步导致的性能消耗

增量同步需要分为两种情况,1:未断连,2:断连

3.2.1未断连

增量同步的流程可见上述图。

replication_buffer:主实例会为每一个从实例(客户端)建立一个replication_buffer,主实例通过replication_buffer同步数据到从实例(客户端)

repl_backlog_buffer:主实例中维护一个环形,记录修改操作,同时会有一个master_repl_offset表示主实例修改操作的偏移量,后续断连重新连接后判断是增量同步还是全量同步。

1、主实例接收到修改操作,同步到replication_buffer和repl_backlog_buffer,repl_backlog_buffer中没记录一条自增master_repl_offset。

2、主实例将replication_buffer中的操作同步到从实例

3.从实例接收主实例的同步信息,更新数据,同时修改slaver_repl_offset

4、同步过程是一个长连接

3.2.2断连

主从实例在同步过程中由于网络或者其他原因,导致连接中断,一段时间后从实例于主实例建立连接。该情况下主从实例同步流程如下。

java redis两台 高可用 两台redis互为主从_redis_02

 

 

1、断连后,主从实例进行通信的replication_buffer关闭。主实例将修改操作同步到repl_backlog_buffer,更新master_repl_offset

2、连接重新建立后,从实例发送 psync master_runid slaver_repl_offset到主实例

3、主实例根据slaver_repl_offset到repl_backlog_buffer中查找是否有对应记录,有的话则将slaver_repl_offset与master_repl_offset之间的记录同步到从实例完成数据同步。如果不存在则进行全量同步