Redis专题(七)——Redis高可用(哨兵篇)

Redis专题(七) ——Redis高可用(哨兵篇)

(原创内容,转载请注明来源,谢谢)

redis2.8开始,提供稳定的哨兵,对redis的主从数据库进行自动化的系统监控和状态恢复。

1、概念

哨兵用于监控redis运行情况,监控主从数据库是否正常运行,并且在主库故障时将从库转换为主库。可以设置单个哨兵,也可以设置多个哨兵。

单个哨兵:

多个哨兵:

2、哨兵使用方式

现假设有一主二从数据库。哨兵建立方式如下:

1)建立配置文件,文件名可以任意,如sentinel.conf,里面的内容为:

sentinelmonitor 主库名字(任意,只能是字母、数字、-、.、_)主库ip 主库端口主库投票数。

由于同一个主从系统可以多个哨兵检查,则投票数的目的在于当该哨兵认为主库主观下线,至少还要有投票数-1 (因为包括当前哨兵)的哨兵认为是客观下线,才会换主库。

其中只需要配置主库,哨兵会自动获取从库。该文件可以有多行,每一行表示一个主库。设置多行表示检测多个主从系统。

除了monitor,还可以配置其他监控内容,通过主库名字区分监控的是哪个主从系统。

2)执行 sentinel进程,将配置文件传给哨兵:

redis-sentinel /sentinel.conf的路径/sentinel.conf

3)启动哨兵,可以看到哨兵的run id,输出+monitor表示监测到主库,+slave表示检测到从库。

哨兵执行过程如下:

1)主库关闭

如果将主库关闭(可以手动关闭或杀死进程),等待时间(默认30秒,可配置),会输出+sdown 主库ip 主库端口,表示哨兵主观认为主库停止服务。接着是+odown,表示哨兵客观认为主库停止服务。

当输出+odown后,哨兵会自动开始故障恢复,+try-failover开始修复,+failover-end表示修复完毕。修复完毕后,会重新设置一个主库,+switch-master 原主库名原主库ip 原主库端口新主库ip 新主库端口。接着,又会有+slave输出,表示检测到新主库的从库,原主库恢复连接后,也会被设置成新主库的从库。

2)从库关闭

从库如果被关闭,也会检测到+sdown,当从库再次开启,会检测到-sdown,并且会输出+convert-to-slave将重启后的从库再次设置为从库。

从库只有主观下线,没有客观下线。因为客观下线后需要重新选出新主库,这对于从库来说没有必要。

3、哨兵原理

1)哨兵进程启动时,通过读取上述提到的配置哨兵配置文件,确定主库的信息。当配置文件中有多行数据,表示是多个主从系统,哨兵也可以同时检测。

2)哨兵启动后,与要检测的主库建立两个连接,一个订阅来自主数据__sentine1__:hello频道,以获取其他监控该主库的哨兵信息;另一个用来给主库建立连接定期发送INFO等命令(这是因为考虑到主库可能会进入订阅模式,而无法执行其他命令,所有才用连接)。

3)连接建立后,进行如下操作:

a.每10秒向主库发送INFO命令。

目的是获取当前主从系统的相关信息,如从库信息,比较上次发送的信息与当前的信息,确认主从库是否有故障。

b.每2秒向主库与从库的__sentine1__:hello发送哨兵自身的信息。

目的是为了使各哨兵之间互相确认当前的检测范围,形成监测网。发送的内容包括哨兵地址、端口、运行id、配置版本,主库名字、地址、端口、配置版本。

当发现主库配置版本比较落后,还会更新主库的信息。

c.每1秒向主从数据库以及其他哨兵发送ping命令。

目的是确认各库、各哨兵是否正常服务。1秒这个时间可以通过配置文件的字段进行配置,down-after-milliseconds,单位是毫秒。如果大于1秒则采用1秒,小于1秒则采用配置的数据。因此开启哨兵后,最少每秒会查看一次各库的情况。

4)判断各库是否下线

a.当超过down-after-milliseconds时间,库没有回复,则认为其主观下线,即上述的检测到+sdown。

当下线的是主库,哨兵还会给其他哨兵发送命令,确认其他哨兵是否也认为主库主观下线,当达到指定数量(哨兵配置文件中主库的投票数,投票数含自身),则认为其客户下线(检测到+odown),此时重新选主库。

5)选举领头哨兵

多个哨兵确认主库客观下线,会选举出一个领头哨兵进行故障恢复,避免多个哨兵重复恢复。

