前言
前文学习了redis的主从复制,通过配置实现了一主多从,既读写分离又互为备份。但是如果出于不可抗力,主服务器下线了,那么redis集群将失去写功能,如果可以实现主服务器掉线后,自动选举从服务器升级为主服务器,那上述问题自然迎刃而解。事实上从redis2.6版本开始,便有了这么一种解决方案——Sentinel。(PS:实验Redis版本为5.0.5)
Sentinel哨兵
哨兵是由一个或多个Sentinel实例组成哨兵集群,监控任意多个主服务器和从服务器。当主服务器下线后,将自动从在线的从服务器中选一台升级为主服务器。并将原主服务器标记为从服务器。实现了主从服务器的自主切换,提高了redis的可用性。
准备
前文使用三台虚拟机搭建了一主二从,今天使用另外一种方法,通过复制三份redis.conf文件,修改端口实现单机主从复制。
-
准备三个配置文件,分别使用端口6379、6380、6381
# redis-6379.conf ... bind 127.0.0.1 protected-mode yes port 6379 daemonize yes ... # redis-6380.conf ... bind 127.0.0.1 protected-mode yes port 6380 daemonize yes # redis-6381.conf ... bind 127.0.0.1 protected-mode yes port 6381 daemonize yes
-
为从库配置追加主从复制
# 6379 和 6381中追加以下配置 slaveof 127.0.0.1 6380
-
启动主从服务器
redis-server redis-6379.conf redis-server redis-6380.conf redis-server redis-6381.conf --------------------------------------------------------------------------------------------- [root@VM-0-4-centos etc]# ps -ef|grep redis root 6321 1 0 21:36 ? 00:00:00 redis-server 127.0.0.1:6379 root 6342 1 0 21:36 ? 00:00:00 redis-server 127.0.0.1:6380 root 6372 1 0 21:36 ? 00:00:00 redis-server 127.0.0.1:6381 root 6418 31466 0 21:36 pts/3 00:00:00 grep --color=auto redis
配置哨兵
-
修改
sentinel-6379.conf
配置文件指定master的IP和port,quorum,其中quorum的值用于设定最少需要几个Sentinel实例对master失去连接时判定为主机下线。// 修改默认启动方式为后台启动,这里为方便查看日志,未做修改 daemonize yes // 监听主机ip port rum sentinel monitor mymaster 192.168.204.121 6380 1
-
启动
[root@VM-0-4-centos etc]# redis-sentinel sentinel-6379.conf 6903:X 10 Aug 2020 21:39:08.389 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 6903:X 10 Aug 2020 21:39:08.389 # Redis version=5.0.5, bits=64, commit=00000000, modified=0, pid=6903, just started 6903:X 10 Aug 2020 21:39:08.389 # Configuration loaded _._ _.-``__ ''-._ _.-`` `. `_. ''-._ Redis 5.0.5 (00000000/0) 64 bit .-`` .-```. ```/ _.,_ ''-._ ( ' , .-` | `, ) Running in sentinel mode |`-._`-...-` __...-.``-._|'` _.-'| Port: 26379 | `-._ `._ / _.-' | PID: 6903 `-._ `-._ `-./ _.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | http://redis.io `-._ `-._`-.__.-'_.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | `-._ `-._`-.__.-'_.-' _.-' `-._ `-.__.-' _.-' `-._ _.-' `-.__.-' 6903:X 10 Aug 2020 21:39:08.390 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128. 6903:X 10 Aug 2020 21:39:08.390 # Sentinel ID is de4d4a52a39c8e4532dca5a91679749aeffbfccd 6903:X 10 Aug 2020 21:39:08.390 # +monitor master mymaster 127.0.0.1 6380 quorum 1 6903:X 10 Aug 2020 21:39:08.392 * +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6380 6903:X 10 Aug 2020 21:39:08.401 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380
如上所示,单哨兵启动,监控主(127.0.0.1 6380)从(127.0.0.1 6379、127.0.0.1 6381)工作状态。
-
验证主从切换
# 关闭主数据库 [root@VM-0-4-centos etc]# ps -ef|grep redis root 6321 1 0 21:36 ? 00:00:00 redis-server 127.0.0.1:6379 root 6342 1 0 21:36 ? 00:00:00 redis-server 127.0.0.1:6380 root 6372 1 0 21:36 ? 00:00:00 redis-server 127.0.0.1:6381 root 6903 31466 0 21:39 pts/3 00:00:00 redis-sentinel *:26379 [sentinel] root 7425 26828 0 21:42 pts/0 00:00:00 grep --color=auto redis [root@VM-0-4-centos etc]# kill -9 6342 ---↓↓↓哨兵日志↓↓↓----------------------------------------------------------------------- 6903:X 10 Aug 2020 21:42:41.759 # +sdown master mymaster 127.0.0.1 6380 6903:X 10 Aug 2020 21:42:41.759 # +odown master mymaster 127.0.0.1 6380 #quorum 1/1 6903:X 10 Aug 2020 21:42:41.759 # +new-epoch 2 6903:X 10 Aug 2020 21:42:41.759 # +try-failover master mymaster 127.0.0.1 6380 6903:X 10 Aug 2020 21:42:41.764 # +vote-for-leader de4d4a52a39c8e4532dca5a91679749aeffbfccd 2 6903:X 10 Aug 2020 21:42:41.764 # +elected-leader master mymaster 127.0.0.1 6380 6903:X 10 Aug 2020 21:42:41.764 # +failover-state-select-slave master mymaster 127.0.0.1 6380 6903:X 10 Aug 2020 21:42:41.835 # +selected-slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380 6903:X 10 Aug 2020 21:42:41.835 * +failover-state-send-slaveof-noone slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380 6903:X 10 Aug 2020 21:42:41.890 * +failover-state-wait-promotion slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380 6903:X 10 Aug 2020 21:42:42.434 # +promoted-slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380 6903:X 10 Aug 2020 21:42:42.434 # +failover-state-reconf-slaves master mymaster 127.0.0.1 6380 6903:X 10 Aug 2020 21:42:42.519 * +slave-reconf-sent slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6380 6903:X 10 Aug 2020 21:42:43.457 * +slave-reconf-inprog slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6380 6903:X 10 Aug 2020 21:42:43.457 * +slave-reconf-done slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6380 6903:X 10 Aug 2020 21:42:43.512 # +failover-end master mymaster 127.0.0.1 6380 6903:X 10 Aug 2020 21:42:43.512 # +switch-master mymaster 127.0.0.1 6380 127.0.0.1 6381 6903:X 10 Aug 2020 21:42:43.512 * +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6381 6903:X 10 Aug 2020 21:42:43.512 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381 6903:X 10 Aug 2020 21:42:46.550 # +sdown slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381
如上所示,主从切换经过以下几个步骤:
- 哨兵检测到master下线
- 哨兵通知所有哨兵进行测试(这里是单机,所以结果为1/1)
- 哨兵(集群)超过半数认定master已离线,发起纪元更新
- 哨兵选举执行者执行主从切换
- 哨兵选举的leader将当前master标记为slave
- 哨兵从当前slave中选取一个标记为master
- 标记结束,新的master(6381)连接仍存活的slave-6379以及降级为slave的6380
-
重新连接
原master(6380)断线重连后,自动以slave的身份继续工作
[root@VM-0-4-centos etc]# redis-server redis-6380.conf 10338:C 10 Aug 2020 22:03:17.687 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 10338:C 10 Aug 2020 22:03:17.687 # Redis version=5.0.5, bits=64, commit=00000000, modified=0, pid=10338, just started 10338:C 10 Aug 2020 22:03:17.687 # Configuration loaded ---↓↓↓哨兵日志↓↓↓----------------------------------------------------------------------- 6903:X 10 Aug 2020 22:03:18.262 # -sdown slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381 6903:X 10 Aug 2020 22:03:28.230 * +convert-to-slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381
如上所示,6380重连后,哨兵将6380离线的状态解除,并将6380转为slave of 6381
哨兵集群
-
复制哨兵配置
sentinel-6379.conf
sentinel-6380.conf
sentinel-6381.conf
-
修改哨兵port及myid
这里部署3台哨兵,quorum取(n/2)+1 = 2
# sentinel-6379.conf port 26379 sentinel myid de4d4a52a39c8e4532dca5a91679749aeffbfccd sentinel monitor mymaster 127.0.0.1 6381 2 # sentinel-6380.conf port 26380 sentinel myid de4d4a52a39c8e4532dca5a91679749aeffbfccc sentinel monitor mymaster 127.0.0.1 6381 2 # sentinel-6381.conf port 26381 sentinel myid de4d4a52a39c8e4532dca5a91679749aeffbfcce sentinel monitor mymaster 127.0.0.1 6381 2
-
启动三个哨兵
[root@VM-0-4-centos etc]# redis-sentinel sentinel-6379.conf ... 11749:X 10 Aug 2020 22:13:51.528 # Sentinel ID is de4d4a52a39c8e4532dca5a91679749aeffbfccd 11749:X 10 Aug 2020 22:13:51.528 # +monitor master mymaster 127.0.0.1 6381 quorum 1 [root@VM-0-4-centos etc]# redis-sentinel sentinel-6380.conf ... 11916:X 10 Aug 2020 22:14:57.418 # Sentinel ID is de4d4a52a39c8e4532dca5a91679749aeffbfccc 11916:X 10 Aug 2020 22:14:57.418 # +monitor master mymaster 127.0.0.1 6381 quorum 2 11916:X 10 Aug 2020 22:14:57.419 * +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6381 11916:X 10 Aug 2020 22:14:57.429 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381 11916:X 10 Aug 2020 22:14:58.832 * +sentinel sentinel de4d4a52a39c8e4532dca5a91679749aeffbfccd 127.0.0.1 26379 @ mymaster 127.0.0.1 6381 11916:X 10 Aug 2020 22:14:58.841 # +new-epoch 2 [root@VM-0-4-centos ~]# cd /usr/local/redis/etc/ [root@VM-0-4-centos etc]# redis-sentinel sentinel-6381.conf ... 12131:X 10 Aug 2020 22:16:08.834 # Sentinel ID is de4d4a52a39c8e4532dca5a91679749aeffbfcce 12131:X 10 Aug 2020 22:16:08.834 # +monitor master mymaster 127.0.0.1 6381 quorum 2 12131:X 10 Aug 2020 22:16:08.836 * +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6381 12131:X 10 Aug 2020 22:16:08.840 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381 12131:X 10 Aug 2020 22:16:10.244 * +sentinel sentinel de4d4a52a39c8e4532dca5a91679749aeffbfccd 127.0.0.1 26379 @ mymaster 127.0.0.1 6381 12131:X 10 Aug 2020 22:16:10.252 # +new-epoch 2 12131:X 10 Aug 2020 22:16:10.769 * +sentinel sentinel de4d4a52a39c8e4532dca5a91679749aeffbfccc 127.0.0.1 26380 @ mymaster 127.0.0.1 6381
如上所示,哨兵只需要配置master即可自动识别slave和其他的哨兵。
-
验证主从切换
[root@VM-0-4-centos ~]# ps -ef|grep redis root 6321 1 0 21:36 ? 00:00:02 redis-server 127.0.0.1:6379 root 6372 1 0 21:36 ? 00:00:02 redis-server 127.0.0.1:6381 root 10339 1 0 22:03 ? 00:00:01 redis-server 127.0.0.1:6380 root 11749 31466 0 22:13 pts/3 00:00:00 redis-sentinel *:26379 [sentinel] root 11916 26828 0 22:14 pts/0 00:00:00 redis-sentinel *:26380 [sentinel] root 12131 12033 0 22:16 pts/1 00:00:00 redis-sentinel *:26381 [sentinel] root 12468 12407 0 22:18 pts/2 00:00:00 grep --color=auto redis [root@VM-0-4-centos ~]# kill -9 6372 ---↓↓↓哨兵日志选取其中一台↓↓↓----------------------------------------------------------------------- 11749:X 10 Aug 2020 22:18:41.165 # +sdown master mymaster 127.0.0.1 6381 11749:X 10 Aug 2020 22:18:41.165 # +odown master mymaster 127.0.0.1 6381 #quorum 1/1 11749:X 10 Aug 2020 22:18:41.165 # +new-epoch 3 11749:X 10 Aug 2020 22:18:41.165 # +try-failover master mymaster 127.0.0.1 6381 11749:X 10 Aug 2020 22:18:41.170 # +vote-for-leader de4d4a52a39c8e4532dca5a91679749aeffbfccd 3 11749:X 10 Aug 2020 22:18:41.185 # de4d4a52a39c8e4532dca5a91679749aeffbfcce voted for de4d4a52a39c8e4532dca5a91679749aeffbfccd 3 11749:X 10 Aug 2020 22:18:41.185 # de4d4a52a39c8e4532dca5a91679749aeffbfccc voted for de4d4a52a39c8e4532dca5a91679749aeffbfccd 3 11749:X 10 Aug 2020 22:18:41.246 # +elected-leader master mymaster 127.0.0.1 6381 11749:X 10 Aug 2020 22:18:41.246 # +failover-state-select-slave master mymaster 127.0.0.1 6381 11749:X 10 Aug 2020 22:18:41.329 # +selected-slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381 11749:X 10 Aug 2020 22:18:41.330 * +failover-state-send-slaveof-noone slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381 11749:X 10 Aug 2020 22:18:41.406 * +failover-state-wait-promotion slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381 11749:X 10 Aug 2020 22:18:42.204 # +promoted-slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381 11749:X 10 Aug 2020 22:18:42.204 # +failover-state-reconf-slaves master mymaster 127.0.0.1 6381 11749:X 10 Aug 2020 22:18:42.265 * +slave-reconf-sent slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6381 11749:X 10 Aug 2020 22:18:43.250 * +slave-reconf-inprog slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6381 11749:X 10 Aug 2020 22:18:43.250 * +slave-reconf-done slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6381 11749:X 10 Aug 2020 22:18:43.305 # +failover-end master mymaster 127.0.0.1 6381 11749:X 10 Aug 2020 22:18:43.305 # +switch-master mymaster 127.0.0.1 6381 127.0.0.1 6380 11749:X 10 Aug 2020 22:18:43.305 * +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6380 11749:X 10 Aug 2020 22:18:43.305 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380 11749:X 10 Aug 2020 22:18:46.339 # +sdown slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380
如上所示,其中一台发现master失联后,发起全员测试 -> 投票选举 -> 标记下线 -> slave升级为master -> 新master重连其余实例,同单机哨兵模式一致,只在于多了几台哨兵共同测定master是否离线。
PS:哨兵集群最好为单数台,便于计算出中间值。
PS:quorum值设定具有一定参考意义,但是无论设定为多少,哨兵集群只会在超过半数哨兵认定master离线时发起主从切换。
-
重新连接
[root@VM-0-4-centos etc]# redis-server redis-6381.conf 13449:C 10 Aug 2020 22:25:48.758 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 13449:C 10 Aug 2020 22:25:48.758 # Redis version=5.0.5, bits=64, commit=00000000, modified=0, pid=13449, just started 13449:C 10 Aug 2020 22:25:48.758 # Configuration loaded -------------哨兵打印6381重连并且转化为slave的日志----------------------------- 11749:X 10 Aug 2020 22:25:49.418 # -sdown slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380 11749:X 10 Aug 2020 22:25:59.352 * +convert-to-slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380
END
-
查看到原redis.conf中配置发生改变
slaveof 127.0.0.1 6380 变为: replicaof 127.0.0.1 6380
-
sentinel.conf文件末尾追加了一部分内容,用于标记当前集群内的master、slave、sentinel信息。
sentinel leader-epoch mymaster 3 sentinel known-replica mymaster 127.0.0.1 6379 sentinel known-replica mymaster 127.0.0.1 6381 sentinel known-sentinel mymaster 127.0.0.1 26381 de4d4a52a39c8e4532dca5a91679749aeffbfcce sentinel known-sentinel mymaster 127.0.0.1 26380 de4d4a52a39c8e4532dca5a91679749aeffbfccc sentinel current-epoch 3
-