Redis哨兵的配置和原理
哨兵
在一个典型的一主多从的Redis系统中,当主数据库遇到异常中断服务后,需要手动选择一个从数据库升级为主数据库,整个过程需要人工介入,难以自动化。
Redis2.8提供了哨兵2.0(2.6提供了1.0,但是问题较多),哨兵顾名思义就是监控Redis系统的运行状况。它的功能包括一下两个:
- 监控主数据库和从数据库是否正常运行;
- 主数据库出现故障时自动将从数据库升级为主数据库;
哨兵是一个独立的进行,在一个一主多从的Redis系统中,可以使用多个哨兵监控整个Redis系统,哨兵之间也会互相监控。
配置
基于前面的一主两从架构,为他们加入哨兵。
可以在三个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)
- 哨兵自动将其转为从数据库;
原理
监控过程
哨兵启动后,会与要监控的主数据库建立两条连接:
- 一条用来用来订阅__sentinel__:hello频道以获取其他哨兵节点的信息;
- 另一条用来定期向主数据库发送INFO等命令来获取主数据库本身的信息;
在和主数据库建立连接后,哨兵会定时执行下面3个操作:
- 每10秒哨兵会向主数据库和从数据库发送INFO命令;
- 每2秒哨兵会向主数据库和从数据库的__sentinel__:hello频道发送自己的信息;
- 每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成功成为领头哨兵;
当有多个哨兵同时参选,则会出现没有任何节点当选的可能,此时每个参选节点将等待一个随即时间重新发起竞选,直到选举成功。
故障恢复
选择出领头哨兵后,会把从数据库中的一个挑选出来升级为主数据库:
- 所有先线的从数据库中,选择优先级最高的,优先级可以通过slave-priority来设置;
- 如果有多个一样优先级的从数据库,则复制的命令偏移量越大,越优先(与down掉的主数据库最接近);
- 如果还有多个备选,则选择运行ID较小的(运行ID不会重复);
选择好节点后,领头哨兵将想这个节点发送slaveof no one,升级他为主数据库。
然后想其他从数据库发送slaveof命令切换主数据库。
最后更新内部的记录,将已经停止服务的旧的主数据库更新为新的主数据库的从数据库,当其回复后自动以从数据库的身份加入到主从架构中。
哨兵部署
哨兵的推荐部署方案:
- 为每个节点(无论是主数据库还是从数据库)都部署一个哨兵;
- 使每个哨兵与其对应的节点的网络环境相同或相近;
设置quorum的值为N/2+1,这样使得只有当大部分哨兵统一后才会选择领头哨兵进行故障恢复;
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
这儿有一份开工福利 —— 开工第一周,技术不能丢!
你还老老实实地宅在家,囤肉呢? 肉要悄悄长,技术不能丢,快收下这份开工福利 ↓↓ 活动时间 2020年2月3日——2020年2月9日,嗨购7x24小时! 一. 1次打包,3大专栏 活动详情: 活动期间,订阅组合专栏者,99元一次打包学习。 老用户可享受补差价福利。 组合专栏: 《IT人必备的主流技术》《从虚拟化到容器云的实战之路》《由点及面学Linux》《一线DBA的进阶指南》《从零到 一 搞定Python》《网络工程师的看家本领》《新时代网工高薪必备技能》《大牛带你解决运维典型难题》 二. 2人成团,全场可拼 活动详情: 51CTO订阅专栏,全场拼团价,2人成团>>>拼团入口 原价51元,拼团只要39元。 更多福利 ? ①生成分享海报>>>https://blog.51cto.com/distribution/summary②邀请朋友拼团,可得现金 三. 进读者群,天降福利 活动详情: 活动期间,51CTO订阅专栏读者群内,将每天不定时发放随机福利。(参与用户至少曾经订阅过一个专栏) 福利有啥? ①15元专栏专属优惠券②博文上首页增粉(仅要求原创,...
- 下一篇
GoCD 20.1.0 发布,基于 Java 的持续集成和发布管理系统
GoCD 20.1.0 已发布,GoCD是一个持续集成和发布管理系统(注意不要和 Go 语言混淆),其前身为CruiseControl,它是 ThoughtWorks 在做咨询和交付项目时研发的一款开源持续集成工具。后来随着持续集成及持续部署的火热,ThoughtWorks 专门成立了一个项目组,基于 Cruise 开发出这款工具。 此版本增加了对集群配置文件和弹性代理配置文件的配置访问权限支持。在后续版本中将添加对其他 GoCD 实体的支持。 请参阅弹性代理配置的策略文档以了解更多信息。 下面是新版本的主要更新内容: UI/UX 方面的更新 为了使UI/UX 在 GoCD 的所有页面上保持一致,开发团队在此版本中重新构建了以下页面: 管道组授权编辑页面(Pipeline Group Authorization Edit Page) 支持 Postgres 10 及更高版本 从此版本开始,商业版的 GoCD PostgreSQL 插件将支持 Postgres 10、11 和 12 版本。 注意:根据先前的公告,该插件预计将于 2020 年第二季度开源。 其他改进 从此版本开始,可以针对...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS7设置SWAP分区,小内存服务器的救世主
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS关闭SELinux安全模块