以后还是要好好写博客,把好东西或者是在工作中遇到的问题记录下来
菜鸡的提升之路
最近在看《redis的设计与实现》,这本书比较底层,应用说的很好,主要还是对redis底层的详解吧,个人觉得很不错,还是很好看的一本书,特别是刚开始对redis底层的各种数据结构的介绍,步步升入。。
闲话少说,不如正题
sentinel
sentinel(哨兵)是redis高可用的解决方案。它的本质是一个运行在特殊模式下的redis服务器。
sentinel做的主要的工作是
- 主服务器选举:sentinel系统会挑选server1属下的一个从服务器,并将这个从服务器提升为主服务器
- 故障转移:向从服务器发送(slave of no one)命令,将从服务器提升为主服务器。从服务器发送复制指令,(sync,psync),当所有的从服务器完成复制新的服务器时,故障转移操作执行完毕
- sentinel还会继续监视已经下线的server1,并在它重新上线时,将他设置为新的主服务器的从服务器。
sentinel服务初始化
sentinel其实就是一个运行在特殊模式下的redis服务器。一个sentinel启动时,他需要执行以下步骤
- 初始化redis服务器
- 将普通的redis服务器使用的代码替换成sentinel专用代码
- 初始化sentinel的状态
- 根据给定的配置文件,初始化sentinel的监视主服务器列表
- 创建连向主服务器的网络连接
redis向主redis服务器创建通信的主要步骤如下:
- 初始化setinel状态的master属性
- 创建连向主服务器的网络连接
- 获取主服务信息
- 获取从服务信息
- 向主服务器和从服务器发送消息
- 接收来自主服务器和从服务器的频道消息
- 更新sentinels字典
- 创建连向其他sentinel的连接
- 检查客观下线状态
- 选取领头sentinel
- 故障转移
a. 选出新的主服务器
b 修改从服务器的复制目标
c. 将旧的主服务器变为从服务器
下面我将简述这几个过程的具体如何操作的。
初始化sentinel的master属性
创建连向主服务器的网络连接
sentinel会创建两个连向主服务器的异步网络连接
- 一个是命令连接,这个连接专门用于向主服务器发送命令,并接收命令服务
- 另一个是订阅连接,这个连接专门用于订阅主服务器的_sentinel_:hello频道
获取主服务器信息
sentinel默认以10秒一次的频率,通过命令连接向被监控的服务器发送Info命令,并通过分析INFO命令的回复来获取主服务器当前的信息
#server
…
run_id:8979803798379273980987980yhiuh979i7we678
…
#replication
role:master
…
slave0:ip=127.0.0.1,port=11111,state=online,offset=43,lag=0
slave1:ip=127.0.0.1,port=22222,state=online,offset=43,lag=0
slave2:ip=127.0.0.1,port=33333,state=online,offset=43,lag=0
…
获取从服务器信息
当sentinel发生主服务器与新的从服务器出现时,sentinel除了会为这个新的从服务创建相应的实例结构之外,sentinel还会创建连接到从服务器的命令连接和订阅连接
创建连向其他sentinel命令连接
故障转移
选取领头的sentinel,然后对故障进行转移
- 在下线服务器的从服务器中挑选一个作为新的主服务器
- 已下线的服务器下的其他从服务器复制新的主服务器
- 已下线的主服务器再上线的时候会作为新服务器的从服务器0.
重点知识掌握
- sentinel只是一个运行在特殊模式下的redis服务器,它使用了和普通模式不同的命令表,所以sentinel模式能够使用命令和普通redis服务器能够使用的命令不同
- sentinel会读入用户指定的配置文件,为每个要被监视的服务器创建相应的实例结构,并创建连向主服务器的命令连接和订阅连接。
- 在一般情况下,sentinel以每十秒一个的频率向被监视的主服务器和从服务器发送INFO命令,当主服务器处于下线状态,或者sentinel正在对主服务器做故障转移时,sentinel向从服务器发送Info命令的频率会改为每秒一次
- 对于监视同一主服务器和从服务器的多个sentinel来说,他们会以每两秒一次的方式通过向被监视的服务器的_sentinel_:hello频道发送消息来向其他sentinel宣告自己的存在
- 每个sentinel也会从_sentinel_:hello频道接收其他sentinel发来的消息,并根据这些信息为其他的sentinel创建实例结构,以及连接命令
- sentinel会与主服务器创建命令连接和订阅连接,sentinel和sentinel之间只能通过命令连接
- sentinel以每秒一次的频率向实例(包括主服务器,从服务器,其他sentinel)发送ping命令,并根据实例对ping的命令回复来判断实例是否在线当一个实例在指定时长中连接向sentinel发送无效回复的时候,sentinel会将这个实例判断为主观下线
- 当sentinel将主服务器判断为主观下线的时候,他会想同样监视这台主服务器的sentinel询问,看它是否支持主服务器的下线。
- 当sentinel搜集到足够多的主观下线投票时,他会将主服务器下线,并发起一次主服务器的故障转移