Redis高可用
一、主从复制
主从复制模式可以保证redis集群时的数据一致性,且主从服务器之间采用读写分离的方式。
- 主服务器:读写操作
- 从服务器:只读,接受主服务器同步的写操作命令
同步
主从服务器之间数据是如何同步的呢?首先,要配置服务器之间的主从关系,通过在服务B上执行一下命令,服务器B就成为了A的一个从服务,并进行第一次同步。
replicaof <服务器 A 的 IP 地址> <服务器 A 的 Redis 端口号>
第一次同步
主要有三个阶段:
- 第一阶段是建立链接、协商同步;
- 第二阶段是主服务器同步数据给从服务器(全量)
- 第三阶段是主服务器发送新写操作命令给从服务器(增量)
下面我们简单介绍一下各个阶段的主要操作以及含义
1.第一阶段
- psync ? -1:两个参数,第一个参数为主服务器的runID(?表示第一次,不知道主服务的runID),第二个参数表示复制进度(-1表示第一次)
- FULLRESYNC {runID} {offset}:表示全量复制,返回给从服务器主服务自己的runID,offset表示主服务器当前的复制进度
2.第二阶段
- bgsave生成rdb文件
tips:由于是通过rdb文件同步数据的,所以生成rdb文件的期间如果主服务器新写了数据,那第一次同步数据过后,主从服务器之间数据是不一致的。
3.第三阶段
- 发送replication buffer中的写操作命令:由于第二阶段中生成rdb文件的期间可能出现新的写操作,所以在第三阶段完成后,才真正使主从服务器数据一致
命令传播
基于长连接的命令传播,说人话就是在完成第一次同步后,主从服务器之间一直保持着TCP连接,当主服务器发生写操作后,会将写命令发送个从服务器,以此来维持后续的数据一致性。
增量复制
顾名思义,只复制新增部分的数据至从服务器。当主从服务器在第一次同步后一直维持着长连接,但是如果网络断开再恢复,主从服务器之间会发生什么呢?此时,就会发生增量复制。
前面在第一次同步的第一阶段,从服务器发送psync命令后,主服务器响应的是FULLRESYNC,而再恢复连接时,主服器对psync命令响应的的是CONTINUE,表示接下来是增量复制。
二、哨兵模式
为什么要有哨兵模式?
主从复制、读写分离的方式,导致所有的写操作都通过主服务器,倘若主服务器挂掉了,那集群就失去了写入数据的功能,所以在主服务挂掉的时候,需要自动将一个从服务器提升为主服务器,这就是哨兵模式。
哨兵
学过设计模式的同学肯定了解过观察者模式,哨兵其实就是一个观察者,其本质也是一个从节点。哨兵节点的主要职责如下
- 监控
- 选主
- 通知
先说监控:
哨兵节点会每隔一秒给所有主从节点发送ping,如果没有在规定时间内收到pong,则标记为主观下线的节点。
这个「规定的时间」是配置项 down-after-milliseconds
参数设定的,单位是毫秒。
但是仅通过一个哨兵来判断服务节点的状况是不安全的,因为可能哨兵节点本身网络出现了问题,所以需要哨兵集群,以此来减少误判。
哨兵集群的工作模式
如果一个集群中有一个哨兵发现主节点主观下线了,此时会通知其他哨兵节点去判断主节点是否主观下线,若一个集群中有一半以上的哨兵判断主节点主观下线了,则主节点被标记为客观下线。所以哨兵集群一般是奇数个。
主从故障转移
主要步骤如下:
- 在已下线旧主节点属下的所有从节点里,挑选一个从节点,并将其转换为主节点
- 让已下线主节点属下的所有从节点修改复制目标,修改为复制新主节点
- 将新主节点的IP地址和信息,通过发布订阅者机制通知给客户端
- 继续监视旧主节点,当这个旧主节点重新上线时,将它设置为新主节点的从节点
在剔除掉网络状况不好的从节点后,对于新的主节点的选取,会从如下三个方面去考虑
- 优先级
- 复制进度
- id号
转载自:https://juejin.cn/post/7388827547513208884