暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Sentinel模式中下线redis节点

天天李拜天DBA 2023-09-21
223

前阵子碰得到了一个Redis需求:在一个哨兵模式下,主节点Redis宕掉重启后不要被自动加到原主从集群中。

需求分析

因为哨兵模式下,当一个节点关闭重启后,会被sentinel 进程自动拉到该节点原来所在的集群中;这个需求就是不让后面这个动作 发生。最后的效果就是重启的节点变为单机模式了

尝试

  1. 在宕机节点重启前修改redis.conf文件指定一个不存在的节点为主即添加:slaveof 10.0.0.0 6379
    参数;结果是失败的
  2. 删除sentinel的配置文件关于宕机节点的信息;仍然失败

分析

这个需求本质就是想下线一个节点,或者说这台服务器上的redis想做其他用途,也想把这个端口释放掉,即使仍用做redis但也不想还在这个集群中;前面尝试说明这个集群信息存在sentinel中,且存在内存当中。那就需要找到存放集群的元数据并进行更新了

操作

环境

Redis 主从关系

IPPortrole
10.0.24.176379master
10.0.24.176380slave
10.0.24.176381slave

Sentinel 信息

IPPort
10.0.24.1726379
10.0.24.1726380
10.0.24.1726381

查看一个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和端口。
  1. 将原集群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


  1. 更新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

  1. 在其他的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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论