一:简介
Redis-sentinel是Redis提供的高可用方案,在redis主从模式中,当master宕机,redis本身(包括slave)都没有自动切换的机制
redis-sentinel是一个独立的进程,其可以监控多个redis集群,当master宕机的时候,可以自动进行切换
Sentinel是一个监视器,其可以根据被监视实例的身份和状态来执行何种动作
二:Redis-Sentinel功能
监控(Monitoring)
Sentinel会不断检测你的主服务器和从服务器是状态是否正常
提醒(Notification)
当监控发现某个Redis实例出现问题,其可以通过某个API告知管理员
自动故障迁移(Automatic Failover)
当检测到主服务器宕机的时候,Sentinel会从所属失效主服务器的从服务器选举新的主服务器,并且通告失效主服务器所属其余的从服务器新的主服务器,当客户端视图连接失效主服务器的时候,集群也会通告新的主服务器的地址,使得新的主服务器可以代替失效主服务器
三:服务器连接
一:发现并连接主服务器
Sentinel 通过用户给定的配置文件来发现主服务器。
Sentinel会与被监视的主服务器创建两个网络连接
1:命令连接用于向主服务器发送命令
2:订阅连接用于订阅指定的频道,从而发现监视同一主服务器的其他 Sentinel。
二:Sentinel发现并连接从服务器
1:Sentinel通过向主服务器发送INFO命令来自动获得所有从服务器的IP地址
2:Sentinel会与每个从服务器创建命令连接以及订阅连接
三:发现其余Sentinel
Sentinel会通过命令向被监视的主机发送Hello消息,改信息包含Sentinel的IP PORT ID等内容以此向其余Sentinel主机宣告自己的存在,与此同时其会通过订阅连接接受其余Sentinel的Hello信息,以此来发现监视同一主服务器其余的Sentinel
PS:Sentinel1通过发送Hello消息宣告自己的存在,通过订阅命令发现其余的Sentinel 其余Sentinel的操作与Sentinel1一样
四:Sentinel连接
多个Sentinel之间只会创建命令连接用于进行通信,因为有主从服务器通过Hello信息宣告自己的存在,因此不需要再次进行订阅连接
四:实例状态监测
一:监测方式
Sentinel会通过ping命令来监测实例状态,如果实例在指定状态没有回复信息,或者回复的信息错误,则认为该实例下线
二:Sentinel下线区别
主观下线(SDOWN):单个Sentinel实例对服务器做出下线判断
客观下线(ODOWN):指的是多个Sentinel实例对同一个服务器做出SDOWN判断,并且通告Sentinel is-master-down-by-addr相互交流之后做出服务器下线判断(一个 Sentinel 可以通过向另一个 Sentinel 发送 SENTINEL is-master-down-by-addr 命令来询问对方是否认为给定的服务器已下线),如果一个服务器没有在 master-down-after-milliseconds 选项所指定的时间内,对向他发送ping命令的Sentinel发出有效回应,那么Sentinel实例就会认为该服务器下线
五:故障转移
一次故障转移操作由以下步骤组成:
''' 1. 发现主服务器已经进入客观下线状态。 2. 基于Raft leader election 协议 , 进行投票选举 3. 如果当选失败,那么在设定的故障迁移超时时间的两倍之后,重新尝试当选。 如果当选成功, 那么执行以下步骤。 4. 选出一个从服务器,并将它升级为主服务器。 5. 向被选中的从服务器发送 SLAVEOF NO ONE 命令,让它转变为主服务器。 6. 通过发布与订阅功能, 将更新后的配置传播给所有其他 Sentinel ,其他 Sentinel 对它们自己的配置进行更新。 7. 向已下线主服务器的从服务器发送 SLAVEOF 命令,让它们去复制新的主服务器。 8. 当所有从服务器都已经开始复制新的主服务器时, leader Sentinel 终止这次故障迁移操作。 '''
六:配置Sentinel
创建程序目录
cd /application mkdir 26380 cp /usr/local/redis/src/redis-sentinel ./26380/ cd 26380
编辑配置文件
vim sentinel.conf port 26380 dir "/tmp" sentinel monitor mymaster 127.0.0.1 6380 2 sentinel down-after-milliseconds mymaster 60000 sentinel config-epoch mymaster 0
启动sentinel
./redis-sentinel ./sentinel.conf
配置文件说明
# 指定监控master sentinel monitor mymaster 127.0.0.1 6370 2 # {2表示多少个sentinel同意} # 安全信息 sentinel auth-pass mymaster root # 超过15000毫秒后认为主机宕机 sentinel down-after-milliseconds mymaster 15000 # 当主从切换多久后认为主从切换失败 sentinel failover-timeout mymaster 900000 # 这两个配置后面的数量主从机需要一样,epoch为master的版本 sentinel leader-epoch mymaster 1 sentinel config-epoch mymaster 1
Sentinel命令操作
七:发布订阅消息
1:客户端可以将 Sentinel 看作是一个只提供了订阅功能的 Redis 服务器: 你不可以使用 PUBLISH 命令向这个服务器发送信息, 但你可以用 SUBSCRIBE 命令或者 PSUBSCRIBE 命令, 通过订阅给定的频道来获取相应的事件提醒。
2:一个频道能够接收和这个频道的名字相同的事件。 比如说, 名为 +sdown 的频道就可以接收所有实例进入主观下线(SDOWN)状态的事件。
通过执行 PSUBSCRIBE * 命令可以接收所有事件信息。
3:以下列出的是客户端可以通过订阅来获得的频道和信息的格式
第一个英文单词是频道/事件的名字,其余的是数据的格式。
注意, 当格式中包含 instance details 字样时, 表示频道所返回的信息中包
4:含了以下用于识别目标实例的内容
<instance-type> <name> <ip> <port> @ <master-name> <master-ip> <master-port>
@ 字符之后的内容用于指定主服务器, 这些内容是可选的, 它们仅在 @ 字符之前的内容指定的实例不是主服务器时使用。
八:Python配置Redis-Sentinel
import redis from redis.sentinel import Sentinel # 连接哨兵服务器(主机名也可以用域名) sentinel = Sentinel([('172.31.0.2', 5001), ('172.31.0.3', 5001), ('172.31.0.4', 5001), ('172.31.0.5', 5001) ], socket_timeout=0.5) # 获取主服务器地址 master = sentinel.discover_master('mymaster') print(master) # 输出:('172.31.0.2', 5001) # 获取从服务器地址 slave = sentinel.discover_slaves('mymaster') print(slave) # 输出:[('172.31.3', 5001), ('172.31.0.4', 5001), ('172.31.0.5', 5001)] # 获取主服务器进行写入 master = sentinel.master_for('mymaster', socket_timeout=0.5, password='redis_auth_pass', db=15) w_ret = master.set('foo', 'bar') # 输出:True # # 获取从服务器进行读取(默认是round-roubin) slave = sentinel.slave_for('mymaster', socket_timeout=0.5, password='redis_auth_pass', db=15) r_ret = slave.get('foo') print(r_ret)