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 条评论
登录 后参与评论

相关文章

来自专栏技术墨客

Vert.x工具—使用Dropwizard Metrics对指标进行监控(Metrics使用教程)

    最近项目中需要针对Vert.x的运行效率进行监控,查阅Vert.x官文,发现目前提供了Dropwizard和Hawkular两种开箱即用的工具。本文将介...

512
来自专栏个人分享

Linux知识体系之磁盘与档案系统管理

硬盘的物理组成:由许许多多的圆形硬盘盘所组成。宜居硬盘盘能够容纳的数据量,而有所谓的单碟或者多碟。

775
来自专栏哈雷彗星撞地球

GCD API记录(二)

这是关于GCD的第二篇文章,GCD的API有100多个,通过快捷键Option + 单击,可以在Reference中的Grand Central Dispatc...

703
来自专栏乐沙弥的世界

Oracle活动会话历史(ASH)及报告解读

对于数据库运行期间的各种状态的实时监控以及相关性能数据捕获对于解决性能问题,提高整体业务系统运行效率是至关重要的。在Oracle数据库中,实时捕获相关性能数据是...

591
来自专栏梦里茶室

【Chromium中文文档】沙箱FAQ

什么是沙箱? 沙箱是一个允许沙箱进程创建的C++库,沙箱进程是一种运行在非常限制性的环境中的进程。沙箱进程可以唯一自由使用的资源是CPU周期和内存。例如,沙箱进...

18110
来自专栏牛客网

网易 Java面经19届实习一面(3.16日)二面(3.20日)

一面(3.16日) 1、自我介绍一下 2、快排相关的(原理、复杂度、使用场景) 3、问了ArrayList、LinkedList(问了我源码、底层实现原理) 4...

44810
来自专栏A周立SpringCloud

最简日志打印规范

个人认为,如果在公司的野蛮生长阶段,一些基础类库不做约束,很可能“埋坑”,形成技术债务,最终为此付出代价。本文讲解一个最简的日志打印规范。 事实上,日志打印规范...

3717
来自专栏高性能服务器开发

关于windows完成端口(IOCP)的一些理解(五)

系列目录 关于windows完成端口(IOCP)的一些理解(一) 关于windows完成端口(IOCP)的一些理解(二) 关于windows完成端口(IOCP)...

28611
来自专栏熊二哥

快速入门系列--MVC--01概述

虽然使用MVC已经不少年,相关技术的学习进行了多次,但是很多技术思路的理解其实都不够深入。其实就在MVC框架中有很多设计模式和设计思路的体现,例如Depende...

1756
来自专栏逍遥剑客的游戏开发

Nebula3中的Jobs子系统

1022

扫描关注云+社区