Redis哨兵
一.Redis哨兵的作用
1.监控
即不断检查主服务器和从服务器是否正常工作
2.通知
当监测到redis实例故障之后,可以通过API通知系统管理员或者其它程序
3.自动故障转移(重点)
如果主服务器故障,redis哨兵可以会开始自动故障转移,将故障主服务器的从服务器中的一个提升为主服务器,并让其它从服务器从新配置使用新的主服务器,并且当客户端连接redis服务器时告知客户端新的连接地址。另外自动故障转移只有在主服务器客观下线时才会启动。一个哨兵发现主服务器下线是主观下线,多个哨兵同时认定下线才是客观下线。
4.配置提供者
哨兵是客户端服务发现的权威来源,客户端向哨兵询问当前可以提供服务的redis主服务器,如果发生了故障转移,哨兵则会提供新的地址。
二.启动哨兵的两种方式
方式1:redis-sentinel /path/to/sentinel.conf 方式2:redis-server /path/to/sentinel.conf --sentinel
注意事项:启动哨兵之前必须手动创建sentinel.conf ,如果不配置该文件(配置内容见https://redis.io/docs/manual/sentinel/),redis哨兵将拒绝启动。系统运行的状态会保存到这个文件,重启时会读这个配置文件。哨兵默认运行端口是26379,它会监听TCP端口26379的连接,因此服务器必须打开这个端口让其接收其它哨兵实例的地址,来进行工作。
三.配置文件内容
//sentinel.conf配置中只需要配置主服务器,从服务器信息不用配置,哨兵会自动发现并更新副本信息,故障转移之后也会从新配置 //quorum:判定主服务器故障至少需要几个哨兵同意。注意, 无论你设置要多少个 Sentinel 同意才能判断一个服务器失效, 一个 Sentinel 都需要获得系统中多数(majority) Sentinel 的支持, 才能发起一次自动故障迁移, 并预留一个给定的配置纪元 (configuration Epoch ,一个配置纪元就是一个新主服务器配置的版本号)。换句话说, 在只有少数(minority) Sentinel 进程正常运作的情况下, Sentinel 是不能执行自动故障迁移的。 //sentinel monitor <master-group-name> <ip> <port> <quorum> sentinel monitor mymaster 127.0.0.1 6379 2 // Sentinel 认为服务器已经宕机所需的毫秒数 sentinel down-after-milliseconds mymaster 60000 sentinel failover-timeout mymaster 180000 //在执行故障转移时,最多可以有多少个从服务器同时对新的主服务器进行同步,这个数字越小,完成故障迁移所需时间越长 sentinel parallel-syncs mymaster 1
注:故障迁移时之所以不让所有从服务器同时对新的主服务器进行同步是因为,如果从服务器被设置为允许使用过期数据集,尽管复制过程中绝大多数步骤都不会阻塞从服务器,但从服务器在载入主服务器发来的rdb文件时,仍然会造成在同一时间段内不能处理命令的请求,如果全部从服务器同时跟主服务器进行同步,就可能造成所有从服务器在同一时间内不可用。
四.哨兵自动发现的过程
一个sentinel可以与其它多个sentinel连接,并相互检查彼此的可用性,并进行信息交换。sentinel通过发布/订阅来自动发现同主服务器的其它sentinel。这个功能通过向频道sentinel:hello发送信息来实现。
1.每个sentienl会以每2秒一次的频率,通过发布/订阅功能,向被他监视的所有主服务器和从服务器的sentinel:hello频道发送一条信息,信息中包含了sentinel的IP地址、端口以及运行的id(runid).
2.每个sentinel都订阅了被他监视的主服务器和从服务器的sentinel:hello频道,查找之前从未出现过的sentinel。当一个sentinel发现一个新的sentinel时,它会将新的sentinel添加到一个列表中,这个列表中包含了sentinel已知的,监视主服务器的所有其它sentinel。
3.sentinel发送的信息还包含完整的主服务器当前配置,如果一个sentinel包含的主服务器配置比另一个sentinel发送的配置旧,那么这个sentinel会立即升级到新的配置上。
4.当将一个新的sentinel加入到监视主服务器的列表上面之前,sentinel会先检查列表中是否已经包含了和要添加sentinel相同运行id或相同地址的sentinel,如果时的话,sentinel会先移除列表中包含的sentinel,然后再添加新的sentinel。
五.自动故障转移原理
1.转移步骤
(1)发现主服务器进入客观下线状态
(3)如果当选失败,那么在设定自动故障转移超时时间2倍之后,重新尝试当选。如果当选成功,则执行以下步骤
(4)选出一个从服务器,将它升级为主服务器(规则见下)
(5)向被选中的从服务器发送SLAVEOF NO ONE命令,让它转变为主服务器
(6)通过发布/订阅功能,将升级后的配置传播给其它所有的sentinel,其它sentinel对自己的配置进行升级更新
(7)向已下线的主服务器发送salveof 命令,让它去复制新的主服务器
(8)当所有从服务器都开始复制新的主服务器时,领头的sentinel将终止这次故障迁移操作。
2.sentinel从从服务器中选择主服务器的规则
(1)从已下线主服务器的从服务器中,淘汰被被标记为主观下线、已断线、或者最后一次恢复PING命令的时间大于5秒的从服务器
(2)从已下线主服务器的从服务器中,淘汰那些与已失效主服务器连接断开的时间超过down-after选项指定的时长十倍时间的从服务器
(3)从以上两轮淘汰剩下的从服务器中选择复制偏移量最大的从服务器作为主服务器,如过复制偏移量不可用或复制偏移量相同,则选择带有最小运行id的从服务器作为新的住服务器。