Redis 的主从复制模式下,一旦主节点由于故障不能提供服务,需要人工将从节点晋升为主节点,同时还要通知应用方更新主节点地址,对于很多应用场景这种故障处理的方式是无法接受的。Redis 从 2.8 版本开始正式提供了 Redis Sentinel(哨兵)架构来解决这个问题。
基本概念
主从复制的问题
Redis 的主从复制模式可以将主节点的数据改变同步给从节点,这样从节点就可以起到两个作用:第一,作为主节点的一个备份,一旦主节点出了故障不可达的情况,从节点可以作为后备“顶”上来,并且保证数据尽量不丢失(主从复制是最终一致性)。第二,从节点可以扩展主节点的读能力,一旦主节点不能支撑住大并发量的读操作,从节点可以在一定程度上帮助主节点分担读压力。
但是主从复制也带来了以下问题:
- 一旦主节点出现故障,需要手动将一个从节点晋升为主节点,同时需要修改应用方的主节点地址,还需要命令其他从节点去复制新的主节点,整个过程都需要人工干预。
- 主节点的写能力受到单机的限制。
- 主节点的存储能力受到单机的限制。
其中第一个问题就是 Redis 的高可用问题,第二、三个问题属于 Redis 的分布式问题,会在“集群”里面介绍。
高可用
Redis 主从复制模式下,一旦主节点出现了故障不可达,需要人工干预进行故障转移,无论对于 Redis 的应用方还是运维方都带来了很大的不便。对于应用方来说无法及时感知到主节点的变化,必然会造成一定的写数据丢失和读数据错误,甚至可能造成应用方服务不可用。对于 Redis 的运维方来说,整个故障转移的过程是需要人工来介入的,故障转移实时性和准确性上都无法得到保障。
考虑到这点,有些公司把故障转移流程自动化了,但是仍然存在如下问题:第一,判断节点不可达的机制是否健全和标准。第二,如果有多个从节点,怎样保证只有一个被晋升为主节点。第三,通知客户端新的主节点机制是否足够健壮。Redis Sentinel 正是用于解决这些问题。
Redis Sentinel 的高可用性
Redis Sentinel 是一个分布式架构,其中包含若干个 Sentinel 节点和 Redis 数据节点,每个 Sentinel 节点会对数据节点和其余 Sentinel 节点进行监控,当它发现节点不可达时,会对节点做下线标识。如果被标识的是主节点,它还会和其他 Sentinel 节点进行“协商”,当大多数 Sentinel 节点都认为主节点不可达时,它们会选举出一个 Sentinel 节点来完成自动故障转移的工作,同时会将这个变化实时通知给 Redis 应用方。整个过程完全是自动的,不需要人工来介入,所以这套方案很有效地解决了 Redis 的高可用问题。
从逻辑架构上看,Sentinel 节点集合会定期对所有节点进行监控,特别是对主节点的故障实现自动转移。下面以 1 个主节点、2 个从节点、3 个 Sentinel 节点组成的 Redis Sentinel 为例子进行说明,拓扑结构如图所示。
整个故障转移的处理逻辑有下面 4 个步骤:
- 主节点出现故障,此时两个从节点与主节点失去连接,主从复制失败。
- 每个 Sentinel 节点通过定期监控发现主节点出现了故障。
- 多个 Sentinel 节点对主节点的故障达成一致,选举出 sentinel-3 节点作为领导者负责故障转移。
- Sentinel 领导者节点执行了故障转移,整个过程是自动化完成的。
通过上面介绍的 Redis Sentinel 逻辑架构以及故障转移的处理,可以看出 Redis Sentinel 具有以下几个功能:
- 监控:Sentinel 节点会定期检测 Redis 数据节点、其余 Sentinel 节点是否可达。
- 通知:Sentinel 节点会将故障转移的结果通知给应用方。
- 主节点故障转移:实现从节点晋升为主节点并维护后续正确的主从关系。
- 配置提供者:在 Redis Sentinel 结构中,客户端在初始化的时候连接的是 Sentinel 节点集合,从中获取主节点信息。
同时看到,Redis Sentinel 包含了若个 Sentinel 节点,这样做也带来了两个好处:
- 对于节点的故障判断是由多个 Sentinel 节点共同完成,这样可以有效地防止误判。
- Sentinel 节点集合是由若干个 Sentinel 节点组成的,这样即使个别 Sentinel 节点不可用,整个 Sentinel 节点集合依然是健壮的。
Sentinel 节点本身就是独立的 Redis 节点,只不过它们有一些特殊,它们不存储数据,只支持部分命令。
安装和部署
下面将以 3 个 Sentinel 节点、1 个主节点、2 个从节点组成一个 Redis Sentinel 进行说明。
部署流程
Redis Sentinel 中 Redis 数据节点没有做任何特殊配置,按照常规方法启动就可以。3 个 Sentinel 节点的部署方法是完全一致的(端口不同),下面以 sentinel-1 节点的部署为例子进行说明。
配置 Sentinel 节点
// redis-sentinel-26379.conf
port 26379
daemonize yes
logfile "26379.log"
dir /opt/soft/redis/data
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
Sentinel 节点的默认端口是 26379,sentinel monitor mymaster 127.0.0.1 6379 2 配置代表 sentinel-1 节点需要监控 127.0.0.1:6379 这个主节点,2 代表判断主节点失败至少需要 2 个 Sentinel 节点同意,mymaster 是主节点的别名,其余 Sentinel 配置将在以后进行详细说明。
启动 Sentinel 节点
Sentinel 节点的启动方法有两种:
1.使用 redis-sentinel 命令:
redis-sentinel redis-sentinel-26379.conf
2.使用 redis-server 命令加 --sentinel 参数:
redis-server redis-sentinel-26379.conf --sentinel
两种方法本质上是一样的。
确认
Sentinel 节点本质上是一个特殊的 Redis 节点,所以也可以通过 info 命令来查询它的相关信息,从下面 info 的 Sentinel 片段来看,Sentinel 节点找到了主节点 127.0.0.1:6379,发现了它的两个从节点,同时发现 Redis Sentinel 一共有 3 个 Sentinel 节点。这里只需要了解 Sentinel 节点能够彼此感知到对方,同时能够感知到 Redis 数据节点就可以了:
$ redis-cli -h 127.0.0.1 -p 26379 info Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
master0:name=mymaster,status=ok,address=127.0.0.1:6379,slaves=2,sentinels=3
当三个 Sentinel 节点都启动后,整个拓扑结构如图所示。至此 Redis Sentinel 已经搭建起来了,整体上还是比较容易的,但是有两点需要强调一下:
- 生产环境中建议 Redis Sentinel 的所有节点应该分布在不同的物理机上。
- Redis Sentinel 中的数据节点和普通的 Redis 数据节点在配置上没有任何区别,只不过是添加了一些 Sentinel 节点对它们进行监控。
配置优化
Redis 安装目录下有一个 sentinel.conf,是默认的 Sentinel 节点配置文件,下面就以它作为例子进行说明。
port 26379
dir /opt/soft/redis/data
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel auth-pass <master-name> <password>
sentinel notification-script <master-name> <script-path>
sentinel client-reconfig-script <master-name> <script-path>
sentinel monitor
sentinel monitor <master-name> <ip> <port> <quorum>
本配置说明 Sentinel 节点要监控的是一个名字叫做 <master-name>,ip 地址和端口为 <ip><port> 的主节点。<quorum> 代表要判定主节点最终不可达所需要的票数。但实际上 Sentinel 节点会对所有节点进行监控,但是在 Sentinel 节点的配置中没有看到有关从节点和其余 Sentinel 节点的配置,那是因为 Sentinel 节点会从主节点中获取有关从节点以及其余 Sentinel 节点的相关信息。
<quorum> 参数用于故障发现和判定,例如将 quorum 配置为 2,代表至少有 2 个 Sentinel 节点认为主节点不可达,那么这个不可达的判定才是客观的。对于 <quorum> 设置的越小,那么达到下线的条件越宽松,反之越严格。一般建议将其设置为 Sentinel 节点的一半加 1。同时 <quorum> 还与 Sentinel 节点的领导者选举有关,至少要有 max(quorum,num(sentinels)/ 2 + 1)个 Sentinel 节点参与选举,才能选出领导者 Sentinel,从而完成故障转移。例如有 5 个 Sentinel 节点,quorum = 4,那么至少要有 max(quorum,num(sentinels)/ 2 + 1)= 4 个在线 Sentinel 节点才可以进行领导者选举。
sentinel down-after-milliseconds
sentinel down-after-milliseconds <master-name> <times>
每个 Sentinel 节点都要通过定期发送 ping 命令来判断 Redis 数据节点和其余 Sentinel 节点是否可达,如果超过了 down-after-milliseconds 配置的时间且没有有效的回复,则判定节点不可达,<times>(单位为毫秒)就是超时时间。这个配置是对节点失败判定的重要依据。
down-after-milliseconds 越大,代表 Sentinel 节点对于节点不可达的条件越宽松,反之越严格。条件宽松有可能带来的问题是节点确实不可达了,那么应用方需要等待故障转移的时间越长,也就意味着应用方故障时间可能越长。条件严格虽然可以及时发现故障完成故障转移,但是也存在一定的误判率。
down-after-milliseconds 虽然以 <master-name> 为参数,但实际上对 Sentinel 节点、主节点、从节点的失败判定同时有效。
sentinel parallel-syncs
sentinel parallel-syncs <master-name> <nums>
当 Sentinel 节点集合对主节点故障判定达成一致时,Sentinel 领导者节点会做故障转移操作,选出新的主节点,原来的从节点会向新的主节点发起复制操作,parallel-syncs 就是用来限制在一次故障转移之后,每次向新的主节点发起复制操作的从节点个数。如果这个参数配置的比较大,那么多个从节点会向新的主节点同时发起复制操作,尽管复制操作通常不会阻塞主节点,但是同时向主节点发起复制,必然会对主节点所在的机器造成一定的网络和磁盘 IO 开销。
sentinel failover-timeout
sentinel failover-timeout <master-name> <times>
failover-timeout 通常被解释成故障转移超时时间,但实际上它作用于故障转移的各个阶段:
- 选出合适从节点。
- 晋升选出的从节点为主节点。
- 命令其余从节点复制新的主节点。
- 等待原主节点恢复后命令它去复制新的主节点。
failover-timeout 的作用具体体现在四个方面:
- 如果 Redis Sentinel 对一个主节点故障转移失败,那么下次再对该主节点做故障转移的起始时间是 failover-timeout 的 2 倍。
- 在 2 阶段时,如果 Sentinel 节点向 1 阶段选出来的从节点执行 slaveof no one 一直失败(例如该从节点此时出现故障),当此过程超过 failover-timeout 时,则故障转移失败。
- 在 2 阶段如果执行成功,Sentinel 节点还会执行 info 命令来确认 1 阶段选出来的节点确实晋升为主节点,如果此过程执行时间超过 failover-timeout 时,则故障转移失败。
- 如果 3 阶段执行时间超过了 failover-timeout(不包含复制时间),则故障转移失败。注意即使超过了这个时间,Sentinel 节点也会最终配置从节点去同步最新的主节点,不过就不会按 parallel-syncs 所配置的规则来进行同步了。
sentinel auth-pass
sentinel auth-pass <master-name> <password>
如果 Sentinel 监控的主节点配置了密码,sentinel auth-pass 配置通过添加主节点的密码,防止 Sentinel 节点对主节点无法监控。
sentinel notification-script
sentinel notification-script <master-name> <script-path>
sentinel notification-script 的作用是在故障转移期间,当一些警告级别的 Sentinel 事件发生(指重要事件,例如 -sdown:客观下线、-odown:主观下线)时,会触发对应路径的脚本,并向脚本发送相应的事件参数。
sentinel client-reconfig-script
sentinel client-reconfig-script <master-name> <script-path>
sentinel client-reconfig-script 的作用是在故障转移结束后,会触发对应路径的脚本,并向脚本发送故障转移结果的相关参数。当故障转移结束,每个 Sentinel 节点会将故障转移的结果发送给对应的脚本,具体参数如下:
<master-name> <role> <state> <from-ip> <from-port> <to-ip> <to-port>
- <master-name>:主节点名。
- <role>:Sentinel 节点的角色,分别是 leader 和 observer,leader 代表当前 Sentinel 节点是领导者,是它进行的故障转移;observer 是其余 Sentinel 节点。
- <from-ip>:原主节点的 ip 地址。
- <from-port>:原主节点的端口。
- <to-ip>:新主节点的 ip 地址。
- <to-port>:新主节点的端口。
有关 sentinel notification-script 和 sentinel client-reconfig-script 有几点需要注意:
- <script-path> 必须有可执行权限。
- <script-path> 开头必须包含 shell 脚本头(例如#!/bin/sh),否则事件发生时 Redis 将无法执行脚本产生错误。
- Redis 规定脚本的最大执行时间不能超过 60 秒,超过后脚本将被杀掉。
- 如果 shell 脚本以 exit 1 结束,那么脚本稍后重试执行。如果以 exit 2 或者更高的值结束,那么脚本不会重试。正常返回值是 exit 0。
- 如果需要运维的 Redis Sentinel 比较多,建议不要使用这种脚本的形式来进行通知,这样会增加部署的成本。
监控多个主节点
Redis Sentinel 可以同时监控多个主节点,配置方法也比较简单,只需要指定多个 masterName 来区分不同的主节点即可,例如下面的配置监控 monitor master-business-1(10.10.xx.1:6379)和 monitor master-business-2(10.10.xx.2:6379)两个主节点:
sentinel monitor master-business-1 10.10.xx.1 6379 2
sentinel down-after-milliseconds master-business-1 60000
sentinel failover-timeout master-business-1 180000
sentinel parallel-syncs master-business-1 1
sentinel monitor master-business-2 10.16.xx.2 6380 2
sentinel down-after-milliseconds master-business-2 10000
sentinel failover-timeout master-business-2 180000
sentinel parallel-syncs master-business-2 1
调整配置
和普通的 Redis 数据节点一样,Sentinel 节点也支持动态地设置参数,而且和普通的 Redis 数据节点一样并不是支持所有的参数,具体使用方法为:
sentinel set <param> <value>
支持的参数如下:
有几点需要注意一下:
- sentinel set 命令只对当前 Sentinel 节点有效。
- sentinel set 命令如果执行成功会立即刷新配置文件,这点和 Redis 普通数据节点设置配置需要执行 config rewrite 刷新到配置文件不同。
- 建议所有 Sentinel 节点的配置尽可能一致,这样在故障发现和转移时比较容易达成一致。
- Sentinel 对外不支持 config 命令。
部署技巧
Sentinel 节点不应该部署在一台物理“机器”上
这里特意强调物理机是因为一台物理机做成了若干虚拟机或者现今比较流行的容器,它们虽然有不同的 IP 地址,但实际上它们都是同一台物理机,同一台物理机意味着如果这台机器有什么硬件故障,所有的虚拟机都会受到影响,为了实现 Sentinel 节点集合真正的高可用,请勿将 Sentinel 节点部署在同一台物理机器上。
部署至少三个且奇数个的 Sentinel 节点
3 个以上是通过增加 Sentinel 节点的个数提高对于故障判定的准确性,因为领导者选举需要至少一半加 1 个节点,奇数个节点可以在满足该条件的基础上节省一个节点。
只配置一套 Sentinel,还是每个主节点配置一套 Sentinel?
Sentinel 节点集合可以只监控一个主节点,也可以监控多个主节点,那么在实际生产环境中更偏向于哪一种部署方式呢,下面分别分析两种方案的优缺点。
方案一:一套 Sentinel,很明显这种方案在一定程度上降低了维护成本,因为只需要维护固定个数的 Sentinel 节点,集中对多个 Redis 数据节点进行管理就可以了。但是这同时也是它的缺点,如果这套 Sentinel 节点集合出现异常,可能会对多个 Redis 数据节点造成影响。还有如果监控的 Redis 数据节点较多,会造成 Sentinel 节点产生过多的网络连接,也会有一定的影响。
方案二:多套 Sentinel,显然这种方案的优点和缺点和上面是相反的,每个 Redis 主节点都有自己的 Sentinel 节点集合,会造成资源浪费。但是优点也很明显,每套 Redis Sentinel 都是彼此隔离的。
如果 Sentinel 节点集合监控的是同一个业务的多个主节点集合,那么使用方案一、否则一般建议采用方案二。
API
以下图进行说明:Sentinel 节点集合监控着两组主从模式的 Redis 数据节点。
sentinel master
展示所有被监控的主节点状态以及相关的统计信息。
sentinel master <master name>
展示指定 <master name> 的主节点状态以及相关的统计信息。
sentinel slaves <master name>
展示指定 <master name> 的从节点状态以及相关的统计信息。
sentinel sentinels <master name>
展示指定 <master name> 的 Sentinel 节点集合(不包含当前 Sentinel 节点)。
sentinel get-master-addr-by-name <master name>
返回指定 <master name> 主节点的 IP 地址和端口。
sentinel reset <pattern>
当前 Sentinel 节点对符合 <pattern>(通配符风格)主节点的配置进行重置,包含清除主节点的相关状态(例如故障转移),重新发现从节点和 Sentinel 节点。
sentinel failover <master name>
对指定 <master name> 主节点进行强制故障转移(没有和其他 Sentinel 节点“协商”),当故障转移完成后,其他 Sentinel 节点按照故障转移的结果更新自身配置。
sentinel ckquorum <master name>
检测当前可达的 Sentinel 节点总数是否达到 <quorum> 的个数。例如 quorum = 3,而当前可达的 Sentinel 节点个数为 2 个,那么将无法进行故障转移,Redis Sentinel 的高可用特性也将失去。
sentinel flushconfig
将 Sentinel 节点的配置强制刷到磁盘上,这个命令 Sentinel 节点自身用得比较多,对于开发和运维人员只有当外部原因(例如磁盘损坏)造成配置文件损坏或者丢失时,这个命令是很有用的。
sentinel remove <master name>
取消当前 Sentinel 节点对于指定 <master name> 主节点的监控,这个命令仅仅对当前 Sentinel 节点有效。
sentinel monitor <master name> <ip> <port> <quorum>
这个命令和配置文件中的含义是完全一样的,只不过是通过命令的形式来完成 Sentinel 节点对主节点的监控。
sentinel is-master-down-by-addr
Sentinel 节点之间用来交换对主节点是否下线的判断,根据参数的不同,还可以作为 Sentinel 领导者选举的通信方式。
客户端连接
Redis Sentinel 客户端基本实现原理
实现一个 Redis Sentinel 客户端的基本步骤如下:
1)遍历Sentinel节点集合获取一个可用的Sentinel节点,后面会介绍Sentinel节点之间可以共享数据,所以从任意一个Sentinel节点获取主节点信息都是可以的。
2)通过sentinel get-master-addr-by-name master-name这个API来获取对应主节点的相关信息。
3)验证当前获取的“主节点”是真正的主节点,这样做的目的是为了防止故障转移期间主节点的变化。
4)保持和Sentinel节点集合的“联系”,时刻获取关于主节点的相关“信息”。
从上面的模型可以看出,Redis Sentinel客户端只有在初始化和切换主节点时需要和Sentinel节点集合进行交互来获取主节点信息,所以在设计客户端时需要将Sentinel节点集合考虑成配置(相关节点信息和变化)发现服务。
实现原理
三个定时监控任务
一套合理的监控机制是Sentinel节点判定节点不可达的重要保证,Redis Sentinel通过三个定时监控任务完成对各个节点发现和监控:
1)每隔10秒,每个Sentinel节点会向主节点和从节点发送info命令获取最新的拓扑结构。
这个定时任务的作用具体可以表现在三个方面:
- 通过向主节点执行info命令,获取从节点的信息,这也是为什么Sentinel节点不需要显式配置监控从节点。
- 当有新的从节点加入时都可以立刻感知出来。
- 节点不可达或者故障转移后,可以通过info命令实时更新节点拓扑信息。
2)每隔2秒,每个Sentinel节点会向Redis数据节点的sentinel:hello频道上发送该Sentinel节点对于主节点的判断以及当前Sentinel节点的信息,同时每个Sentinel节点也会订阅该频道,来了解其他Sentinel节点以及它们对主节点的判断。
这个定时任务可以完成以下两个工作:
- 发现新的Sentinel节点:通过订阅主节点的__sentinel__:hello了解其他的Sentinel节点信息,如果是新加入的Sentinel节点,将该Sentinel节点信息保存起来,并与该Sentinel节点创建连接。
- Sentinel节点之间交换主节点的状态,作为后面客观下线以及领导者选举的依据。
3)每隔1秒,每个Sentinel节点会向主节点、从节点、其余Sentinel节点发送一条ping命令做一次心跳检测,来确认这些节点当前是否可达。
通过上面的定时任务,Sentinel节点对主节点、从节点、其余Sentinel节点都建立起连接,实现了对每个节点的监控,这个定时任务是节点失败判定的重要依据。
主观下线和客观下线
主观下线
每个Sentinel节点会每隔1秒对主节点、从节点、其他Sentinel节点发送ping命令做心跳检测,当这些节点超过down-after-milliseconds没有进行有效回复,Sentinel节点就会对该节点做失败判定,这个行为叫做主观下线。
客观下线
当Sentinel主观下线的节点是主节点时,该Sentinel节点会通过sentinel is-master-down-by-addr命令向其他Sentinel节点询问对主节点的判断,当超过<quorum>个数,Sentinel节点认为主节点确实有问题,这时该Sentinel节点会做出客观下线的决定,这样客观下线的含义是比较明显了,也就是大部分Sentinel节点都对主节点的下线做了同意的判定,那么这个判定就是客观的。
领导者Sentinel节点选举
假如Sentinel节点对于主节点已经做了客观下线,那么是不是就可以立即进行故障转移了?当然不是,实际上故障转移的工作只需要一个Sentinel
节点来完成即可,所以Sentinel节点之间会做一个领导者选举的工作,选出一个Sentinel节点作为领导者进行故障转移的工作。Redis使用了Raft算法实现领导者选举,因为Raft算法相对比较抽象和复杂,以及篇幅所限,所以这里给出一个Redis Sentinel进行领导者选举的大致思路:
- 每个在线的Sentinel节点都有资格成为领导者,当它确认主节点主观下线时候,会向其他Sentinel节点发送sentinel is-master-down-by-addr命令,要求将自己设置为领导者。
- 收到命令的Sentinel节点,如果没有同意过其他Sentinel节点的sentinel is-master-down-by-addr命令,将同意该请求,否则拒绝。
- 如果该Sentinel节点发现自己的票数已经大于等于max(quorum,num(sentinels)/2+1),那么它将成为领导者。
- 如果此过程没有选举出领导者,将进入下一次选举。
故障转移
领导者选举出的Sentinel节点负责故障转移,具体步骤如下:
1)在从节点列表中选出一个节点作为新的主节点,选择方法如下:
- 过滤:“不健康”(主观下线、断线)、5秒内没有回复过Sentinel节点ping响应、与主节点失联超过down-after-milliseconds*10秒。
- 选择slave-priority(从节点优先级)最高的从节点列表,如果存在则返回,不存在则继续。
- 选择复制偏移量最大的从节点(复制的最完整),如果存在则返回,不存在则继续。
- 选择runid最小的从节点。
2)Sentinel领导者节点会对第一步选出来的从节点执行slaveof no one命令让其成为主节点。
3)Sentinel领导者节点会向剩余的从节点发送命令,让它们成为新主节点的从节点,复制规则和parallel-syncs参数有关。
4)Sentinel节点集合会将原来的主节点更新为从节点,并保持着对其关注,当其恢复后命令它去复制新的主节点。
开发与运维中的问题
节点运维
节点下线
如果需要对主节点进行下线,比较合理的做法是选出一个“合适”(例如性能更高的机器)的从节点,使用sentinel failover功能将从节点晋升主节点。
Redis Sentinel存在多个从节点时,如果想将指定从节点晋升为主节点,可以将其他从节点的slavepriority配置为0,但是需要注意failove后,将slave-priority调回原值。
如果需要对从节点或者Sentinel节点进行下线,只需要确定好是临时还是永久下线后执行相应操作即可。如果使用了读写分离,下线从节点需要保证应用方可以感知从节点的下线变化,从而把读取请求路由到其他节点。
需要注意的是,Sentinel节点依然会对这些下线节点进行定期监控,这是由Redis Sentinel的设计思路所决定的。
节点上线
从节点:添加slaveof{masterIp}{masterPort}的配置,使用redis-server启动即可,它将被Sentinel节点自动发现。
sentinel节点:添加sentinel monitor主节点的配置,使用redis-sentinel启动即可,它将被其余Sentinel节点自动发现。
高可用读写分离
在一般的Redis Sentinel读写分离的模型中,从节点不是高可用的,如果slave节点出现故障,首先客户端将与其失联,其次Sentinel节点只会对该节点做主观下线,因为Redis Sentinel的故障转移是针对主节点的。所以很多时候,Redis Sentinel中的从节点仅仅是作为主节点一个热备,不让它参与客户端的读操作,就是为了保证整体高可用性,但实际上这种使用方法还是有一些浪费,尤其是在有很多从节点或者确实需要读写分离的场景,所以如何实现从节点的高可用是非常有必要的。
Redis Sentinel在对各个节点的监控中,如果有对应事件的发生,都会发
出相应的事件消息,其中和从节点变动的事件有以下几个:
- +switch-master:切换主节点(原来的从节点晋升为主节点),说明减少了某个从节点。
- +convert-to-slave:切换从节点(原来的主节点降级为从节点),说明添加了某个从节点。
- +sdown:主观下线,说明可能某个从节点可能不可用(因为对从节点不会做客观下线),所以在实现客户端时可以采用自身策略来实现类似主观下线的功能。
- +reboot:重新启动了某个节点,如果它的角色是slave,那么说明添加了某个从节点。
所以在设计Redis Sentinel的从节点高可用时,只要能够实时掌握所有从
节点的状态,把所有从节点看做一个资源池,无论是上线还是下线从节点,客户端都能及时感知到(将其从资源池中添加或者删除),这样从节点的高可用目标就达到了。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。