Redis单点配置的情况下如果服务出现故障宕机,那么服务也就处于不可用状态,假如是生产环境那么带来的后果会有很严重,所以出现了高可用方案:集群策略。
1.三种集群策略
Redis提供了三种集群策略,它们分别是:
- 主从复制(Replication)
- 哨兵(Sentinel)
- 集群(Cluster)
这三种策略会逐一学习,本篇主要学习策略之一主从复制(Replication)。
2.主从复制的概念
在主从复制(Replication)策略中,服务分为两类:Master节点、Slave节点。
特点
- Master节点可以拥有多个Slave节点,但Slave节点只能服务一个Master节点。
- 数据复制方向只能是Master节点->Slave节点。
优点
- 实现了多机热数据备份,提高了面对宕机数据恢复的灾备能力。
- 在主从复制的基础上实现读写分离提高服务吞吐量,即:Master节点提供写服务,Slave节点提供读服务。
- 如果Master节点宕机可以快速切换使用Slave节点提供服务。
- 缺点
- Master节点故障,无法自动切换Slave节点为新Master节点的问题。
- Master节点写操作的压力没有得到解决。
- 数据存储能力还是受到单节点限制。
3.如何配置(多种方式)
- 在Slave节点服务器redis.conf增加配置行,slaveof {MASTER_IP} {MASTER_PORT}。
- 启动redis-server时,./redis-server slaveof {MASTER_IP} {MASTER_PORT}。
- 在redis-cli命令行界面输入,slaveof {MASTER_IP} {MASTER_PORT}。
4.工作机制
- Slave节点执行slaveof命令,保存Master节点信息。
- 节点内部的定时任务发现主节点信息,开始尝试Socket连接主节点。
- 连接建立成功,Slave节点发送ping命令,期望得到pong命令响应,否则发起重连。
- 如果主节点有设置auth,那么进行auth验证,成功继续,失败终止。(非必须,根据Master节点是否配置auth决定)
- Slave节点同步Master节点全量数据集。(该操作是Master节点向Slave节点发送数据哟)
- Master节点持续把写命令同步Slave节点。
5.同步命令
Redis主从复制数据有两个命令,sync和psync,sync是Redis2.8版本之前的同步方法,psync是Redis2.8版本以后优化sync新设计同步方法。在这会着重学习psync,也会捎带说一下为什么sync会被优化。
首先,psync需要3个参数支持:
- Master节点和Slave节点复制数据的偏移量。
1
Master节点和Slave节点复制数据的偏移量,主要作用是通过对比复制偏移量,来判断Master节点和Slave节点数据是否一致。
- Master节点复制积压缓冲区。
1
psync的特性之一,用于增量数据复制和补救丢失的复制数据。
- Master节点的RunID(Replication ID)。
1
Redis服务启动的时,都会生成一个40位的唯一RunID。
Master节点和Slave节点复制数据的偏移量:每个参与复制数据的节点都会维护一份复制偏移量,Master节点在处理完写命令后,会把命令的字节长度进行累加,Slave节点每秒钟会向Master节点上报自己的复制偏移量,因此Master节点也会记录Slave节点的偏移量。Master节点持续把写命令同步Slave节点,Slave节点成功接收到之后也会累加自身的偏移量。查看偏移量:
1 | >info replication |
复制积压缓冲区:复制积压缓冲区是一个保存在Master节点拥有固定长度的队列,该队列先进先出,大小受repl-backlog-size参数控制(默认:1MB),查看缓冲区:
1 | >info replication |
Master节点的RunID(Replication ID):该ID主要是用来识别Redis服务节点,因为如果使用IP+PORT方式,假如Master节点重启之后修改了RDB/AOF备份文件,此时Slave节点再基于原来的复制偏移量进行复制数据是不可靠的。查看RunID:
1 | >info server |
psync命令使用方式
1 | psync {RUNID} {OFFSET} |
6.增量/全量复制
知道了命令如何使用,那么当Slave节点发送psync命令给Master节点之后会发生什么?流程分为全量复制和增量复制两种。
全量复制,如果Slave节点发送的命令是:psync ? -1
Master节点知道Slave节点要全量复制数据,返回命令则是:+fullresync {RUNID} {OFFSET},同时Master节点会执行RDB备份并且使用复制积压缓冲区来记录此后所有的写命令。Master节点 RDB备份完成之后向Slave节点发送备份文件,同时继续缓冲写命令,在备份文件发送完毕后Master节点会向Slave节点发送缓冲区的写命令。Slave节点在收到Master节点发送的备份文件之后,会丢弃所有的旧数据,开始载入备份文件并且开始执行Master节点发送缓冲区的写命令。
值得一提的是,在Slave节点加载备份文件的时候数据处于不可靠阶段,此时可以通过参数slave-server-stale-data(yes、no)配置是否响应请求,yes响应,no则抛出“SYNC with master in progress”。
如果备份从创建到传输完毕消耗时间大于repl-timeout参数的值,Slave节点将会放弃接收备份文件并且清理已经下载的临时文件。
增量复制,Master节点会根据{RUNID}和{OFFSET}决定返回结果。
Master节点首先会检查{RUNID}是否与自身一致,如果不一致将会执行全量数据复制。如果一致会根据{OFFSET}参数在缓冲区查找,如果数据偏移量之后的数据存在缓冲区,返回命令:+continue,表示可以增量复制数据。如果返回命令+err,表示Master节点版本过低不支持psync命令,将会使用sync进行全量复制数据。
最后
最后学习一下为什么sync会被优化?
使用sync命令,在网络或者其他不可抗力因素导致Master节点和Slave节点断开连接,需要重新进行一次全量数据复制,Slave节点数据恢复成本极高。