16 Sentinel(哨兵)
作用:
是Redis高可用解决方案。由一个或多个Sentinel实例组成的Sentinel系统可以监视任意多个主服务器以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器并进行代替,处理命令请求;若下线服务器重新上线,则成为新的主服务器的从服务器
完整的上下线例子:从上到下、从左到右
16.1 启动并初始化Sentinel
启动一个Sentinel命令:
redis-sentinel /path/to/your/sentinel.conf 或 redis-server /path/to/your/sentinel.conf --sentinel
启动时执行的步骤:
1.初始化Sentinel服务器
2.将普通的Redis服务器使用的代码替换成Sentinel专用代码
3.初始化Sentinel状态
4.根据给定的配置文件,初始化Sentinel的监视主服务器列表
5.创建Sentinel服务器连向主服务器的网络连接
接下来逐一介绍
16.1.1 初始化Sentinel服务器
Sentinel本质:运行在特殊模式下的Redis服务器
步骤类似初始化一个普通的Redis服务器,区别如下:如不会载入RDB或AOF文件,因为不使用数据库
16.1.2 将普通的Redis服务器使用的代码替换成Sentinel专用代码
将一部分普通Redis服务器使用的代码替换成Sentinel专用代码
例子:
sentinelcmds命令表解释了为什么在sentinel模式下,Redis服务器不能执行诸如SER命令,因为服务器没有在命令表中载入这些命令
16.1.3 初始化Sentinel状态
初始化sentinel.c/sentinelState结构,其保存了服务器中所有和Sentinel功能有关的状态:
16.1.4 根据给定的配置文件,初始化Sentinel的监视主服务器列表masters属性
sentinelState中的masters属性记录了所有被Sentinel监视的主服务器的相关信息,其初始化是根据被载入的Sentinel配置文件来进行的,其键值对含义为:
sentinelRedisInstance结构代表被Sentinel监视的Redis服务器实例,可以是主服务器、从服务器或另外一个Sentinel:
sentinelRedisInstance.addr属性:指向sentinel.c/sentinelAddr结构的指针,sentinelAddr保存着实例的IP和端口号
- 例子
配置文件如图:
则结构为:
16.1.5 创建Sentinel连向被监视的主服务器的网络连接
Sentinel成为主服务器的客户端,可以向主服务器发送命令,并从命令回复中获取相关的信息
对于每个被Sentinel监视的主服务器,Sentinel会创建两个异步网络:
为什么要两个:为了不丢失消息和保证功能完整性
例子:
接下来介绍如何通过命令连接和订阅连接来与被监视的主服务器进行通信的
16.2 获取主服务器信息
启动并初始化Sentinel结束后,Sentinel默认以每十秒一次的频率,通过命令连接向被监视的主服务器发送INFO命令,并通过分析INFO命令的回复来获取主服务器的当前信息:
根据这些信息更新Sentinel服务器的结构状态:
例子:根据指定配置进行更新
16.3 获取从服务器信息
Sentinel会为新的从服务器创建相应的实例结构和创建命令连接、订阅连接
Sentinel默认以每十秒一次的频率,通过命令连接向被监视的从服务器发送INFO命令,并通过分析INFO命令的回复来获取从服务器的当前信息:
根据这些信息,对Sentinel的从服务器实例结构进行更新
例子:
配置文件为:
则结构为: