Redis: Sentinel 2
当前最新的稳定版叫做Sentinel 2
,即“哨兵二代目”,必须使用Redis 2.8
。2.6
版本中的为Sentinel 1
(哨兵一代目),有很多bug
,已经被废弃。
功能
Redis Sentinel
提供一下功能:
- 监控节点状态
- 提供监控api,用于提醒用户
- 自主发起故障转移,当
master
不可用时,将slave
切换为master
-
哨兵
作为配置提供方,客户端通过哨兵
获取到服务端信息
启动
启动哨兵
服务器有一下两条命令:
redis-sentinel /path/to/sentinel.conf
或redis-server /path/to/sentinel.conf --sentinel
要注意的时,sentinel
启动的时候必须要提供配置文件。默认监听26379
。
配置
常用最下配置:
配置sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 60000
sentinel failover-timeout mymaster 180000
sentinel parallel-syncs mymaster 1
sentinel monitor resque 192.168.1.3 6380 4
sentinel down-after-milliseconds resque 10000
sentinel failover-timeout resque 180000
sentinel parallel-syncs resque 5
-
sentinel monitor
哨兵
可以监控多个master
,不同的master
需要不同的命名。
quorum
为判定master
不可靠的阀值:当超过quorum
数量的sentinel
认为master
不可靠,master
的状态会变成ODOWN(objectively down)
。 -
sentinel down-after-millisenconds
服务器不可靠的判断依据,当sentinel ping master
超过milliseconds
没有reply
,认定其不可靠,将master
状态设置为SDOWN(subjectively down)
,当超过上面设定的quorum
认为master
为SDOWN
时,master
状态改为ODOWN
,所有sentinel
会授权一个sentinel
执行failover
操作。 -
sentinel failover-timeout
默认3分钟
这个配置有四个作用:(自行翻译)
- The time needed to re-start a failover after a previous failover was already tried against the same master by a given Sentinel, is two times the failover timeout.
- The time needed for a slave replicating to a wrong master according to a Sentinel current configuration, to be forced to replicate with the right master, is exactly the failover timeout (counting since the moment a Sentinel detected the misconfiguration).
- The time needed to cancel a failover that is already in progress but did not produced any configuration change (SLAVEOF NO ONE yet not acknowledged by the promoted slave).
- The maximum time a failover in progress waits for all the slaves to be reconfigured as slaves of the new master. However even after this time the slaves will be reconfigured by the Sentinels anyway, but not with the exact parallel-syncs progression as specified.
-
sentinel parallel-syncs
在故障转移
成功后,马上将切到新的master
的slave
数量。
Quorum
quorum
字面翻译是“法定人数”,不是很喜欢,这里就还是用e文。执行故障转移需要一下几个步骤:
-
master
的状态为ODOWN
- 一个
哨兵
获取到授权执行故障转移
操作
quorum
代表的数量主要体现在第1个步骤中,当有``个哨兵
判断master
为SDOWN
时,master
就被判断为ODOWN
状态。如图:
假设上图中sentinel_1
打算执行故障转移
操作,就必须获取所有sentinel
的授权,在判断master_1
为ODOWN
时,sentinel_1
和sentinel_2
的结论是一致的,所以只需向余下的哨兵们
获取授权即可,即sentinel_3
当一个
哨兵
对给定master
执行故障转移
操作时,其他哨兵
并没有放弃对该master
执行故障转移
的权利(好爱抢功劳),它们只是暂时放弃,当时间超过配置的failover-timeout
时,其他哨兵们
就会尝试对给定的master
进行故障转移
操作,直至成功。
哨兵们
的配置
在哨兵们
和master们
正常运行的时候,每个哨兵
都维护着相同的配置,各个节点会相互交换自己的配置版本号,一旦运行中有较新的版本出现,就会使用使用新的配置代替老的配置。在故障转移
的过程,一旦一个哨兵
获取到执行故障转移
的授权,会立马生成新的版本号,一旦故障转移
成功,会通过master们
和slaver们
发布新的配置文件,其他哨兵
就会不得不使用最新的配置文件。正如上面说的,如果超过failover-timeout
还没有成功的话,又有一个哨兵
会去执行故障转移
操作,会生成与前者不同的配置版本(功劳不能被抢嘛)。
配置传播
执行故障转移
的过程中,对将要上任的slaver
送slaver of no one
(备胎转正),其他slaver
发送slaver of
(新爸爸),只要执行哨兵
收到了ACK
,就算这个过程还在进行,故障转移
也算做成功,该哨兵
会发布新的配置。
哨兵们
传播配置文件主要依赖redis
的消息订阅功能,官方叫gossip
,就是八卦了,哨兵们
都是老死不想往来的,都是通过“小道消息”获取彼此间的信息,从上文看,还特别爱赶潮流。哨兵
会和所有的master
(正宫)和slaver
(备胎)宣布自己的配置版本信息(好像自己有一手资料似得),同时也会打听其他哨兵
手上的情报,以防自己落伍了。
配置传播配置通过
__sentinel__:hello
通道广播
八卦知天下
哨兵
最开始不知道其他哨兵
的存在,在他去嫖master
的时候,顺便在master
那里安插一个盯梢的,负责打听各路消息,保证自己掌握一手资料,和其他哨兵
的情报。同时哨兵
又爱吹牛,稍微一点新变化就爱吹嘘,所以情报也被其他哨兵
打听走。master
作为店里的头牌,加上日理万机的本事,所以生意基本上它一个人做,除非客人一定要找实习生(slaver
)。傲娇的master
通常会和哨兵们
讲起自己的身价,比如有多人觊觎自己的位置.etc。作为嫖客的哨兵
,一旦知道master
服务不行了,就会发起选秀,就会去找替补slaver
,当然哨兵
们都是争相做主办方的,这样第一个睡嘛~嫖客无情~
哨兵
每隔2秒发布它的个人信息,包括ip
,port
,runid
哨兵
通过__sentinel__:hello
获取到其他哨兵
的情报,将它们加入到自己的盯梢薄里
哨兵
发布的消息包含所有的master
配置信息,一旦哨兵
发现自己的情报落后与其他哨兵
,就马上会更新到最新情报
当哨兵
发现其他哨兵
的存在,回去查找自己的情报薄,看看这个哨兵有没有存在
情报保存
哨兵
视情报为生命,所以不管甚么时候,一旦获取到新的情报,就立马刻在自家的碑文上(写到硬盘),做传世之用。
备胎转正的条件
master
的候选者参照几下几点:
- 和
master
失去链接的时间 - 级别
- 从
master
学习到的功力(原文:replication offset processed) - Run ID
如果和master
失恋的时间超过: (down-after-milliseconds * 10) + milliseconds_since_master_is_in_SDOWN_state
,则无法当选为候选人.
新master
的考察项:
1. 优先级越高越优先(redis.conf
中的slave-priority
数值越小,不能小于0,等于0,则宣布一辈子做备胎)
2. 相同优先级就考察从master
学到的本事,越多越好
3. 当优先级相同,本事一样,那就看名字了,哨兵
认为Run Id
越小越好
指令
哨兵
的通信协议和的redis-server
实例相同,可以通过redis-cli -h -p
来访问,支持一下命令:
PING
-
SENTINEL masters
获取该哨兵
已有的master
信息 -
SENTINEL master
获取指定master
情报 -
SENTINEL slaves
获取指定master
的slaver
情报 -
SENTINEL get-master-addr-by-name
获取指定master
的ip
,port
-
SENTINEL reset
重置所有命名符合pattern
的master
-
SENTINEL failover
强制对一个无法链接的master
执行故障转移
操作
运行时的配置指令
-
SENTINEL MONITOR
新增监控的master
,不能使用hostname
代替真实的ip
-
SENTINEL REMOVE
不再监控指定master
- `SENTINEL SET
哨兵
的添加与删除
依赖八卦体系,添加哨兵很简单,只要监控master
就可以被大家发现。删除哨兵
则需要一下步骤:
- 杀死该
哨兵
进程 - 发送
SENTINEL RESET *
给其他哨兵
- 检查所有
哨兵
,发送指令SENTINEL master
给所有哨兵
来查看活跃的哨兵
数量