选举领头哨兵,采用Raft算法,如下:

a.发现主库客观下线的哨兵A,向其他哨兵发送命令,要求选举自己为领头哨兵。

b.如果接到命令的哨兵,没有选过其他人,则选A。

c.当A的票数超过哨兵的半数,且超过哨兵配置文件对该主库的投票数,则A称为领头哨兵。

由于要超过半数才能当领头哨兵,因此确保每次选举都只会选出一个领头哨兵。

d.当多个节点参选领头哨兵,如果出现没有任何哨兵当选的情况,则每个哨兵随机等待一个时间,再重新发起请求。

6)故障恢复

领头哨兵挑选一个从库作为新的主库,挑选依据如下:

a.所有在线从库,选择优先级最高的从库,优先级通过配置文件的slave-priority来设置。

b.当多个从库优先级都一样且最高,则复制的偏移量越大,即增量复制时保存的数据相对约完整的,越优先。

c.以上条件都一样,则选择运行id最小的从库作为新的主库。

7)后续步骤

a.选出新主库,领头哨兵会向其发送slave of no one,让其成为主库,再向其他从库发送slave of命令,让其他从库称为该新主库的从库。

b.将旧主库设置成为新主库的从库,使其重启后可以直接投入工作。

4、哨兵部署

哨兵以独立进程的方式进行监控,如果系统哨兵较少,可靠度则较低。因为哨兵本身也可能发生故障。因此,相对稳妥的方案:

1)为每个数据库(无论主从)都配置一个哨兵。

2)使每个哨兵与其对应节点网络环境相似。

但是,redis不支持连接复用,配置过多哨兵会有太多的冗余连接;另外redis负载高时会影响其对哨兵的回复以及哨兵和其他哨兵的通信。

因此要根据实际情况设置哨兵。

——written by linhxx 2017.08.12

原文发布于微信公众号 - 决胜机器学习(phpthinker)

原文发表时间:2017-08-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏精讲JAVA

搞定所有的跨域请求问题 : jsonp & CORS

网上各种跨域教程,各种实践,各种问答,除了简单的 jsonp 以外,很多说 CORS 的都是行不通的,老是缺那么一两个关键的配置。本文只想解决问题,所有的代码经...

1583
来自专栏weixuqin 的专栏

springMVC 学习笔记(一):spring 入门

springMVC 是 spring 框架的一个模块,springMVC 和 spring 无需通过中间整合层进行整合。springMVC 是一个基于 mvc ...

1412
来自专栏A周立SpringCloud

跨域访问支持(Spring Boot、Nginx、浏览器)

最近家中事多,好久没有写点啥了。一时间竟然不知从何说起。先说下最近家里发生的事情吧: 老爸肺气肿住院; 老妈甲状腺囊肿 儿子喘息性支气管炎住院 我莫名其妙尿脓。...

4915
来自专栏程序猿DD

Spring Cloud构建微服务架构:Hystrix监控面板【Dalston版】

前言 在上一篇《服务容错保护(hystrix断路器)》的介绍中,我们提到断路器是根据一段时间窗内的请求情况来判断并操作断路器的打开和关闭状态的。而这些请求情况的...

2207
来自专栏坚毅的PHP

python日志按时间切分-----TimedRotatingFileHandler

原生loggging类+ TimedRotatingFileHandler类 实现按day hour second 切分 原生loggging类+ Timed...

5076
来自专栏码农笔录

java配置跨域springboot配置Cors跨域

1952
来自专栏java、Spring、技术分享

java 日志处理

  common-logging是 apache提供的一个通用的日志接口。用户可以自由选择第三方的日志组件作为具体实现,像log4j,或者jdk自带的loggi...

4043
来自专栏FreeBuf

新手指南:DVWA-1.9全级别教程(完结篇,附实例)之XSS

* 本文原创作者:lonehand,转载请注明来自FreeBuf.COM 目前,最新的DVWA已经更新到1.9版本(http://www.dvwa.co.uk...

1.4K5
来自专栏运维小白

11.25 配置防盗链

配置防盗链目录概要 通过限制referer来实现防盗链的功能 配置文件增加如下内容 Directory针对目录进行 <Directory /data/www...

2165
来自专栏Netkiller

How to Install Nginx and PHP-FPM on FreeBSD 10

FreeBSD 10 + Nginx 1.4.4 + PHP 5.5.9 + MySQL 5.6.15 摘要 FreeBSD 10.0 的 pkg 无法安装ph...

3848

扫码关注云+社区

领取腾讯云代金券