前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Redis HA 实践(Redis Sentinel)

Redis HA 实践(Redis Sentinel)

原创
作者头像
DB之路
修改2021-03-09 14:22:49
1.2K0
修改2021-03-09 14:22:49
举报
文章被收录于专栏:数据库PG数据库PG

官方文档:https://redis.io/topics/sentinel

Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案,当用Redis做Master-slave的高可用方案时,假如master宕机了,Redis本身(包括它的很多客户端)都没有实现自动进行主备切换,而Redis-sentinel本身也是一个独立运行的进程,它能监控多个master-slave集群,发现master宕机后能进行自动切换。

1.1 Redis Sentinel 功能

📣监控(Monitoring):

Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。

📣 提醒(Notification):

当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。

📣 自动故障迁移(Automatic failover):

当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。

1.2 服务器连接

发现并连接主服务器

Sentinel 通过用户给定的配置文件来发现主服务器。

两个网络连接:

🐱‍🏍 命令连接用于向主服务器发送命令。

🐱‍🏍 订阅连接用于订阅指定的频道,从而发现

监视同一主服务器的其他 Sentinel。

发现并连接从服务器

Sentinel 通过向主服务器发送 INFO 命令来自动获得所有从服务器的地址。

跟主服务器一样,Sentinel 会与每个被发现的从服务器创建命令连接和订阅连接。

发现其他 Sentinel

Sentinel 会通过命令连接向被监视的主从服务器发送 “HELLO” 信息,该消息包含Sentinel 的 IP、端口号、ID 等内容,以此来向其他 Sentinel 宣告自己的存在。与此同时Sentinel 会通过订阅连接接收其他 Sentinel 的“HELLO” 信息,以此来发现监视同一个主服务器的其他 Sentinel 。

多个Sentienl之间的链接

Sentinel 之间只会互相创建命令连接,用于进行通信。因为已经有主从服务器作为发送和接收 HELLO 信息的中介,所以 Sentinel之间不会创建订阅连接。

1.3 检测实例的状态

Sentinel 使用 PING 命令来检测实例的状态:如果实例在指定的时间内没有返回回复,或者返回错误的回复,那么该实例会被 Sentinel 判断为下线。

🥓 主观下线(Subjectively Down, 简称 SDOWN)指的是单个Sentinel 实例对服务器做出的下线判断。

🥓客观下线(Objectively Down, 简称 ODOWN)指的是多个Sentinel 实例在对同一个服务器做出 SDOWN 判断, 并且通过 SENTINEL is-master-down-by-addr 命令互相交流之后, 得出的服务器下线判断。 (一个 Sentinel 可以通过向另一个 Sentinel 发送 SENTINEL is-master-down-by-addr 命令来询问对方是否认为给定的服务器已下线。)

如果一个服务器没有在 master-down-after-milliseconds 选项所指定的时间内, 对向它发送 PING 命令的 Sentinel 返回一个有效回复(valid reply), 那么 Sentinel 就会将这个服务器标记为主观下线。

1.4 故障转移FAILOVER

一次故障转移操作由以下步骤组成:

1. 发现主服务器已经进入客观下线状态。

2. 基于Raft leader election 协议 进行投票选举

3. 如果当选失败,那么在设定的故障迁移超时时间的两倍之后,重新尝试当选。 如果当选成功, 那么执行以下步骤。

4. 选出一个从服务器,并将它升级为主服务器。

5. 向被选中的从服务器发送 SLAVEOF NO ONE 命令,让它转变为主服务器。

6. 通过发布与订阅功能, 将更新后的配置传播给所有其他 Sentinel ,其他 Sentinel 对它们自己的配置进行更新。

7. 向已下线主服务器的从服务器发送 SLAVEOF 命令,让它们去复制新的主服务器。

8. 当所有从服务器都已经开始复制新的主服务器时, leader Sentinel 终止这次故障迁移操作。

1.5 配置sentinel

创建程序目录

代码语言:javascript
复制
cd /application
代码语言:javascript
复制
mkdir 26380
代码语言:javascript
复制
cp /usr/local/redis/src/redis-sentinel ./26380/
代码语言:javascript
复制
cd  26380

编辑配置文件

代码语言:javascript
复制
vim sentinel.conf
代码语言:javascript
复制
port 26380
代码语言:javascript
复制
dir "/tmp"
代码语言:javascript
复制
sentinel monitor mymaster 127.0.0.1 6380 2
代码语言:javascript
复制
sentinel down-after-milliseconds mymaster 60000
代码语言:javascript
复制
sentinel config-epoch mymaster 0

启动sentinel

代码语言:javascript
复制
./redis-sentinel ./sentinel.conf

配置文件说明

代码语言:javascript
复制
# 指定监控master
代码语言:javascript
复制
sentinel monitor mymaster 127.0.0.1 6370 2 
代码语言:javascript
复制
# {2表示多少个sentinel同意}
代码语言:javascript
复制
# 安全信息
代码语言:javascript
复制
sentinel auth-pass mymaster root
代码语言:javascript
复制
# 超过15000毫秒后认为主机宕机
代码语言:javascript
复制
sentinel down-after-milliseconds mymaster 15000 
代码语言:javascript
复制
# 当主从切换多久后认为主从切换失败
代码语言:javascript
复制
sentinel failover-timeout mymaster 900000
代码语言:javascript
复制
# 这两个配置后面的数量主从机需要一样,epoch为master的版本
代码语言:javascript
复制
sentinel leader-epoch mymaster 1
代码语言:javascript
复制
sentinel config-epoch mymaster 1

1.6 Sentinel命令操作

命令

描述

PING

返回 PONG

SENTINEL masters

列出所有被监视的主服务器

SENTINEL slaves <master name>

SENTINEL get-master-addr-by-name <master name>

返回给定名字的主服务器的 IP 地址和端口号。

SENTINEL reset <pattern>

重置所有名字和给定模式 pattern 相匹配的主服务器

SENTINEL failover <master name>

当主服务器失效时, 在不询问其他 Sentinel 意见的情况下, 强制开始一次自动故障迁移。

1.7 Sentinel发布与订阅信息

客户端可以将 Sentinel 看作是一个只提供了订阅功能的 Redis 服务器: 你不可以使用 PUBLISH 命令向这个服务器发送信息, 但你可以用 SUBSCRIBE 命令或者 PSUBSCRIBE 命令, 通过订阅给定的频道来获取相应的事件提醒。

一个频道能够接收和这个频道的名字相同的事件。 比如说, 名为 +sdown 的频道就可以接收所有实例进入主观下线(SDOWN)状态的事件。

通过执行 PSUBSCRIBE * 命令可以接收所有事件信息。

以下列出的是客户端可以通过订阅来获得的频道和信息的格式:

第一个英文单词是频道/事件的名字,其余的是数据的格式。

注意, 当格式中包含 instance details 字样时, 表示频道所返回的信息中包

含了以下用于识别目标实例的内容:

代码语言:javascript
复制
<instance-type> <name> <ip> <port> @ <master-name> <master-ip> <master-port>
代码语言:javascript
复制
@ 字符之后的内容用于指定主服务器, 这些内容是可选的, 它们仅在 @ 字符之前的内容指定的实例不

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.1 Redis Sentinel 功能
  • 1.2 服务器连接
  • 1.4 故障转移FAILOVER
  • 1.5 配置sentinel
  • 1.6 Sentinel命令操作
  • 1.7 Sentinel发布与订阅信息
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档