单哨兵模式
哨兵模式概述
为什么要启动哨兵模式
当我们的主服务器宕机后,要手动的去切换主从模式,这样的人工干预,费事费力,还会造成一段时间我们的服务不能使用。所有我们要使用哨兵模式来解决这一问题。
什么是哨兵模式
哨兵是对Redis的系统的运行情况的监控,它是一个独立进程,功能有二个:
监控主机Redis和从机Redis是否运行正常;
主机Redis出现故障后自动将从机转化为主机;
哨兵工作原理
单个哨兵的工作原理:
单个哨兵,只需要监控主Redis,就可能得到从Redis。
多个哨兵的工作原理:
多个哨兵,不仅同时监控主从Redis,而且哨兵之间互为监控。多个哨兵,不仅同时监控主从Redis,而且哨兵之间互为监控。
多个哨兵,防止哨兵单点故障。
哨兵功能
集群监控:负责监控主从集群中的Master和Slave进程是否正常工作。
故障转移(failover):如果Master宕机,会自动从Slave中选举出新的Master,进行主从自动切换。
配置中心:如果发生了故障转移,Sentinel负责通知客户端新的Master的地址。
消息通知:如果某个redis节点有故障,那么Sentsinel会发送报警消息给系统管理员。
单哨兵模式
在一主多从的环境中,Redis-1为主机,Redis-2、Redis-3为从机,哨兵主机Redis-0
搭建好主从环境、设置环境变量,在操作哨兵设置
设置哨兵
# 配置哨兵文件
cd /usr/local/src/redis-6.2.14
# 过滤并生成精简配置文件
grep -E -v "^$|^#" sentinel.conf > /usr/local/redis/etc/sentinel.conf
# 切换目录
cd /usr/local/redis/etc/
# 修改哨兵配置文件
vim sentinel.conf
# 修改配置内容(mymaster是名字可以修改,但是修改后配置文件里所有名字都要修改)
sentinel monitor mymaster 192.168.7.71 6379 1
# 配置内容后台运行
daemonize yes
# 配置内容哨兵日志文件
logfile "/usr/local/redis/logs/sentinel.log"
# 指定数据存放位置
dir "/usr/local/redis/sentinel-data"
# 配置内容如果设置了密码需要添加(没有设置密码不用管)
sentinel auth-pass Redis1 123456
# 注意:
mymaster:监控主数据的名称,命名时可以使用大小写字母和“.-_”符号
192.168.7.71 6379 1 主机的IP和端口号,1是quorum表示哨兵数majority表示大多数哨兵
quorum表示哨兵数
如果quorum < majority,比如5个哨兵,majority就是3,quorum设置为2,那么就3个哨兵授权就可以执行切换。
但是如果quorum >= majority,那么必须quorum数量的哨兵都授权,比如5个哨兵,quorum是5,那么必须5个哨兵都同意授权,才能执行切换。
启动三台Redis
# 启动Redis服务
redis-server /usr/local/redis/etc/redis.conf
# 启动客户端
redis-cli -h 127.0.0.1 -p 6379
# 如果设置密码需要添加 -a 密码
redis-cli -h 127.0.0.1 -p 6379 -a 123456
# 或进入客户端后在验证密码
redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:7000> AUTH 123456启动哨兵
# 启动哨兵
redis-sentinel /usr/local/redis/etc/sentinel.conf模拟从机宕机
杀死Redis-2从机进程,30秒后观察哨兵日志
注意:如果设置自启日志可能只会显示重启,解决方案在下面。
# 查看服务进程
ps -ef|grep redis
# 显示服务进程
root 5078 1 0 20:20 ? 00:00:05 /usr/local/redis/bin/redis-server 0.0.0.0:6379
root 5521 4867 0 20:59 pts/0 00:00:00 grep --color=auto redis
# 强制关闭服务进程
kill -s 9 5078
# 实时查看哨兵日志
tail -f /var/log/redis/sentinel.log启动Redis-2从机,观察哨兵日志
redis-server /usr/local/redis/etc/redis.conf日志状态及解读
09:30:10.071 # +sdown slave 192.168.7.72 # 1. 哨兵发现从库挂了(主观下线)
09:31:29.078 * +reboot slave 192.168.7.72 # 2. 从库进程重新启动,哨兵检测到了
09:31:29.121 # -sdown slave 192.168.7.72 # 3. 哨兵确认从库已恢复,解除下线标记模拟主机宕机
杀死Redis-1主机进程,30秒后观察哨兵日志
注意:如果设置自启日志可能只会显示重启,解决方案在下面。
# 查看服务进程
ps -ef|grep redis
# 显示服务进程
root 1109 1 0 08:20 ? 00:00:09 /usr/local/redis/bin/redis-server 0.0.0.0:6379
root 3353 2554 0 09:02 pts/0 00:00:00 grep --color=auto redis
# 强制关闭服务进程
kill -s 9 1109启动Redis-1主机,观察哨兵日志
redis-server /usr/local/redis/etc/redis.conf日志状态解读
# 关闭主库后的日志
09:34:17.542 # +sdown master 192.168.7.71 # 1. 哨兵发现主库挂了(主观下线)
09:34:17.544 # +odown master 192.168.7.71 # 2. 客观下线,触发故障转移
09:34:17.544 # +new-epoch 4 # 3. 开启新纪元
09:34:17.544 # +try-failover master 192.168.7.71 # 4. 尝试发起故障转移
09:34:17.552 # +vote-for-leader 0318d09a... # 5. 投票给 Leader
09:34:17.552 # +elected-leader master 192.168.7.71 # 6. 当选 Leader
09:34:17.552 # +failover-state-select-slave # 7. 开始挑选从库
09:34:17.615 # +selected-slave 192.168.7.73 # 8. 选中 7.73 作为新主
09:34:17.615 * +failover-state-send-slaveof-noone # 9. 提升 7.73 为主库
09:34:17.668 * +failover-state-wait-promotion # 10. 等待提升完成
09:34:18.582 # +promoted-slave 192.168.7.73 # 11. 7.73 已升为主库
09:34:18.582 # +failover-state-reconf-slaves # 12. 重新配置其他从库
09:34:18.629 * +slave-reconf-sent 192.168.7.72 # 13. 向 7.72 发送同步命令
09:34:18.904 * +slave-reconf-inprog 192.168.7.72 # 14. 7.72 正在同步数据
09:34:18.905 * +slave-reconf-done 192.168.7.72 # 15. 7.72 同步完成
09:34:18.963 # +failover-end master 192.168.7.71 # 16. 故障转移结束
09:34:18.963 # +switch-master 7.71→7.73 # 17. 🎯 主库切换完成
09:34:18.964 * +slave 192.168.7.72 # 18. 7.72 确认为从库
09:34:18.964 * +slave 192.168.7.71 # 19. 原主 7.71 被加为从库
09:34:48.968 # +sdown slave 192.168.7.71 # 20. 原主未启动,哨兵检测为下线
# 开启原主库后的日志
09:43:53.989 # -sdown slave 192.168.7.71 # 1. 哨兵确认原主已启动,解除下线标记
09:44:03.956 * +convert-to-slave slave 192.168.7.71 # 2. 原主库自动降级为从库,加入集群修改配置文件(解决自动重启)
# 编辑 systemd 服务文件:
vim /etc/systemd/system/redis.service
# 找到这一行:
Restart=on-failure
# 改为:
Restart=no
# 保存后重新加载 systemd:
systemctl daemon-reload
注:测试后可以重新添加回来并重新加载配置即可哨兵连接查询(未测试宕机前的)
如果测试宕机新主库会发生改变
# 您可以使用以下命令测试哨兵连接
redis-cli -p 26379 sentinel masters
# 该命令会返回所有主节点的信息。如果哨兵工作正常,您将看到类似以下的输出:
1) 1) "name"
2) "Redis1"
3) "ip"
4) "192.168.7.71"
5) "port"
6) "6379"
7) "runid"
8) "de55f08918972173509b577321083fd29019e9d4"
9) "flags"
10) "master"
....
# 要通过哨兵获取当前的主节点地址,可以使用以下命令:
redis-cli -p 26379 sentinel get-master-addr-by-name Redis1
# 显示结果
1) "192.168.7.71"
2) "6379"
# 显示从库节点信息
redis-cli -p 26379 SENTINEL slaves Redis1
# 显示结果
1) 1) "name"
2) "192.168.7.72:6379"
3) "ip"
4) "192.168.7.72"
5) "port"
6) "6379"
7) "runid"
8) "9c7fb023b94cf13e064f9a9e94db0b287b53a09a"
9) "flags"
10) "slave"
11) "link-pending-commands"
12) "0"
13) "link-refcount"
14) "1"
15) "last-ping-sent"
16) "0"
17) "last-ok-ping-reply"
18) "598"
19) "last-ping-reply"
20) "598"
21) "down-after-milliseconds"
22) "30000"
23) "info-refresh"
24) "9343"
25) "role-reported"
26) "slave"
27) "role-reported-time"
28) "1586387"
29) "master-link-down-time"
30) "0"
31) "master-link-status"
32) "ok"
33) "master-host"
34) "192.168.7.71"
35) "master-port"
36) "6379"
37) "slave-priority"
38) "100"
39) "slave-repl-offset"
40) "36508"
41) "replica-announced"
42) "1"
2) 1) "name"
2) "192.168.7.73:6379"
3) "ip"
4) "192.168.7.73"
5) "port"
6) "6379"
7) "runid"
8) "3e4acf375fdba9519ed3fd7253372354cf436415"
9) "flags"
10) "slave"
11) "link-pending-commands"
12) "0"
13) "link-refcount"
14) "1"
15) "last-ping-sent"
16) "0"
17) "last-ok-ping-reply"
18) "598"
19) "last-ping-reply"
20) "598"
21) "down-after-milliseconds"
22) "30000"
23) "info-refresh"
24) "9269"
25) "role-reported"
26) "slave"
27) "role-reported-time"
28) "1586387"
29) "master-link-down-time"
30) "0"
31) "master-link-status"
32) "ok"
33) "master-host"
34) "192.168.7.71"
35) "master-port"
36) "6379"
37) "slave-priority"
38) "100"
39) "slave-repl-offset"
40) "36508"
41) "replica-announced"
42) "1"Redis单哨兵模式配置
本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
评论交流
欢迎留下你的想法