Redis集群-哨兵模式

1.前言

在上篇文章(Redis集群-主从复制)中,我们介绍了Redis集群的主从复制,也讲到主从复制的致命缺点就是,如果master节点宕机了,slave节点无法担任master节点来提供服务。因此,为了解决这个问题,哨兵模式应运而生。

2.哨兵模式

2.1 定义

在哨兵模式下,哨兵节点可以监控redis集群中master节点的工作状态,在master节点发生故障时,可以将slave节点切换为master节点,保证系统的高可用。

  • 哨兵节点的作用
    • 不断地监测master和slave节点是否正常运行
    • 当监测的某个节点出现异常时,向管理员发送通知
    • 自动故障转移。当多数的哨兵节点认为master节点宕机时,会从剩余的节点中选举一个作为master节点
  • 哨兵模式节点配置(通常)
    • 1个master节点,2个slave节点
    • 至少3个且奇数个sentinel节点。保证选举功能正常

2.2 leader选举

当哨兵集群中,有一个sentinel节点发现master节点宕机了,会将master节点标记为S_DOWN(Sujectively Down:主管下线)状态,并通知其他sentinel节点来判断该master节点是否宕机,当超过配置的quorum的值的sentinel节点认为master节点宕机,那么该master节点的状态就会标记为O_DOWN(Objectively Down:客观下线)。

当sentinel节点认为master节点已经O_DOWN客观下线,并不会马上进行故障转移。而是先从sentinel节点中选举出一个Leader,让Leader去完成故障转移工作。

每个sentinel节点都有机会成为Leader,当sentinel节点发现自己的票数大于等于**max(quorum, num(sentinels)/2+1)**时,就将成为leader。

leader在slave节点中选出一个优先级最高的节点作为新的master节点,向该slave节点发送replicaof no one命令,将slave节点升级为master节点。并对其余的slave节点发送replicaof mster_ip master_port命令,让他们成为新master节点的slave节点。

2.3 哨兵节点配置

sentinel-26379.conf、sentinel-26380.conf、sentinel-26381.conf

sentinel-26379.conf

# sentinel的默认端口为26379
port 26379
# sentinel monitor    
# 配置sentinel节点监测的master节点信息,quorum:当数量达到quorum个sentinel节点,就会标记master节点O_DOWN(客观下线)
sentinel monitor mymaster 192.168.110.97 6379 2
# sentinel down-after-milliseconds  
# sentinel与master节点通信,如果超过30000毫秒无响应,则标记该master节点为S_DOWN(主观下线)
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
# 故障转移超时时间
sentinel failover-timeout mymaster 180000

sentinel-26380.conf

# sentinel的默认端口为26379
port 26380
# sentinel monitor    
# 配置sentinel节点监测的master节点信息,quorum:当数量达到quorum个sentinel节点,就会标记master节点O_DOWN(客观下线)
sentinel monitor mymaster 192.168.110.97 6379 2
# sentinel down-after-milliseconds  
# sentinel与master节点通信,如果超过30000毫秒无响应,则标记该master节点为S_DOWN(主观下线)
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
# 故障转移超时时间
sentinel failover-timeout mymaster 180000

sentinel-26381.conf

# sentinel的默认端口为26379
port 26381
# sentinel monitor    
# 配置sentinel节点监测的master节点信息,quorum:当数量达到quorum个sentinel节点,就会标记master节点O_DOWN(客观下线)
sentinel monitor mymaster 192.168.110.97 6379 2
# sentinel down-after-milliseconds  
# sentinel与master节点通信,如果超过30000毫秒无响应,则标记该master节点为S_DOWN(主观下线)
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
# 故障转移超时时间
sentinel failover-timeout mymaster 180000

2.4 启动哨兵节点

当我们启动sentinel节点之后,sentinel.conf会被重写加入一些配置

# Generated by CONFIG REWRITE
latency-tracking-info-percentiles 50 99 99.9
user default on nopass ~* &* +@all
sentinel myid a32c19ed422d163ad2136f3aa8f96be46ea15303
sentinel config-epoch mymaster 9
sentinel leader-epoch mymaster 9
sentinel current-epoch 9

sentinel known-replica mymaster 192.168.110.97 6379

sentinel known-replica mymaster 192.168.110.97 6381

sentinel known-sentinel mymaster 192.168.110.97 26381 9d43081b22104ef4ac196fc17935b884b438bc5f

sentinel known-sentinel mymaster 192.168.110.97 26380 5f10bf8c6184f6aeb03ef521f6eb00bc886b4aca

依次启动3个sentinel节点

redis-sentinel sentinel.conf
redis-sentinel sentinel-26380.conf
redis-sentinel sentinel-26381.conf

连接端口号26379的sentinel节点

# 连接sentinel
redis-cli -p 26379
# 查看sentinel节点信息
info sentinel
# 结果
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_tilt_since_seconds:-1
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.110.97:6380,slaves=2,sentinels=3

通过上面的配置可以看出,哨兵模式也是主从复制的,是对主从复制的升级,实现了自动化的故障恢复。但哨兵模式的故障也很明细,就是很难实现在线扩容,在集群容量达到上限时在线扩容会变得很复杂。

因此,Redis官方发布了更优秀的集群实现Redis Cluster。

3.SpringBoot配置哨兵模式

spring.redis.sentinel.master=mymaster
spring.redis.sentinel.nodes=192.168.110.97:26379,192.168.110.97:26380,192.168.110.91:26381

你可能感兴趣的:(redis,redis)