Redis之哨兵模式

一:简介

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)
原文地址:https://www.cnblogs.com/SR-Program/p/12451647.html