前言
为了提高Redis的可靠性提供了主从复制、集群的方案
主从复制
概念
主从之间提供异步复制的方式,将主库中的数据在存储之后再同步到从库
配置
只需要从库添加该配置,主库会自动识别从库。
#example replicaof 192.168.1.1 6379
replicaof <master ip> <master port>
如果不添加配置 启动时使用命令:redis-server replicaof 192.168.1.1 6379
亦可。
同步流程
- 全量数据同步
- 增量数据同步
- 服务器RUN ID
每个redis都有自己的RUN ID,启动时由40个随机的十六进制字符生成;- 当从库对主库初次复制时,主库将自身的runid传送给从库,从库会将runid保存;
- 当从库断线重连主库时,从库将向主库发送之前保存的RUN ID;
- 从库RUN ID和主库RUN ID一致,说明从库断线前复制的就是当前主库;主库尝试执行增量同步;
- 若不一致,说明从库断线前复制的主库并不时当前的主库,则主库将对从库执行全量同步操作;
- 复制偏移量 offset
主从都会维护一个复制偏移量,通过比较offset得知主从之间数据是否一致;偏移量相同则数据一致;偏移量不同则数据不一致;- 主库向从库发送N个字节的数据时,将自己的复制偏移量上加N;
- 从库接收到主库发送的N个字节数据时,将自己的复制偏移量加上N;
- 环形缓冲区
固定长度的先进先出队列- 从库与主库断开连接,避免重新连接后开始全量同步,在主库设置了一个环形缓冲区;该缓冲区会在从库失联期间累计主库的写操作;当从库重连,会发送自身的复制偏移量到主库,主库会比较主从的复制偏移量:
- 若从库offset还在复制积压缓冲区中,则进行增量同步;
- 否则,主库将对从库执行全量同步;
- 配置(主库)
- 从库与主库断开连接,避免重新连接后开始全量同步,在主库设置了一个环形缓冲区;该缓冲区会在从库失联期间累计主库的写操作;当从库重连,会发送自身的复制偏移量到主库,主库会比较主从的复制偏移量:
#redis.conf
repl-backlog-szie 1mb
# 断开连接时间超过3600 则释放缓冲
repl-backlog-ttl 3600
- 判断流程图