Redis哨兵模式

一颗心

主从模式下,slave可以很方便的进行伸缩,但master只有一个,仍然存在单点故障问题。今天我们来看redis的哨兵模式是如何来解决这个问题的。

哨兵职责

哨兵模式(sentinel)是redis官方提供的高可用集群解决方案。它是建立在主从模式的基础上,通过哨兵系统监控整个集群的健康状况,对master实例进行自动故障转移。哨兵系统也是一个高可用的集群系统,其功能包含以下几点

  • 监控(Monitor) 哨兵系统会不间断(每秒一次的频率)的向监控的redis实例发送ping指令。被监控的redis服务会进行三种回复,PONG、LOADING和MASTERDOWN。如果redis在有效时间内(down-after-milliseconds设置时间的大小)进行了PONG的回复,则表示服务运行正常,若未回复,或者回复了其它两种则表示服务异常。
  • 通知(Notification) 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
  • 自动故障迁移(Automatic failover) sentinel监控到redis服务异常时,并且在指定的时间段内(master-down-after-milliseconds配置)一直是异常情况,sentinel会将该redis服务标记为主观下线(Subjectively Down)。当有足够多的sentinel(通常为一半以上数量的sentinel)都将该redis标记为主观下线时,此时达到了客观下线(Objectively Down)的条件,置为客观下线。sentinel此时会从集群中下掉该redis,同时通过选举选出新的master。使用 replica no one 将slave变为master,然后对其他slave执行 replicaof ip port指定追随新的master。sentinel也会将自己监控的master配置信息更新掉。

master选择标准

  • 剔除已标记为主观下线的从节点
  • 剔除网络状态不佳的从节点 先根据网络状况剔除已断线的,连接状态不佳的,回复ping指令时间超过5秒的
  • 选择数据最新的从节点 根据从节点复制数据的偏移量(offset)选择偏移量最大的从节点
  • 选择节点id最小的从节点 每个从节点都有一个运行的实例id,当根据上述筛选扔出现多个节点时,则选择id最小的那个节点

哨兵集群

启动一个哨兵
一个哨兵实例也是一个redis实例,只是运行在特殊的模式下。哨兵默认使用的端口是26379。有两种方式可以启动一个哨兵实例

  • 启动redis-sentinel运行程序
  • 启动一个普通的redis程序

      redis-server /path/to/sentinel.conf --sentinel
    

配置文件
启动 Sentinel 实例必须指定相应的配置文件sentinel.conf, 系统会使用配置文件来保存 Sentinel 的当前状态, 并在 Sentinel 重启时通过载入配置文件来进行状态还原。因此停止和重启哨兵是安全的,不会产生数据丢失。


#监控一个master服务,起个名字叫mymaster,
#监控的master的ip:127.0.0.1,端口6379
#定义至少要有2个sentinel都同意才可以标记监控redis客观下线
sentinel monitor mymaster 127.0.0.1 6379 2
#60000毫秒以内监控的redis都没有反馈健康状况,则认为异常
sentinel down-after-milliseconds mymaster 60000
#自动故障转移的处理过期时间
sentinel failover-timeout mymaster 180000
#故障转移完成时可并行同步的slave的实例个数
sentinel parallel-syncs mymaster 1

哨兵间通信
在哨兵集群中,每个哨兵都不需要配置其他哨兵的服务地址,都可以相互交换信息,并监控彼此的可用性。这是借助redis的发布订阅来实现的

  • 哨兵中均指定了监控的master实例,在启动后会在master上开启一个发布订阅信道sentinel_hello
  • 所有的哨兵订阅sentinel_hello频道,并向其发布消息,消息内容中包含了哨兵自己的id、ip和端口
  • 哨兵在sentinel_hello中获得其他哨兵的地址信息,更新到自己的哨兵列表中
  • Sentinel 发送的信息中还包括完整的主服务器当前配置(configuration)。 如果一个 Sentinel 包含的主服务器配置比另一个 Sentinel 发送的配置要旧, 那么这个 Sentinel 会立即升级到新配置上。

当我们开启一个客户端连接上master redis实例时,可以订阅频道来获取哨兵发布的频道数据

PSUBSCRIBE *

哨兵leader选举
当有主节点客观下线了之后,哨兵需要执行一次自动故障转移,该任务是由哨兵集群选举的一个领头sentinel来执行的。选举的领头使用的是Raft算法,确保在一个给定的纪元(epoch)里, 只有一个领头产生。

客户端使用哨兵模式

客户端实现原理
客户端通过对哨兵集群的访问,获得Master节点信息,然后进行连接进而对master进行操作。

  1. 客户端配置配置sentinel所有节点及监控的masterName
  2. 客户端发送Ping命令对节点进行筛选,获取一个可用的sentinel节点
  3. 对sentinel节点发送get-master-addr-by-name命令获取masterName对应的主节点信息
  4. 客户端使用role或role replication验证是否是master节点
  5. 当出现故障自动转移或其他原因引起master节点发送变化时,哨兵会向一个指定频道发送master节点信息;客户端订阅该频道,获取master节点信息记录到本地,进行新的链接

常用的Redis客户端有jedis和lettuce。

阅读 2.6k
1 声望
1 粉丝
0 条评论
1 声望
1 粉丝
文章目录
宣传栏