redis主从复制的做用中有这么一句话“主从复制是高可用的基石”,那什么是高可用呢!高可用就是减小系统不能提供的时间,也就是常听到的以6个9为基准。实现高可用必不可少的就是哨兵和集群。本文主要介绍哨兵机制。redis
本文主要围绕以下几个方面介绍哨兵
本文实现环境
- centos7.3 redis4.0
- redis工做目录 /usr/local/redis
- 在虚拟机进行模拟操做
1、什么是哨兵
先简单说几句咱们在配置主从复制时有一种状况就是主节点宕机了,谁来提供服务呢!centos
当主节点宕机后主从复制就没有存在的意义了,数据为王的时代没有了数据何谈什么高可用。服务器
这个时候就横空出世了一位老大哥名叫
哨兵
,老大哥说这个问题我来帮大家处理。
既然主节点master做为老大不领大家玩了。我就从大家四个中间再挑选出来一位老大,而后大家跟着他玩。微信
等不带大家玩的那个老大回来后他的身份就失效了,就不在是大家的老大了。他只能跟着我挑选出来的老大玩。网络
上边这段对话过程就是咱们配置哨兵的意义到底在哪,跟谁玩就是谁给谁数据,知道了哨兵的做用咱们就在继续。分布式
最后咱们用专业术语来解释一下什么是哨兵。学习
哨兵,英文名sentinel,是一个分布式系统,用于对主从结构中的每一台服务器进行监控
,当主节点出现故障后经过投票机制来挑选新的主节点,而且将全部的从节点链接到新的主节点上。测试
2、哨兵的做用
上文中咱们谈到的对话过程就是哨兵的做用之一自动故障转移。centos7
谈到做用确定就是这个哨兵到底在工做中到底干了什么事情。咱们先用比较干巴的概念描述一下,而后在下文的工做原理会一一谈到。3d
哨兵的三个做用监控、通知、自动转移故障
- 监控
- 监控谁?支持主从结构的工做一个是主节点一个是从节点,那确定就是监控这俩个了。
- 监控主节点和从节点是否正常运行
- 检测主节点是否存活,主节点和从节点运行状况
- 通知
- 哨兵检测的服务器出现问题时,会向其余的哨兵发送通知,哨兵之间就至关于一个微信群,每一个哨兵发现的问题都会发在这个群里。
- 自动故障转移
- 当检测到主节点宕机后,断开与宕机主节点链接的全部从节点,在从节点中选取一个做为主节点,而后将其余的从节点链接到这个最新主节点的上。而且告知客户端最新的服务器地址。
这里有一个注意点,哨兵也是一台redis服务器,只是不对外提供任何服务。
配置哨兵时配置为单数。那么为何配置哨兵服务器的数量为单数呢?带着这个疑问你会在下文看到你想要的答案。
2、如何配置哨兵
1. 准备工做
这一章咱们就开始配置哨兵,前期工做准备。下图就是咔咔的准备工做。开启8个客户端,三个哨兵、一个主节点、俩个从节点、一个主节点客户端、一个从节点客户端。
2. sentinel.conf配置解读
哨兵使用的配置文件是sentinel.conf
咱们来对sentinel.conf配置信息进行解读
可是大多数都是注释,这里咔咔给你们提供一个命令来过滤这些无用信息
cat sentinel.conf | grep -v '#' | grep -v '^$'
- port 26379 :对外服务端口号
- dir /tmp:存储哨兵的工做信息
- sentinel monitor mymaster 127.0.0.1 6379 2:监控的是谁,名字能够自定义,后边的2表明的是,若是有俩个哨兵判断这个主节点挂了那这个主节点就挂了,一般设置为哨兵个数一半加一。
- sentinel down-after-milliseconds mymaster 30000:哨兵链接主节点多长时间没有响应就表明挂了。后边30000是毫秒,也就是30秒。
- sentinel parallel-syncs mymaster 1:这个配置项是指在故障转移时,最多有多少个从节点对新的主节点进行同步。这个值越小完成故障转移的时间就越长,这个值越大就意味着越 多的从节点由于同步数据而不可用。
- sentinel failover-timeout mymaster 180000:在进行同步的过程当中,多长时间完成算有效,系统默认值是3分钟。
3. 开始配置
使用命令cat sentinel.conf | grep -v '#' | grep -v '^$' > ./conf/sentinel-26379.conf
把sentinel.conf过滤后的信息移到/usr/local/redis/conf
下
而后打开
sentinel-26379.conf
修改信息存放目录
而后快速的复制俩个哨兵配置文件,端口为26380和26381。
sed 's/26379/26381/g' sentinel-26379.conf > sentinel-26381.conf
测试主从复制处于正常工做状态,启动三台redis服务器,端口分别为637九、6380、6381
查看主节点信息,是有俩台从节点在链接着,端口分别为6380、6381。
这里有一个小小的点就是lag怎么一个是1一个是0呢!lag是延迟时间,我这里是本地测试因此会出现0的状况,使用云服务器是不多出现的。lag的值为0和1都属于正常。
测试主节点添加一个hash值,
hset kaka name kaka
分别从slave1和slave2获取kaka的值,检测主从复制是否正常运行。
通过测试咱们的主从结构是正常运行的。
启动一个哨兵
redis-sentinel 26379-sentinel.conf
链接26379哨兵,主要是最后一行,监控的主节点名为mymaster,状态正常,从节点有俩个,哨兵数量为1个
在来查看一下26379的哨兵配置信息,这个时候已经改动了
在启动一个
26380
的哨兵,
redis-sentinel 26380-sentinel.conf
,这里注意一下最后一行多了一条信息,这个id就是咱们
26379
配置文件新增的id
而后咱们来到哨兵26379的客户端,一样也是新增的26380哨兵的id
这个时候咱们在查看一下26379哨兵的配置文件,第一次查看配置文件是没有配置26380哨兵的,第二次查看时配置了26380哨兵后添加的信息。
最后咱们须要把哨兵客户端3启动起来,端口号为26381。启动起来以后,咱们的配置信息和服务端的信息也会改动,添加哨兵26380有的信息,哨兵26381也会有。
直到这里咱们对哨兵的配置就结束了,接下来咱们把主节点master给宕掉
等待30秒后咱们来到26379哨兵的客户端,这里新增了一些信息,那么这些信息都作了什么呢!让咱们细细道来。
这里边的信息咱们先须要知道几个
- +sdown :这个信息后是指三个哨兵里边有一个认为主节点宕机了
- +odown:这个信息是指其余俩个哨兵去链接了一下主节点,发现确实是主节点宕机了
- 而后发起了一轮投票,这里咔咔使用的是redis4.0,版本之间这块信息有点差别
- +switch-master mymaster 127.0.0.1 6379 127.0.0.1 6380:直到这里是哨兵发起投票的结果,推选端口为6380的redis为主节点
- +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380:这里就把端口为6381与6379和新的主节点6380作了一个链接
- +sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6380:最后一句是端口为6379的仍是没有上线,因而给踢下线
当咱们在从新把6379的redis服务器上线后,就能够看到哨兵服务端响应了俩句。一句是去除6379的下线。最后一句就是重连6379到新的主节点上。
这个时候主节点就是6380了,在6380的redis客户端设置值,检测主从复制是否正常工做。
在新的主节点6380添加list类型
在6379和6381获取这个值,至此呢!咱们的哨兵模式就配置完成了。
3、哨兵工做原理
配置完哨兵后,就须要对其工做原理进行解析了,只有知道其工做流程,才能对哨兵有更好的理解。
本文讲解原理没有那么干巴!让你能够把一篇技术文章当故事去看。
进入正题,哨兵做用是监控、通知、故障转移。那么工做原理也是围绕这三点来说的。
1. 监控工做流程
- 哨兵发送info指令,而且保存全部哨兵状态,主节点和从节点的信息
- 主节点会记录redis实例的信息,主节点记录的信息跟哨兵记录的信息看起来是同样的,实际上仍是有点区别哈。
- 哨兵会根据在主节点拿到的从节点信息,给对应的从节点也发送info指令
- 接着哨兵2来了,一样的也会改主节点发送info指令,而且创建cmd链接
- 这个时候哨兵2也会保存跟哨兵1同样的信息,只不过是保存的哨兵信息是2个。
- 这个时候为了每一个哨兵的信息都一致它们之间创建了一个发布订阅。为了哨兵之间的信息长期对称它们之间也会互发ping命令。
- 当再来一个哨兵3时,也会作一样的事情,给主节点和从节点发送info。而且跟哨兵1和哨兵2创建链接。
2. 通知工做流程
Sentinel会给主从的全部节点发送命令获取其状态,而且会把信息发布到哨兵的订阅里。
3. 故障转移原理(本文重点)
- 哨兵会一直给主节点发送publish sentinel :hello,直到哨兵报出sdown,这个词这会是有不是有点熟悉了。没错就是咱们上文中把主节点断开后哨兵服务端报出的信息。哨兵报出主节点sdown后尚未完,哨兵还会往内网里发布消息说明这个主节点挂了。发送的指令是
sentinel is-master-down-by-address-port
- 其他的哨兵接收到指令后,主节点挂了吗?让我去看看到底挂没挂。发送的信息也是hello。其他的哨兵也会发送他们收到的信息而且发送指令
sentinel is-master-down-by-address-port
到本身的内网,确认一下第一个发送sentinel is-master-down-by-address-port
的哨兵说你说的对,这个家伙确实挂了。当全部人都认为主节点挂了后就会修改其状态为odown
。当一个哨兵认为主节点挂了标记的是sdown
,当半数哨兵都认为挂了其标记的状态是odown
。这也就是配置哨兵为何配置单数的缘由。
- 对于一个哨兵认为主节点挂了称之为主观下线,半数哨兵认为主节点挂了称之为客官下线。
- 一旦被认为主节点客官下线后,哨兵就会进行下一步操做
这时哨兵已经检测到问题所在了,那么究竟是那个哨兵去负责推选新的主节点呢!不能是张三也去,李四也去,王五也去,这样就乱套了、因而就须要在全部的哨兵里选出领头的,那么是如何选的呢!请看下图。
这个时候呢!五个sentinel就在一块儿开会了,全部的哨兵都在一个内网中,而后他们会作一件事情就是五个sentinel会同时发送指令sentinel is-master-down-by-address-port
而且携带上本身竞选次数和runid。
每一个sentinel既是参选者也是投票者,每一个sentinel都有一票,信封就表明本身的投票权。
当sentinel1和sentinel4同时把指令发送到群里准备竞选时,sentinel2这个时候就说我先接到谁的指令就把票投给谁。假如sentinel1发的早,那么sentinel2的票就会投给sentinel1。
按照这样的规则一直发起投票直到有一个sentinel的票数为总sentinel数量的一半之多。假设说是sentinel1的票数知足总哨兵数量的一半之多后,sentinel1就会当选。这个时候就进行到了下一个阶段。
在上边哨兵已经选出了sentinel1为表明去全部的从节点找出一个做为主节点。这个挑选主节点不是随便拿一个是有必定的规则的。
先把不在线的干掉
响应慢的干掉,sentinel会给全部的redis发送信息,响应速度慢的就会被干掉
与原主节点断开时间最久的干掉,这里因为演示不够用了,全部新增了一个slave5,没有任何意义哈!
以上三个点都判断结束后还有salve4和slave5,就会根据优先原则来进行筛选。
- 首先会根据优先级,若是优先级同样在进行其余判断
- 判断offset偏移量,判断数据同步性,假如说slave4的offset为90 slave5偏移量为100 那么哨兵就会认为slave4的网络是否是有问题啊!因而就会选slave5为新的主节点。那若是说是slave4和slave5的offset相同呢!还有最后一个判断
- 最后一步就是判断runid了,也就是职场中的论资排辈了,也就说根据runid的建立时间来判断,时间早的上位。
选出新的主节点后就要对全部的节点发送指令了。
4、总结
关于哨兵的全部知识点就已经说完了,本文最重要的就是哨兵的工做原理了。咱们在简单的梳理一下其工做原理。
-
首先进行监控,而且全部的哨兵同步信息
-
哨兵向订阅里边发布信息
-
故障转移
- 哨兵发现主节点下线
- 哨兵开启投票竞选负责人
- 由负责人推选新的主节点
- 新的主节点断开原主节点,而且其余的从节点链接新的主节点,原主节点上线后做为从节点链接。
以上就是咔咔对哨兵的理解,若是错误能够提出,咔咔及时改正。
5、咔咔我的简介
咔咔,男,17年入行,从业已经有三年。从搬砖同样的生活方式换成了如今有“单”而居的日子。固然这个单不是单身的单!虽然极尽苛刻的技术学习但也远不及客户千奇百怪的要求。进入了朝九晚六,虽然躲过了风吹日晒,可是仍然很享受那些熬得只剩下黑眼圈的日子。坚持学习、坚持写博、坚持分享是咔咔从业以来一直所秉持的信念。但愿在诺大互联网的中咔咔的文章能带给你一丝丝的帮助。