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)
复制代码

 

posted @   SR丶  阅读(235)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示
CONTENTS