只有光头才能变强git
好的,今天咱们要上【铂金二】了,若是尚未上铂金的,赶忙先去蹭蹭经验再回来(否则不带你上分了):github
在上篇中抛出了一个问题:数据库
抛个问题:若是从服务器挂了,不要紧,咱们通常会有多个从服务器,其余的请求能够交由没有挂的从服务器继续处理。若是主服务器挂了,怎么办?由于咱们的写请求由主服务器处理,只有一台主服务器,那就没法处理写请求了?服务器
Redis提供了哨兵(Sentinal)机制供咱们解决上面的状况。若是主服务器挂了,咱们能够将从服务器升级为主服务器,等到旧的主服务器(挂掉的那个)重连上来,会将它(挂掉的主服务器)变成从服务器。网络
在正常的状况下,主从加哨兵(Sentinal)机制是这样子的:架构
主服务器挂了,主从复制操做就停止了,而且哨兵系统是能够察觉出主服务挂了。:app
Redis提供哨兵机制能够将选举一台从服务器变成主服务器异步
而后旧的主服务器若是重连了,会变成从服务器:ide
这篇文章主要讲讲Redis的哨兵(Sentinal)机制的一些细节。但愿看完对你们有所帮助~学习
High Availability: Redis Sentinel is the official high availability solution for Redis.
哨兵(Sentinal)机制主要用于实现Redis的高可用性,主要的功能以下:
下面来具体讲讲Sentinel是如何将从服务器提高为主服务器的。
tips:Sentinel可让咱们的Redis实现高可用,Sentinel做为这么一个组件,自身也必然是高可用的(不多是单点的)
首先咱们要知道的是:Sentinel本质上只是一个运行在特殊模式下的Redis服务器。由于Sentinel作的事情和Redis服务器是不同的,因此它们的初始化是有所区别的(好比,Sentinel在初始化的时候并不会载入AOF/RDB文件,由于Sentinel根本就不用数据库)。
而后,在启动的时候会将普通Redis服务器的代码替换成Sentinel专用代码。(因此Sentinel虽然做为Redis服务器,可是它不能执行SET、DBSIZE等等命令,由于命令表的代码被替换了)
接着,初始化Sentinel的状态,并根据给定的配置文件初始化Sentinel监视的主服务器列表。
最后,Sentinel会建立两个连向主服务器的网络链接:
_sentinel_:hello
频道)Sentinel经过主服务器发送INFO命令来得到主服务器属下全部从服务器的地址信息,并为这些从服务器建立相应的实例结构。
当发现有新的从服务器出现时,除了建立对应的从服务器实例结构,Sentinel还会建立命令链接和订阅链接。
在Sentinel运行的过程当中,经过命令链接会以每两秒一次的频率向监视的主从服务器的_sentinel_:hello频道
发送命令(主要发送Sentinel自己的信息,监听主从服务器的信息),并经过订阅链接接收_sentinel_:hello频道
的信息。
判断主服务器是否下线有两种状况:
down-after-milliseconds
毫秒内连续向Sentinel发送无效回复,那么当前Sentinel就会主观认为该主服务器已经下线了。在多少毫秒内无效回复才认定主服务器是主观下线的,以及有多少个Sentinel认为主服务器是下线才认定为客观下线。这都是能够配置的
当一个主服务器认为为客观下线之后,监视这个下线的主服务器的各类Sentinel会进行协商,选举出一个领头的Sentinel,领头的Sentinel会对下线的主服务器执行故障转移操做。
选举领头Sentinel的规则也比较多,总的来讲就是先到先得(哪一个快,就选哪一个)
选举出领头的Sentinel以后,领头的Sentinel会对已下线的主服务器执行故障转移操做,包括三个步骤:
挑选某一个从服务器做为主服务器也是有策略的,大概以下:
这篇文章主要讲解了Sentinel的做用和工做的基本过程(我以为已经基本OK了),其中也涉及到了不少的细节,这里我就没有一一整理出来了。想要深刻学习的同窗最好本身看看书或者文档~~
tips:目前为止的主从+哨兵架构能够说Redis是高可用的,但要清楚的是:Redis仍是会丢失数据的
丢失数据有两种状况:
能够经过如下两个配置尽可能减小数据丢失的可能:
min-slaves-to-write 1 min-slaves-max-lag 10
从零单排学Redis【铂金三】,敬请期待~
参考资料:
若是你以为我写得还不错,了解一下: