查看原文
其他

Redis哨兵的配置和原理

点击上方 "程序员小乐"关注, 星标或置顶一起成长

每天凌晨00点00分, 第一时间与你相约


每日英文

Life is often playing jokes on us. What you're expect will far away from you and the one you held tightly will finally hurt you most.

生活常和我们开着玩笑,你期待谁,谁就会离你越远;你执着谁,谁就会伤你最深。


每日掏心

不要以你所见去评判别人。因为,你看见的,只是他们想让你看到的。




来自:XuePeng77 | 责编:乐乐

链接:my.oschina.net/u/2450666/blog/3163019

程序员小乐(ID:study_tech)第 818 次推文   图片来自百度


往日回顾:淘宝现重大BUG:坊间传言称3.25出现是程序员报复,被淘宝斥为谣言!淘宝这样回应!


     

   正文   


哨兵

在一个典型的一主多从的Redis系统中,当主数据库遇到异常中断服务后,需要手动选择一个从数据库升级为主数据库,整个过程需要人工介入,难以自动化。

Redis2.8提供了哨兵2.0(2.6提供了1.0,但是问题较多),哨兵顾名思义就是监控Redis系统的运行状况。它的功能包括一下两个:

  • 监控主数据库和从数据库是否正常运行;

  • 主数据库出现故障时自动将从数据库升级为主数据库;

哨兵是一个独立的进行,在一个一主多从的Redis系统中,可以使用多个哨兵监控整个Redis系统,哨兵之间也会互相监控。

关于Redis:

7、面试必问:Redis的那些最常见面试问题! 看下面第7篇Redis面试文章

2、Redis很牛逼很秀!轻松实现实时订阅推送

3、比 Redis 快 5 倍的中间件,为啥这么快?

4、93.7% 的程序员,竟然都不知道 Redis 为什么默认16个数据库?

5、百亿数据量下,掌握这些Redis技巧你就能Hold全场

6、阿里巴巴官方 Redis 开发规范!

7、Redis 面试最常被问到21个知识点总结

配置

基于前面的一主两从架构,为他们加入哨兵。

可以在三个redis节点的redis目录下找到sentinel.conf文件,这个文件就是哨兵的配置文件,修改配置如下:

sentinel monitor mymaster 192.168.2.101 6379 3

其中mymaster是要监控的主数据库名字,可以自定义;

接下来是主数据库的ip和端口;

最后一个3是指哨兵最低通过票数;

如果你需要后台启动,则修改daemonize参数:

daemonize yes

配置后如果有防火墙,不要忘记打开哨兵的端口,默认是26379。

最后,开启哨兵:

redis-sentinel /yourpath/sentinel.conf

做个测试,关闭主数据库(192.168.2.101)后,等待30秒(默认30秒):

  • 哨兵将从数据库中的一个节点升级成主数据库(192.168.2.102);

  • 将另一个从数据库(192.168.2.103)的主数据库(192.168.2.101)切换到新的主数据库(192.168.2.102);

随后启动刚才关闭的主数据库(192.168.2.101)

  • 哨兵自动将其转为从数据库;


原理

监控过程

哨兵启动后,会与要监控的主数据库建立两条连接:

  1. 一条用来用来订阅__sentinel__:hello频道以获取其他哨兵节点的信息;

  2. 另一条用来定期向主数据库发送INFO等命令来获取主数据库本身的信息;

在和主数据库建立连接后,哨兵会定时执行下面3个操作:

  1. 每10秒哨兵会向主数据库和从数据库发送INFO命令;

  2. 每2秒哨兵会向主数据库和从数据库的__sentinel__:hello频道发送自己的信息;

  3. 每1秒哨兵会向主数据库和从数据库和其他哨兵发送PING命令;

第一个操作是发送INFO命令,目的是获取主数据库的信息,以及主数据库的从数据库的信息,从而实现新节点的自动发现,并对从数据库也建立两条连接。

