上一篇文章我们讲了redis主从节点的安装配置,为了实现客户端连接的读写分离,安装哨兵sentinel模式;
配置文件sentinel.conf修改
还是先把没有注释的配置拷贝出来
sentinel.conf的位置和redis.conf在一起,我这里是/servers/redis-6.0.6/sentinel.conf
[root@localhost redis-6.0.6]# cat sentinel.conf | grep -v ^# | grep -v ^$ > conf/sentinel.conf
[root@localhost redis-6.0.6]# vim conf/sentinel.conf
port 26379 #运行的端口
daemonize yes #是否守护进程
pidfile /var/run/redis-sentinel.pid
logfile "sentinel.log" #日志文件名
dir /tmp #日志的位置
sentinel monitor mymaster 10.1.1.114 6379 2 # Sentinel去监视一个名为mymaster 的主redis实例,这个主实例的IP地址为本机地址10.1.1.114,端口号为6379,而将这个主实例判断为失效至少需要2个 Sentinel进程的同意,只要同意Sentinel的数量不达标,自动failover就不会执行
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
配置说明 参考https://www.cnblogs.com/kevingrace/p/9004460.html
启动
[root@localhost redis-6.0.6]# src/redis-sentinel conf/sentinel.conf
[root@localhost redis-6.0.6]# cat sentinel.log
24620:X 13 Oct 2020 17:07:23.786 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
24620:X 13 Oct 2020 17:07:23.787 # Redis version=6.0.6, bits=64, commit=00000000, modified=0, pid=24620, just started
24620:X 13 Oct 2020 17:07:23.787 # Configuration loaded
24621:X 13 Oct 2020 17:07:23.792 * Increased maximum number of open files to 10032 (it was originally set to 1024).
24621:X 13 Oct 2020 17:07:23.795 * Running mode=sentinel, port=26379.
24621:X 13 Oct 2020 17:07:23.795 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
24621:X 13 Oct 2020 17:07:23.798 # Sentinel ID is 404a494a8646a734f66a3918603d8d8cfd322365
24621:X 13 Oct 2020 17:07:23.798 # +monitor master mymaster 127.0.0.1 6379 quorum 2
24621:X 13 Oct 2020 17:07:23.810 * +slave slave 10.199.0.254:6379 10.199.0.254 6379 @ mymaster 127.0.0.1 6379
3台哨兵
- 因为至少2台哨兵发现masterdown机之后,才能执行failover选举新的master,所以至少要3台哨兵
- 按上述步骤,配置10.1.1.114和10.1.1.115的哨兵,注意配置文件中
sentinel monitor mymaster 10.1.1.114 6379 2
这个ip地址始终是master 114的地址
3台哨兵分别启动
现在哨兵模式就设置完成了
查看哨兵的状态
[root@localhost redis-6.0.6]# src/redis-cli -p 26379 # 通过哨兵26379端口进行查看
127.0.0.1:26379> info sentinel
Sentinel
sentinel_masters:1 #表示本机上的sentinel监听了1个redis master 节点
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=127.0.0.1:6379,slaves=1,sentinels=3
#此处表示master0的name是mymaster,状态ok,地址就是本机,有一个slaves,有两个哨兵在监听这个主机
Sentinel 命令
以下列出的是 Sentinel 接受的命令:
PING :返回 PONG 。
SENTINEL masters :列出所有被监视的主服务器,以及这些主服务器的当前状态。
SENTINEL slaves <master name>:列出给定主服务器的所有从服务器,以及这些从服务器的当前状态。
SENTINEL get-master-addr-by-name <master name>: 返回给定名字的主服务器的 IP 地址和端口号。 如果这个主服务器正在执行故障转移操作, 或者针对这个主服务器的故障转移操作已经完成, 那么这个命令返回新的主服务器的 IP 地址和端口号。
SENTINEL reset <pattern>: 重置所有名字和给定模式 pattern 相匹配的主服务器。 pattern 参数是一个 Glob 风格的模式。 重置操作清楚主服务器目前的所有状态, 包括正在执行中的故障转移, 并移除目前已经发现和关联的, 主服务器的所有从服务器和 Sentinel 。
SENTINEL failover <master name> : 当主服务器失效时, 在不询问其他 Sentinel 意见的情况下, 强制开始一次自动故障迁移 (不过发起故障转移的 Sentinel 会向其他 Sentinel 发送一个新的配置,其他 Sentinel 会根据这个配置进行相应的更新)。
模拟down机
- 我们在master机器114上,手动shutdown服务
[root@localhost redis-6.0.6]# src/redis-cli
127.0.0.1:6379> shutdown
- 在113从节点机器上,查看sentinel日志
[root@localhost redis-6.0.6]# tail -f /tmp/sentinel.log
2977:X 14 Oct 2020 11:00:33.767 # +sdown master mymaster 10.199.0.114 6379 #一台发现down机,主观down机
2977:X 14 Oct 2020 11:00:33.855 # +new-epoch 8
2977:X 14 Oct 2020 11:00:33.860 # +vote-for-leader 50f78350077e8289ab5cb4eb443ab64eba997cbf 8 #选举新的哨兵master,用来处理主从切换,迁移
2977:X 14 Oct 2020 11:00:33.860 # +odown master mymaster 10.199.0.114 6379 #quorum 3/2 #真正odown 客观down机,准备主从切换
2977:X 14 Oct 2020 11:00:33.860 # Next failover delay: I will not start a failover before Wed Oct 14 11:06:34 2020
2977:X 14 Oct 2020 11:00:34.199 # +config-update-from sentinel 50f78350077e8289ab5cb4eb443ab64eba997cbf 10.199.0.115 26379 @ mymaster 10.199.0.114 6379
2977:X 14 Oct 2020 11:00:34.199 # +switch-master mymaster 10.199.0.114 6379 10.199.0.115 6379 #把114主节点切换到115上
2977:X 14 Oct 2020 11:00:34.199 * +slave slave 10.199.0.113:6379 10.199.0.113 6379 @ mymaster 10.199.0.115 6379
2977:X 14 Oct 2020 11:00:34.199 * +slave slave 10.199.0.254:6379 10.199.0.254 6379 @ mymaster 10.199.0.115 6379
2977:X 14 Oct 2020 11:00:34.200 * +slave slave 10.199.0.114:6379 10.199.0.114 6379 @ mymaster 10.199.0.115 6379
2977:X 14 Oct 2020 11:01:04.206 # +sdown slave 10.199.0.114:6379 10.199.0.114 6379 @ mymaster 10.199.0.115 6379
2977:X 14 Oct 2020 11:03:34.694 * +fix-slave-config slave 10.199.0.113:6379 10.199.0.113 6379 @ mymaster 10.199.0.115 6379 #修复113的配置,relicationOf 改成115
- 我们登录115,查看集群replication,可以看到115已经升级为主节点
[root@localhost redis-6.0.6]# src/redis-cli
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=10.199.0.113,port=6379,state=online,offset=500696,lag=0
master_replid:e8c5a4739fa4d12d8c7917bf596f618fdf7b81ea
master_replid2:4004d23739e1682f41c769ba2d203d31bb4e6373
master_repl_offset:500696
second_repl_offset:119538
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:37310
repl_backlog_histlen:463387
127.0.0.1:6379>
并且115和113的conf/redis.conf也相应的调整了
另外,114如果再启动的话,必须自己手动修改配置,增加replicaOf
推荐一个介绍redis的博客 http://doc.redisfans.com/topic/sentinel.html,这个博客把官方的英文文档翻译过来,语法表达都很赞