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、Spring、技术分享

java 日志处理

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

2253
来自专栏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...

3738
来自专栏禁心尽力

SpringBoot整合Mybatis之进门篇

已经有好些日子没有总结了,不是变懒了,而是我一直在奋力学习springboot的路上,现在也算是完成了第一阶段的学习,今天给各位总结总结。        之前...

1.3K6
来自专栏世界第一语言是java

springboot配置Cors跨域、java最简单配置跨域解决方案

1894
来自专栏坚毅的PHP

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

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

4546
来自专栏张戈的专栏

分享一次Linux任务计划crontab不执行的问题排查过程

朋友弄了一个小项目,要我帮忙做下 Linux 系统运维,上线一段时间后,发现项目偶尔会挂掉导致服务不可用。开发朋友一时之间也没空去研究项目奔溃的根因,只好由我这...

3663
来自专栏码农笔录

java配置跨域springboot配置Cors跨域

1552
来自专栏精讲JAVA

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

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

1173
来自专栏乐沙弥的世界

Linux 下配置nginx到php的连接

安装Nginx:Linux 6 下安装编译安装Nginx 安装PHP : Linux 6 下编译安装 PHP 5.6

1151
来自专栏搜云库

Spring Boot 中使用 LogBack 配置

LogBack是一个日志框架,它与Log4j可以说是同出一源,都出自Ceki Gülcü之手。(log4j的原型是早前由Ceki Gülcü贡献给Apache基...

1.7K6

扫码关注云+社区