第二个操作是订阅__sentinel__:hello频道,并发送哨兵本身的信息,与同样监控该数据库的其他哨兵分享自己的信息,同时也能识别哨兵是否是新哨兵。哨兵与哨兵之间也会建立一个链接,用来发送PING命令;

第三个操作是发送PING命令,在发现了从数据库和其他哨兵后,要做的就是定时监控Redis服务是否停止,时间间隔与配置文件中的down-after-milliseconds有关,当这个值小于1秒时,哨兵会每隔该值的时间发送PING命令,当这个值大于1秒时,哨兵会每隔1秒发送一次PING命令。

配置方式是在sentinel.conf文件中加入:

sentinel down-after-milliseconds mymaster 600 # 600毫秒发送一个PING

当超过down-after-milliseconds时,如果PING的数据库未回复,则哨兵认为其主观下线。主观下线可以理解为当前的哨兵认为该节点下线了。

如果该节点是主数据库,则哨兵们会进一步判断是否需要对其进行故障修复:

哨兵会发送SENTINEL is-master-down-by-addr命令询问其他哨兵,判断他们是否也认为该主数据库下线,如果达到quorum参数,也就是我们在配置哨兵时的命令:

sentinel monitor mymaster 192.168.2.101 6379 3

的最后一个参数3,哨兵们会认为这个主数据库客观下线,并选举一个领头哨兵对主从系统发起故障恢复。


领头哨兵选举

要进行故障恢复,则需要选举出一个领头哨兵,领头哨兵的选择算法是Raft算法,具体过程如下:

发现主数据库客观下线的哨兵节点(A节点)想每个哨兵节点发送命令,要求对方选择自己成为领头哨兵;

如果目标哨兵节点没有选择过其他人,则会同意将A设置成领头哨兵;

如果A发现超过半数且超过quorum参数个哨兵节点同意选择自己,则A成功成为领头哨兵;

当有多个哨兵同时参选,则会出现没有任何节点当选的可能,此时每个参选节点将等待一个随即时间重新发起竞选,直到选举成功。


故障恢复

选择出领头哨兵后,会把从数据库中的一个挑选出来升级为主数据库:

  1. 所有先线的从数据库中,选择优先级最高的,优先级可以通过slave-priority来设置;

  2. 如果有多个一样优先级的从数据库,则复制的命令偏移量越大,越优先(与down掉的主数据库最接近);

  3. 如果还有多个备选,则选择运行ID较小的(运行ID不会重复);

选择好节点后,领头哨兵将想这个节点发送slaveof no one,升级他为主数据库。

然后想其他从数据库发送slaveof命令切换主数据库。

最后更新内部的记录,将已经停止服务的旧的主数据库更新为新的主数据库的从数据库,当其回复后自动以从数据库的身份加入到主从架构中。


哨兵部署

哨兵的推荐部署方案:

  1. 为每个节点(无论是主数据库还是从数据库)都部署一个哨兵;

  2. 使每个哨兵与其对应的节点的网络环境相同或相近;

设置quorum的值为N/2+1,这样使得只有当大部分哨兵统一后才会选择领头哨兵进行故障恢复;


欢迎在留言区留下你的观点,一起讨论提高。如果今天的文章让你有新的启发,学习能力的提升上有新的认识,欢迎转发分享给更多人。

欢迎各位读者加入订阅号程序员小乐技术群,在后台回复“加群”或者“学习”即可。

猜你还想看


阿里、腾讯、百度、华为、京东最新面试题汇集

Java 中的 SPI 机制是到底是什么?高级 Java 必须掌握!

Java对象不再使用时,为什么要赋值为 null ?

答应我!别再写上千行的类了!这样的代码让我生不如死!

关注订阅号「程序员小乐」,收看更多精彩内容
嘿,你在看吗?
: . Video Mini Program Like ,轻点两下取消赞 Wow ,轻点两下取消在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存