Sentinel模式由一个或多个Sentinel实例组成,可以监视任意多个主服务器和主服务器属下的从服务器,并且在被监视的主服务器下线超过设定时长时,自动将其属下的从服务器升级成新的主服务器进行处理命令请求,在下线的主服务器重新上线时,只能成为从服务器。
Sentinel启动和初始化的步骤
- 初始化服务器
Sentinel本质是一个运行在特殊模式在的Redis服务器,所以首先启动一个普通的Redis服务器,但Sentinel不实用数据库,所以不进行RDB文件和AOF文件的载入。
- 将普通Redis服务器使用的代码替换成Sentinel专用代码。
- 初始化Sentinel状态。比如正在执行的脚本的数量,FIFO队列。
- 根据给定的配置文件,初始化Sentinel监视的主服务器列表。即初始化内部的masters字典,字典的键是主服务器的名字,值是被监视主服务器对应的实例结构。
- 创建连向主服务器的网络连接。这一步之后,Sentinel成为主服务器的客户端,可以向主服务器发送命令并从命令回复中得到相关信息。这一步会创建两个连向主服务器的异步网络,一个是命令连接,专门用来向主服务器发送命令并接受命令回复;另一个是订阅连接,订阅主服务器的__sentinel__:hello频道。
【两个连接的目的】:1. 订阅连接为了不丢失__sentinel__:hello频道的任何信息。防止因为客户端断线而没收到消息。2. 命令连接是为了跟主服务器进行通信。
Sentinel启动后的一些操作
-
获取主服务器信息。
Sentinel默认每十秒一次向主服务器发送INFO REPLICATION
来获取主服务器的当前信息。获取的信息中,一方面是主服务器本身的信息,根据这些信息对主服务器的实例结构进行更新;一部分是主服务器属下从服务器的信息,根据这些信息就可以自动发现从服务器,并且更新主服务器实例结构的slave字典,如果从服务器的实例结构已经存在就进行更新,如果不存在就创建一个实例结构。 -
获取从服务器信息。为新的从服务器创建实例结构并创建订阅连接和命令连接
-
接受来自主从服务器的频道消息。一个Sentinel发送的信息会被其他Sentinel接收到,这些信息会被用于更新其他Sentinel对发送信息Sentinel的认知,也会被用于更新其他Sentinel对被监视服务器的认知。
-
检测主观下线状态: Sentinel会每秒向与它建立命令连接的实例(主从服务器,其他Sentinel)发送Ping命令,通过回复判断其他实例是否在线。如果在设置的时间内,连续向Sentinel返回无效回复,那么Sentinel会修改这个实例的实例结构,将其置为主观下线状态。
-
检测客观下线状态:当Sentinel判断一个主服务器主观下线,就向同样监视这一服务器的其他Sentinel进行询问,看他们是不是也认为主服务器进入下线状态**,如果超过Sentinel认为设定的值**,则 将其判断为客观下线,执行故障转移。
-
选举领头Sentinel:当服务器被判定为客观下线,Sentinel中需要选出一个领头Sentinel对下线主服务器进行故障转移操作。任何一个Sentinel都可能被选举,无论是否成功都会将自己的计数器自增一次,其中 的规则是先到先得,最先向目标Sentinel发送投票请求的Sentinel会获得目标Sentinel的票选,如果获得超过半数的票选,就成为领头Sentinel。
-
故障转移的三个步骤:
1. 在下线主服务器属下的所有从服务器里挑选一个状态良好,数据完整的从服务器,将其转换为主服务器。发送slave no one
,当被升级的服务器的role从slave变成master,代表已经顺利升级。
2. 出现新的主服务器后,让其他从服务器去复制新的主服务器。发送SLAVEOF命令来实现。
3. 将已下线的主服务器设置为新的主服务器的从服务器,等其重新上线,Sentinel向他发送SLAVEOF命令。