Redis哨兵模式
Posted 一颗心
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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进行操作。
- 客户端配置配置sentinel所有节点及监控的masterName
- 客户端发送Ping命令对节点进行筛选,获取一个可用的sentinel节点
- 对sentinel节点发送get-master-addr-by-name命令获取masterName对应的主节点信息
- 客户端使用role或role replication验证是否是master节点
- 当出现故障自动转移或其他原因引起master节点发送变化时,哨兵会向一个指定频道发送master节点信息;客户端订阅该频道,获取master节点信息记录到本地,进行新的链接
常用的Redis客户端有jedis和lettuce。
以上是关于Redis哨兵模式的主要内容,如果未能解决你的问题,请参考以下文章