前阵子碰得到了一个Redis需求:在一个哨兵模式下,主节点Redis宕掉重启后不要被自动加到原主从集群中。
需求分析
因为哨兵模式下,当一个节点关闭重启后,会被sentinel 进程自动拉到该节点原来所在的集群中;这个需求就是不让后面这个动作 发生。最后的效果就是重启的节点变为单机模式了
尝试
在宕机节点重启前修改redis.conf文件指定一个不存在的节点为主即添加: slaveof 10.0.0.0 6379
参数;结果是失败的删除sentinel的配置文件关于宕机节点的信息;仍然失败
分析
这个需求本质就是想下线一个节点,或者说这台服务器上的redis想做其他用途,也想把这个端口释放掉,即使仍用做redis但也不想还在这个集群中;前面尝试说明这个集群信息存在sentinel中,且存在内存当中。那就需要找到存放集群的元数据并进行更新了
操作
环境
Redis 主从关系
| IP | Port | role |
|---|---|---|
| 10.0.24.17 | 6379 | master |
| 10.0.24.17 | 6380 | slave |
| 10.0.24.17 | 6381 | slave |
Sentinel 信息
| IP | Port |
|---|---|
| 10.0.24.17 | 26379 |
| 10.0.24.17 | 26380 |
| 10.0.24.17 | 26381 |
查看一个sentinel 的配置文件中关于集群信息
root@VM-24-17-centos redis-4.0.9]# tail sentinel_26381.conf
sentinel known-slave mymaster1 10.0.24.17 6381
sentinel known-slave mymaster1 10.0.24.17 6380
sentinel known-sentinel mymaster1 10.0.24.17 26380 3845c18abbd0ea7fa8414e949a4878ca10aca2d4
sentinel known-sentinel mymaster1 10.0.24.17 26379 329a9fc296d9c987d1c4aae176f8e28964b3a84a
sentinel 用到的管理命令
这里介绍下关于sentinel 用到的管理命令
SENTINEL MASTER <master name>
#显示指定master的信息和状态。SENTINEL SLAVES <master name>
#显示指定master的所有slave以及它们的状态。SENTINEL RESET <master name>
#重置master的状态信息,清除其之前的状态信息,以及slaves信息SENTINEL GET-MASTER-ADDR-BY-NAME <master name>
#返回指定master的ip和端口,如果正在进行failover或者failover已经完成,将会显示被提升为master的slave的ip和端口。
将原集群master节点关闭
10.0.24.17:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=10.0.24.17,port=6380,state=online,offset=248201940,lag=0
slave1:ip=10.0.24.17,port=6381,state=online,offset=248201940,lag=1
.....
#关闭该节点
10.0.24.17:6379> shutdown
更新sentinel的集群信息
此时主从已发生切换
10.0.24.17:6381> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=10.0.24.17,port=6380,state=online,offset=248224183,lag=0
登录到一个sentinel节点上 查看当前的所有slave节点
10.0.24.17:26379> sentinel slaves mymaster1
1) 1) "name"
2) "10.0.24.17:6380"
3) "ip"
4) "10.0.24.17"
5) "port"
6) "6380"
......
33) "master-host"
34) "10.0.24.17"
35) "master-port"
36) "6381"
37) "slave-priority"
38) "100"
39) "slave-repl-offset"
40) "248241145"
2) 1) "name"
2) "10.0.24.17:6379"
3) "ip"
4) "10.0.24.17"
5) "port"
6) "6379"
.........
33) "master-link-status"
34) "err"
35) "master-host"
36) "?"
37) "master-port"
38) "0"
39) "slave-priority"
40) "100"
41) "slave-repl-offset"
42) "0"
从这里看到 原来下线的 10.0.24.17:6379
仍被设置在了slave中.所以我们需要删除掉这个不需要的信息
我们需要用到 SENTINEL RESET <master name>
更新元数据信息
10.0.24.17:26379> sentinel reset mymaster1
(integer) 1
需要注意的是这个命令会将master中的slave的信息,这样就会导致短时间内该 sentinel节点上不会有slave的 信息
10.0.24.17:26379> sentinel reset mymaster1
(integer) 1
10.0.24.17:26379> sentinel master mymaster1
1) "name"
2) "mymaster1"
3) "ip"
4) "10.0.24.17"
5) "port"
6) "6381"
...
40) "1"
#slave信息是空的
10.0.24.17:26379> sentinel slaves mymaster1
(empty list or set)
#info 查看slave也是为0
10.0.24.17:26379> info
......
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster1,status=ok,address=10.0.24.17:6381,slaves=0,sentinels=3
最后结果
10.0.24.17:26379> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster1,status=ok,address=10.0.24.17:6381,slaves=1,sentinels=3
在其他的sentinel节点滚动执行改命令
如果不去执行可以发现其他节点的信息任然是旧的信息
# 更新前
10.0.24.17:26381> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster1,status=ok,address=10.0.24.17:6381,slaves=2,sentinels=3
#进行更新
10.0.24.17:26381> sentinel reset mymaster1
(integer) 1
10.0.24.17:26381> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster1,status=ok,address=10.0.24.17:6381,slaves=1,sentinels=3
这里需要注意的是,在更新信息时是需要一定时间的。还有就是不能三个sentinel同时进行更新;
下面是关于sentinel 的一些管理命令
SENTINEL MASTERS
#显示被监控的所有master以及它们的状态.SENTINEL MASTER <master name>
#显示指定master的信息和状态。SENTINEL SLAVES <master name>
#显示指定master的所有slave以及它们的状态。SENTINEL GET-MASTER-ADDR-BY-NAME <master name>
#返回指定master的ip和端口,如果正在进行failover或者failover已经完成,将会显示被提升为master的- slave的ip和端口。SENTINEL RESET <master name>
#重置master的状态信息,清除其之前的状态信息,以及slaves信息。SENTINEL FAILOVER <master name>
#强制sentinel执行failover,并且不需要得到其他sentinel的同意。但是会将最新的配置发送给其他sentinel。SENTINEL FLUSHCONFIG
#强制Sentinel重写磁盘上的配置文件(适用于配置文件丢失)。SENTINEL CKQUORUM <master name>
#检查当前 Sentinel 配置是否能够达到故障转移主服务器所需的仲裁,以及授权故障转移所需的大多数仲裁。此命令应在监视系- 统中使用,以检查 Sentinel 部署是否正常。SENTINEL REMOVE <name>
#用于删除指定的主节点:主节点将不再受到监视,并且将从 Sentinel 的内部状态中完全删除,因此它将不再由 SENTINEL masters 等列出。
其实上面的内容就是对sentinel集群的管理命令的应用。希望对你有所帮助;
文章转载自天天李拜天DBA,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




