redis通过AOF和RDB完成了对数据可靠性的保障,也提供主从库模式应对服务高可用的需求。整体如图所示:
读操作,主从库都可以接收客户端请求。写操作只有主库能够执行,然后将写操作同步给从库。
1、主从库数据如何同步
a、通过命令:replicaof(Redis 5.0之前使用slaveof)形成主库和从库的关系。过程如图所示:
在实例:172.16.19.5上执行命令 replicaof 172.16.19.3 6379 会将该实例变成主实例的从库。让后经过三个阶段完成第一次同步。
b、第一阶段:主从库之间创建链接,协商同步过程:从库给主库发送psync命令,表示进行数据同步,主库开始启动复制;命令示例:psync ? -1 runID:redis实例唯一随机ID,第一次复制不清楚主库runID,设为?,offset:复制进度,-1表示第一次复制。
主库收到命令使用FULLRESYNC runID offset 返回给从库,从库会记录这两个参数。
c、第二阶段,主库将所有数据同步给从库,从库收到数据后在本地完成数据加载。主库执行bgsave命令后,生成RDB文件,并将文件发送给从库,从库接收到数据后会清空当前数据库,并加载RDB文件,在这个过程中,主库并不会阻塞,会将写操作记录到replication buffer中,主库完成RDB文件的发送之后,就会将replication buffer中的数据发送给从库。
2、主-从级联模式
当从库过多的时候,主库就会频繁fork子进程,会导致主库响应熟读变慢,所以就是用主-从-从模式将生成RDB和传输RDB的压力分散到从库上。整体结构如图所示:
具体操作:手动选择一个从库做为级联用的从库,选择其余的从库执行命令:
replicaof 级联从库ip 6379
建立主从关系。并且主从库完成全量复制后,会维持一个长连接,避免建立链接的开销。
3、增量复制
网络中断问题是不可避免的,redis考虑到这种异常情况,处理方式在2.8之前使用全量复制,2.8之后使用增量复制。具体的增量复制过程如下:
a、网络中断之后,主库会将链接中断期间的写操作,写入到replication_buffer,同时会在repl_blacklog_buffer中写入一份,该缓冲区是环形区域,主库会记录自己写的位置,从库会记录读到的位置,主库和从库起点相同,主库写操作会偏离起始位置,从库复制主库写操作也会偏离起始位置。
b、网络恢复之后,从库会发送psync命令,并将自己保存的slave_repl_offset发送给主库,主库会判断自己的master_repl_offset和slave_repl_offset之间的距离,主库会将这之间的命令同步给从库。如图所示:
c、repl_bbacklog_size参数设置:因为该缓冲区是环形,所以如果读取速度不匹配,会导致一部分写操作被覆盖掉,导致数据不一致。该参数设置和缓冲空间大小有关,缓冲空间=主库写入命令速度操作大小-主从库网络传输熟读操作大小。repl_backlog_size = 缓冲空间*2.