一、Redis-Sentinel简介
Sentinel(哨岗、哨兵)是Redis的高可用性(high availability)解决方案:由一个或多个Sentinel实例(instance)组成的Sentinel系统(system)可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,然后由新的主服务器代替已下线的主服务器继续处理命令请求。
二、安装Redis(一主两从)
1、下载Redis安装包
文章源自小柒网-https://www.yangxingzhen.cn/8548.html
[root@k8s-master ~]# yum -y install wget gcc gcc-c++
文章源自小柒网-https://www.yangxingzhen.cn/8548.html
[root@k8s-master ~]# wget https://download.redis.io/releases/redis-6.2.7.tar.gz
文章源自小柒网-https://www.yangxingzhen.cn/8548.html
2、解压软件包
文章源自小柒网-https://www.yangxingzhen.cn/8548.html
[root@k8s-master ~]# tar xf redis-6.2.7.tar.gz
文章源自小柒网-https://www.yangxingzhen.cn/8548.html
3、编译安装
文章源自小柒网-https://www.yangxingzhen.cn/8548.html
[root@k8s-master ~]# cd redis-6.2.7
文章源自小柒网-https://www.yangxingzhen.cn/8548.html
[root@k8s-master redis-6.2.7]# make && make install
文章源自小柒网-https://www.yangxingzhen.cn/8548.html
4、创建Redis配置文件
文章源自小柒网-https://www.yangxingzhen.cn/8548.html
[root@k8s-master redis-6.2.7]# mkdir -p /opt/redis-sentinel
文章源自小柒网-https://www.yangxingzhen.cn/8548.html
[root@k8s-master redis-6.2.7]# cd /opt/redis-sentinel
# Master
[root@k8s-master redis-sentinel]# vim redis-master.conf
# 绑定IP地址
bind 0.0.0.0
# 监听端口
port 6379
# 自定义密码
requirepass "123456"
# 超时时间
timeout 0
# 后台运行
daemonize yes
dbfilename "dump.rdb"
dir "/data/redis-sentinel/redis-master"
appendonly yes
save 3600 1
save 300 100
save 60 10000
pidfile "/var/run/redis_6379.pid"
logfile "/data/redis-sentinel/logs/redis_6379.log"
appendfsync everysec
# 设定连接主节点所使用的密码
masterauth "123456"
# Slave1
[root@k8s-master redis-sentinel]# vim redis-slave1.conf
# 绑定IP地址
bind 0.0.0.0
# 监听端口
port 6380
# 自定义密码
requirepass "123456"
# 超时时间
timeout 0
# 后台运行
daemonize yes
dbfilename "dump.rdb"
dir "/data/redis-sentinel/redis-slave1"
appendonly yes
save 3600 1
save 300 100
save 60 10000
pidfile "/var/run/redis_6380.pid"
logfile "/data/redis-sentinel/logs/redis_6380.log"
appendfsync everysec
# 设定连接主节点所使用的密码
masterauth "123456"
# 设置主Redis的地址和端口
slaveof 10.10.50.24 6379
# Slave2
[root@k8s-master redis-sentinel]# vim redis-slave2.conf
# 绑定IP地址
bind 0.0.0.0
# 监听端口
port 6381
# 自定义密码
requirepass "123456"
# 超时时间
timeout 0
# 后台运行
daemonize yes
dbfilename "dump.rdb"
dir "/data/redis-sentinel/redis-slave2"
appendonly yes
save 3600 1
save 300 100
save 60 10000
pidfile "/var/run/redis_6381.pid"
logfile "/data/redis-sentinel/logs/redis_6381.log"
appendfsync everysec
# 设定连接主节点所使用的密码
masterauth "123456"
# 设置主Redis的地址和端口
slaveof 10.10.50.24 6379
5、创建数据目录和日志目录
[root@k8s-master redis-sentinel]# mkdir -p /data/redis-sentinel/{redis-master,redis-slave1,redis-slave2,logs}
6、启动Redis
[root@k8s-master redis-sentinel]# redis-server redis-master.conf
[root@k8s-master redis-sentinel]# redis-server redis-slave1.conf
[root@k8s-master redis-sentinel]# redis-server redis-slave2.conf
7、查看Redis是否启动
[root@k8s-master redis-sentinel]# netstat -lntup |egrep "6379|6380|6381"
8、访问Redis,查看主从状态
[root@k8s-master redis-sentinel]# redis-cli -p 6379
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=10.10.50.24,port=6380,state=online,offset=224,lag=0
slave1:ip=10.10.50.24,port=6381,state=online,offset=224,lag=0
master_failover_state:no-failover
master_replid:9e6a40a6755363335f6c8fe8d65a433a867ee1c1
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:224
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:224
9、写入测试数据
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> set domain www.yangxingzhen.cn
OK
127.0.0.1:6379> get domain
"www.yangxingzhen.cn"
10、查看从库数据是否同步
[root@k8s-master redis-sentinel]# redis-cli -p 6380
127.0.0.1:6380> auth 123456
OK
127.0.0.1:6380> get domain
"www.yangxingzhen.cn"
[root@k8s-master redis-sentinel]# redis-cli -p 6381
127.0.0.1:6381> auth 123456
OK
127.0.0.1:6381> get domain
"www.yangxingzhen.cn"
三、安装Redis-Sentinel(三节点)
1、配置redis-sentinel.conf配置文件
# Sentinel-1
[root@k8s-master redis-sentinel]# vim redis-sentinel-1.conf
# 哨兵的端口号
port 26379
# 设定密码认证
requirepass "123456"
# 后台运行
daemonize yes
# sentinel日志
logfile "/data/redis-sentinel/logs/sentinel_26379.log"
# 数据目录
dir "/data/redis-sentinel/redis-sentinel1"
# 配置哨兵的监控参数
# 格式:sentinel monitor <master-name> <ip> <redis-port> <quorum>
# master-name是为这个被监控的master起的名字
# ip是被监控的master的IP或主机名。因为Docker容器之间可以使用容器名访问,所以这里写master节点的容器名
# redis-port是被监控节点所监听的端口号
# quorom设定了当几个哨兵判定这个节点失效后,才认为这个节点真的失效了
sentinel monitor redis-sentinel 10.10.50.24 6379 2
# 连接主节点的密码
# 格式:sentinel auth-pass <master-name> <password>
sentinel auth-pass redis-sentinel 123456
# master在连续多长时间无法响应PING指令后,就会主观判定节点下线,默认是30秒
# 格式:sentinel down-after-milliseconds <master-name> <milliseconds>
sentinel down-after-milliseconds redis-sentinel 30000
# 指定了在发生failover主备切换时最多可以有多少个slave同时对新的master进行同步,这个数字越小,完成failover所需的时间就越长
sentinel parallel-syncs redis-sentinel 1
# 故障转移的超时时间,默认3分钟
sentinel failover-timeout redis-sentinel 5000
# Sentinel-2
[root@k8s-master redis-sentinel]# vim redis-sentinel-2.conf
# 哨兵的端口号
port 26380
# 后台运行
daemonize yes
# 设定密码认证
requirepass "123456"
# sentinel日志
logfile "/data/redis-sentinel/logs/sentinel_26380.log"
# 数据目录
dir "/data/redis-sentinel/redis-sentinel2"
# 配置哨兵的监控参数
# 格式:sentinel monitor <master-name> <ip> <redis-port> <quorum>
# master-name是为这个被监控的master起的名字
# ip是被监控的master的IP或主机名。因为Docker容器之间可以使用容器名访问,所以这里写master节点的容器名
# redis-port是被监控节点所监听的端口号
# quorom设定了当几个哨兵判定这个节点失效后,才认为这个节点真的失效了
sentinel monitor redis-sentinel 10.10.50.24 6379 2
# 连接主节点的密码
# 格式:sentinel auth-pass <master-name> <password>
sentinel auth-pass redis-sentinel 123456
# master在连续多长时间无法响应PING指令后,就会主观判定节点下线,默认是30秒
# 格式:sentinel down-after-milliseconds <master-name> <milliseconds>
sentinel down-after-milliseconds redis-sentinel 30000
# 指定了在发生failover主备切换时最多可以有多少个slave同时对新的master进行同步,这个数字越小,完成failover所需的时间就越长
sentinel parallel-syncs redis-sentinel 1
# 故障转移的超时时间,默认3分钟
sentinel failover-timeout redis-sentinel 5000
# Sentinel-3
[root@k8s-master redis-sentinel]# vim redis-sentinel-3.conf
# 哨兵的端口号
port 26381
# 后台运行
daemonize yes
# 设定密码认证
requirepass "123456"
# sentinel日志
logfile "/data/redis-sentinel/logs/sentinel_26381.log"
# 数据目录
dir "/data/redis-sentinel/redis-sentinel3"
# 配置哨兵的监控参数
# 格式:sentinel monitor <master-name> <ip> <redis-port> <quorum>
# master-name是为这个被监控的master起的名字
# ip是被监控的master的IP或主机名。因为Docker容器之间可以使用容器名访问,所以这里写master节点的容器名
# redis-port是被监控节点所监听的端口号
# quorom设定了当几个哨兵判定这个节点失效后,才认为这个节点真的失效了
sentinel monitor redis-sentinel 10.10.50.24 6379 2
# 连接主节点的密码
# 格式:sentinel auth-pass <master-name> <password>
sentinel auth-pass redis-sentinel 123456
# master在连续多长时间无法响应PING指令后,就会主观判定节点下线,默认是30秒
# 格式:sentinel down-after-milliseconds <master-name> <milliseconds>
sentinel down-after-milliseconds redis-sentinel 30000
# 指定了在发生failover主备切换时最多可以有多少个slave同时对新的master进行同步,这个数字越小,完成failover所需的时间就越长
sentinel parallel-syncs redis-sentinel 1
# 故障转移的超时时间,默认3分钟
sentinel failover-timeout redis-sentinel 5000
2、创建数据目录
[root@k8s-master redis-sentinel]# mkdir -p /data/redis-sentinel/redis-sentinel{1..3}
3、启动sentinel服务
[root@k8s-master redis-sentinel]# redis-sentinel redis-sentinel-1.conf
[root@k8s-master redis-sentinel]# redis-sentinel redis-sentinel-2.conf
[root@k8s-master redis-sentinel]# redis-sentinel redis-sentinel-3.conf
4、查询进程和端口
[root@k8s-master redis-sentinel]# ps -ef |grep redis-sentinel
[root@k8s-master redis-sentinel]# netstat -lntup |egrep "6379|6380|6381"
5、模拟主库宕机,验证sentinel是否起作用
[root@k8s-master redis-sentinel]# redis-cli
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> shutdown
not connected>
6、查看sentinel日志
[root@k8s-master redis-sentinel]# tail -fn 20 /data/redis-sentinel/logs/sentinel_26379.log
22345:X 28 Nov 2022 16:50:10.018 # +sdown master redis-sentinel 10.10.50.24 6379
22345:X 28 Nov 2022 16:50:10.032 # +new-epoch 1
22345:X 28 Nov 2022 16:50:10.037 # +vote-for-leader fb1374c196d4605be7efc26fdfab6520a61f5370 1
22345:X 28 Nov 2022 16:50:10.082 # +odown master redis-sentinel 10.10.50.24 6379 #quorum 3/2
22345:X 28 Nov 2022 16:50:10.082 # Next failover delay: I will not start a failover before Mon Nov 28 16:50:20 2022
22345:X 28 Nov 2022 16:50:10.687 # +config-update-from sentinel fb1374c196d4605be7efc26fdfab6520a61f5370 10.10.50.24 26380 @ redis-sentinel 10.10.50.24 6379
22345:X 28 Nov 2022 16:50:10.687 # +switch-master redis-sentinel 10.10.50.24 6379 10.10.50.24 6380
22345:X 28 Nov 2022 16:50:10.690 * +slave slave 10.10.50.24:6381 10.10.50.24 6381 @ redis-sentinel 10.10.50.24 6380
22345:X 28 Nov 2022 16:50:10.690 * +slave slave 10.10.50.24:6379 10.10.50.24 6379 @ redis-sentinel 10.10.50.24 6380
22345:X 28 Nov 2022 16:50:40.694 # +sdown slave 10.10.50.24:6379 10.10.50.24 6379 @ redis-sentinel 10.10.50.24 6380
sentinel在监测到主Redis宕机之后,通过选举,将一个从Redis选定为新的主Redis。通过查看sentinel日志可以发现,选定6380为新的主Redis,同时将另外两个Redis作为从Redis。
注意:选定6380为主Redis后,所有的配置文件都会被修改,主要是重新建立主从关系。
6379会新增:slaveof 10.10.50.24 6380
6380会删掉:slaveof 10.10.50.24 6379
6381会修改:slaveof 10.10.50.24 6380
由于6379服务已经关掉,所以虽然sentinel将6379作为6380的从服务,但是没有真正的建立。
此时需要重新启动6379服务,sentinel会重新建立一次主从关系
[root@k8s-master redis-sentinel]# redis-server redis-master.conf
7、查询主从状态
[root@k8s-master redis-sentinel]# redis-cli -p 6380
127.0.0.1:6380> auth 123456
OK
127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=10.10.50.24,port=6381,state=online,offset=161952,lag=0
slave1:ip=10.10.50.24,port=6379,state=online,offset=161952,lag=0
master_failover_state:no-failover
master_replid:14fa9312ad9c8b7ff68fb7bf5b5a7e0d0789510a
master_replid2:1ad6c07f50ca34f5f12a90d79c518ce4d3b82d35
master_repl_offset:161952
second_repl_offset:21286
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:161952
[root@k8s-master redis-sentinel]# redis-cli -p 26379
127.0.0.1:26379> auth 123456
OK
127.0.0.1:26379> sentinel masters
1) 1) "name"
2) "redis-sentinel"
3) "ip"
4) "10.10.50.24"
5) "port"
6) "6380"
7) "runid"
8) "e112701a22b3a7c288f91ac23887834f8e17af96"
9) "flags"
10) "master"
11) "link-pending-commands"
12) "0"
13) "link-refcount"
14) "1"
15) "last-ping-sent"
16) "0"
17) "last-ok-ping-reply"
18) "899"
19) "last-ping-reply"
20) "899"
8、Sentinel的工作原理总结
1)每个Sentinel以每秒钟一次的频率向它所知的Master,Slave以及其他Sentinel实例发送一个 PING 命令。
2)如果一个实例(instance)距离最后一次有效回复PING命令的时间超过 down-after-milliseconds选项所指定的值,则这个实例会被Sentinel标记为主观下线。
3)如果一个Master被标记为主观下线,则正在监视这个Master的所有Sentinel要以每秒一次的频率确认Master的确进入了主观下线状态。
4)当有足够数量的 Sentinel(大于等于配置文件指定的值)在指定的时间范围内确认Master的确进入了主观下线状态,则Master会被标记为客观下线 。
5)在一般情况下,每个Sentinel会以每 10 秒一次的频率向它已知的所有Master,Slave发送INFO命令 。
6)当Master被Sentinel标记为客观下线时,Sentinel向下线的Master的所有Slave发送INFO命令的频率会从10秒一次改为每秒一次 。
7)若没有足够数量的Sentinel同意Master已经下线,Master的客观下线状态就会被移除。
若Master重新向Sentinel的PING命令返回有效回复,Master的主观下线状态就会被移除。
至此,Linux部署Redis-Sentinel集群完毕。
若文章图片、下载链接等信息出错,请在评论区留言反馈,博主将第一时间更新!如本文“对您有用”,欢迎随意打赏,谢谢!
![weinxin](https://www.yangxingzhen.com/images/weixin.jpg)
![weinxin](https://www.yangxingzhen.com/images/weixingongzhonghao.png)
评论