当前位置: 首页 > backend >正文

Redis Sentinel哨兵集群

Redis Sentinel哨兵集群

一、Redis主从复制中的问题

Redis主从复制集群可以将主节点的数据改变同步给从节点,这样从节点就可以起到两个作用:第一:作为主节点的一个备份,一旦主节点出了故障不能继续对外提供服务时,从节点可以作为后备"顶"上来,并且保证数据尽量不丢失。第二,从节点可以扩展主节点的读能力,通过实现读写分离结构,可以大大减轻主节点在进行高并发读写操作时的访问压力。

但是主从同步也带了一些问题:

  • 一旦主节点故障,需要手动将一个从节点晋升为主节点 slaveof no one 。

  • 需要修改客户端或者应用程序的主节点地址。

  • 如果是一主多从结构,还需将其他从节点调整,让其从新的主节点进行复制而以上整个过程都需要人工干预。

二、Redis高可用方案

Redis Sentinel是Redis的高可用实现方案,在实际的生产环境中,对提高整个系统的高可用性是非常有帮助的。哨兵是一个分布式架构,其中包含若干个Sentinel节点和Redis数据节点,每个Sentinel节点都会对数据节点和其他Sentinel节点进行监控,当他发现节点不可达时,会对节点做下线标识。如果被标识的是主节点,他还会和其他Sentinel节点进行"协商",当半数以上Sentinel节点都认为主节点不可达时,它们会选举出一个Sentinel节点来完成自动故障转移的工作,同时会将这个变化实时通知给Redis的应用方。整个过程是完全自动的,不需要人工来介入,所以这套方案很有效的解决了Redis的高可用问题。

整个故障转移的处理逻辑基本上可分为4步:

  1. 主节点出现故障,此时两个从节点与主节点失去连接,主从复制失败

  2. 每个Sentinel节点通过定期监控发现主节点出现了故障

    1. 多个Sentinel节点对主节点的故障达成一致,选举出其中一个Sentinel节点作为领导者(leader)负责本次故障转移工作。

  3. Sentinel领导者节点执行了故障转移,如下图所示

  4. 故障转移后整个Redis Sentinel的拓扑关系如下所示

三、Sentinel实现原理

3.1、三个定时监控任务

Redis Sentinel通过三个定时监控任务完成对各个节点发现和监控:

  1. 每隔10秒,每个Sentinel节点会向主节点和从节点发送info命令获取最新的拓扑结构,这个定时任务的作用具体可以表现在三个方面:

  • 通过向主节点执行info命令,获取从节点的信息,这也是为什么Sentinel节点不需要显示配置监控从节点

  • 当有新的从节点加入时都可以立刻感知出来

  • 节点不可达或者故障转移后,可以通过info命令实时更新节点拓扑信息

  1. 每隔2秒,每个Sentinel节点会向Redis数据节点的sentinel:hello频道上发送该Sentinel节点对于主节点的判断以及当前Sentinel节点的信息,同时每个Sentinel节点也会订阅该频道,来了解其他Sentinel节点以及它们对主节点的判断,所以这个定时任务可以完成以下两个工作:

  • 发现新的Sentinel节点:通过订阅主节点的sentinel:hello了解其他的Sentinel节点信息,如果是新加入的Sentinel节点,将该Sentinel节点信息保存起来,并与该Sentinel节点创建连接。

  • Sentinel节点之间交换主节点的状态,作为后面客观下线以及领导者选举的依据。

  1. 每隔1秒,每个Sentinel节点会向主节点、从节点、其余Sentinel节点发送一条ping命令做一次心跳检测,来确认这些节点当前是否可达。

3.2、主观下线

每个Sentinel节点会每隔1秒对主节点、从节点、其他Sentinel节点发送ping命令做心跳检测,当这个节点超过down-after-milliseconds时间没有进行有效回复,Sentinel节点就会对该节点做失败判定,这个判定行为叫做主观下线。从字面意思也可以很容易看出主观下线是当前Sentinel节点的一家之言,存在误判断的可能。

3.3、客观下线

当Sentinel主观下线的节点是主节点时,该Sentinel节点会通过Sentinel is-master-down-by-addr命令向其他Sentinel节点询问对主节点的判断,当超过半数的Sentinel节点都认为主节点确实有问题,这时该Sentinel节点会做出客观下线的决定,这样客观下线的含义是比较明显了,也就是大部分Sentinel节点都对主节点的下线做了同意的判定,那么这个判定就是客观的。

3.4、领导者选举

故障转移的工作只需要一个Sentinel节点来完成即可,所以Sentinel节点之间会做一个领导者选举的工作,选出一个Sentinel节点作为领导者进行故障转移的工作。Redis使用了Raft算法实现领导者选举,大致思路如下:

  1. 每个在线的Sentinel节点都有资格成为领导者,当他确认主节点主观下线时,会向其他Sentinel节点发送sentinel is-master-down-by-addr命令,要求将自己设置为领导者。

  2. 收到命令的节点,如果没有同意过其他节点的请求,则会同意该请求,否则拒绝。

  3. 如果某一个节点的票数已经大于等于max(quorum,num(sentinels)/2+1),那么它将成为领导者。

  4. 如果此过程没有选举出领导者,将进入下一次选举。

3.5、故障转移

领导者选举出的Sentinel节点负责故障转移,具体步骤如下:

  1. 在从节点列表中选出一个节点作为新的主节点,方法如下:

  • 过滤:"不健康"(主观下线、断线)、5秒内没有回复过Sentinel节点ping响应,与主节点失联超过down-after-milliseconds*10秒。

  • 选择slave-priority(从优先级)最高的从节点列表,如果存在则返回,不存在则继续。

  • 选择复制偏移量最大的从节点

  • 选择runid最小的从节点

  1. 领导者节点会对第一步选出来的从节点执行slaveof no one命令,使其成为新主

  2. 领导者节点会向剩余的从节点发送命令,让他们成为新主的从节点

  3. Sentinel节点集合会将原来的主节点更新为从节点并保持对其关注,当其恢复后命令它去复制新的主节点。

四、Sentinel集群部署

注意:openEuler 进行节点转移时不修改配置文件

4.1、案例环境


系统 IP地址 主机名 端口 Redis角色

CentOS 7.9 192.168.115.111 redis 6379 master

CentOS 7.9 192.168.115.111 redis 6380 slave1

CentOS 7.9 192.168.115.111 redis 6381 slave2

CentOS 7.9 192.168.115.111 redis 26379 Sentinel

CentOS 7.9 192.168.115.111 redis 26380 Sentinel

CentOS 7.9 192.168.115.111 redis 26381 Sentinel


4.2、案例实施

安装并配置redis服务及实例

 [root@localhost ~]# hostname redis​[root@localhost ~]# bash​[root@redis ~]# iptables -F​[root@redis ~]# systemctl stop firewalld​[root@redis ~]# setenforce 0​setenforce: SELinux is disabled

下载redis源码包,解压并进入解压路径,从主机进行同样的安装配置

[root@redis ~]# wget<http://download.redis.io/releases/redis-7.2.3.tar.gz>​[root@redis ~]# tar xf redis-7.2.3.tar.gz -C /usr/src/​[root@redis ~]# cd /usr/src/redis-7.2.3/

执行make编译安装,从主机进行同样的安装配置

在我们之前的学习中,我们都会执行./configure 进行编译从而生成Makefile,redis的源码包中则直接提供了Makefile文件所以在解压完成之后直接进行make编译即可)

 [root@redis redis-7.2.3]# ls | grep --color Makefile

#可以看到解压路径下自带的

Makefile​[root@redis redis-7.2.3]# make​Hint: It's a good idea to run 'make test' ;)​make[1]: 离开目录"/usr/src/redis-7.2.3/src"#显示如下信息表示编译安装成功​[root@redis redis-7.2.3]# make install

redis其实可以不用执行make install 但是为了后面方便我们执行所以执行make install

在安装过程中,若想更改默认的安装路径,可使用以下命令格式来进行安装操作。

 make PREFIX=安装路径 install

生成启动脚本及配置文件信息

make install只是生成了二进制文件到系统中,并没有启动脚本和配置文件,所以此时使用redis默认提供的install_server.sh脚本进行生成启动脚本和配置文件。

[root@redis redis-7.2.3]# cd utils/​[root@redis utils]# #在解压路径下的utils中

配置master实例

[root@redis utils]# ./install_server.sh #执行安装脚本​Welcome to the redis service installer​This script will help you easily set up a running redis server​#一路回车即可​Please select the redis port for this instance: [6379] #设置服务端口号​Selecting default: 6379​Please select the redis config file name [/etc/redis/6379.conf]#设置主配置文件存放位置​Selected default - /etc/redis/6379.conf​Please select the redis log file name [/var/log/redis_6379.log]#设置reids日志存放位置​Selected default - /var/log/redis_6379.log​Please select the data directory for this instance[/var/lib/redis/6379] #设置数据目录​Selected default - /var/lib/redis/6379​Please select the redis executable path [/usr/local/bin/redis-server]#设置执行命令​Selected config:​Port : 6379 //服务端口​Config file : /etc/redis/6379.conf //配置文件​Log file : /var/log/redis_6379.log //日志文件​Data dir : /var/lib/redis/6379 //数据目录​Executable : /usr/local/bin/redis-server //服务端命令​Cli Executable : /usr/local/bin/redis-cli //客户端命令​Is this ok? Then press ENTER to go on or Ctrl-C to abort.​Copied /tmp/6379.conf => /etc/init.d/redis_6379​Installing service...​Successfully added to chkconfig!​Successfully added to runlevels 345!​Starting Redis server...​[Installation successful! #显示此信息表示配置成功

配置slave1实例

 [root@redis utils]# ./install_server.sh​Welcome to the redis service installer​This script will help you easily set up a running redis server​Please select the redis port for this instance: [6379] [6380]{.mark}​Please select the redis config file name [/etc/redis/6380.conf]​Selected default - /etc/redis/6380.conf​Please select the redis log file name [/var/log/redis_6380.log]​Selected default - /var/log/redis_6380.log​Please select the data directory for this instance[/var/lib/redis/6380]​Selected default - /var/lib/redis/6380​Please select the redis executable path [/usr/local/bin/redis-server]​Selected config:​Port : 6380​Config file : /etc/redis/6380.conf​Log file : /var/log/redis_6380.log​Data dir : /var/lib/redis/6380​Executable : /usr/local/bin/redis-server​Cli Executable : /usr/local/bin/redis-cli​Is this ok? Then press ENTER to go on or Ctrl-C to abort.​Copied /tmp/6380.conf => /etc/init.d/redis_6380​Installing service...​Successfully added to chkconfig!​Successfully added to runlevels 345!​Starting Redis server...​Installation successful!

配置slave2实例

[root@redis utils]# ./install_server.sh​Welcome to the redis service installer​This script will help you easily set up a running redis server​Please select the redis port for this instance: [6379] [6381]{.mark}​Please select the redis config file name [/etc/redis/6381.conf]​Selected default - /etc/redis/6381.conf​Please select the redis log file name [/var/log/redis_6381.log]​Selected default - /var/log/redis_6381.log​Please select the data directory for this instance[/var/lib/redis/6381]​Selected default - /var/lib/redis/6381​Please select the redis executable path [/usr/local/bin/redis-server]​Selected config:​Port : 6381​Config file : /etc/redis/6381.conf​Log file : /var/log/redis_6381.log​Data dir : /var/lib/redis/6381​Executable : /usr/local/bin/redis-server​Cli Executable : /usr/local/bin/redis-cli​Is this ok? Then press ENTER to go on or Ctrl-C to abort.​Copied /tmp/6381.conf => /etc/init.d/redis_6381​Installing service...​Successfully added to chkconfig!​Successfully added to runlevels 345!​Starting Redis server...​Installation successful!

在执行安装脚本后redis服务其实已经启动了

 [root@redis utils]# netstat -lnpt | grep redis​tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 4762/redis-server 1​tcp 0 0 127.0.0.1:6380 0.0.0.0:* LISTEN 4841/redis-server 1​tcp 0 0 127.0.0.1:6381 0.0.0.0:* LISTEN 4926/redis-server

我们已经为redis生成了启动脚本及配置文件 所以此时我们已经可以控制redis的启动及停止了,

初始化redis 实例配置文件

 ##配置监听IP地址​[root@redis ~]# sed -i '/^bind127.0.0.1$/s/127.0.0.1/192.168.115.111/g' /etc/redis/6379.conf​##关闭redis的保护模式​[root@redis ~]# sed -i '/protected-mode/s/yes/no/g'/etc/redis/6379.conf​##开启redis的后台守护进程模式​[root@redis ~]# sed -i '/daemonize/s/no/yes/g' /etc/redis/6379.conf​##设置redis的密码为123456​[root@redis ~]# sed -i '/requirepass/s/foobared/123456/g'/etc/redis/6379.conf​##开启redis的密码​[root@redis ~]# sed -i '/requirepass 123456/s/^#//g'/etc/redis/6379.conf​[root@redis ~]# service redis_6379 restart​Stopping ...​Redis stopped​Starting Redis server...​[root@redis utils]# sed -i '/^bind127.0.0.1$/s/127.0.0.1/192.168.115.111/g' /etc/redis/6380.conf​[root@redis utils]# sed -i '/protected-mode/s/yes/no/g'/etc/redis/6380.conf​[root@redis utils]# sed -i '/daemonize/s/no/yes/g'/etc/redis/6380.conf​[root@redis utils]# sed -i '/requirepass/s/foobared/123456/g'/etc/redis/6380.conf​[root@redis utils]# sed -i '/requirepass 123456/s/^# //g'/etc/redis/6380.conf​[root@redis utils]# service redis_6380 restart​Stopping ...​Redis stopped​Starting Redis server...​[root@redis utils]# sed -i '/^bind127.0.0.1$/s/127.0.0.1/192.168.115.111/g' /etc/redis/6381.conf​[root@redis utils]# sed -i '/protected-mode/s/yes/no/g'/etc/redis/6381.conf​[root@redis utils]# sed -i '/daemonize/s/no/yes/g'/etc/redis/6381.conf​[root@redis utils]# sed -i '/requirepass/s/foobared/123456/g'/etc/redis/6381.conf​[root@redis utils]# sed -i '/requirepass 123456/s/^# //g'/etc/redis/6381.conf​[root@redis utils]# service redis_6381 restart​Stopping ...​Redis stopped​Starting Redis server...​[root@redis utils]# netstat -lnpt | grep redis​tcp 0 0 192.168.115.111:6379 0.0.0.0:* LISTEN 4966/redis-server 1​tcp 0 0 192.168.115.111:6380 0.0.0.0:* LISTEN 5038/redis-server 1​tcp 0 0 192.168.115.111:6381 0.0.0.0:* LISTEN 5055/redis-server 1

验证redis实例运行状态

[root@redis utils]# redis-cli -h 192.168.115.111 -a 123456 -p 6379ping​Warning: Using a password with '-a' option on the command lineinterface may not be safe.​PONG​[root@redis utils]# redis-cli -h 192.168.115.111 -a 123456 -p 6380ping​Warning: Using a password with '-a' option on the command lineinterface may not be safe.​PONG​[root@redis utils]# redis-cli -h 192.168.115.111 -a 123456 -p 6381ping​Warning: Using a password with '-a' option on the command lineinterface may not be safe.​PONG

4.3、主从集群配置

配置master角色配置文件

[root@redis ~]# vim /etc/redis/6379.conf​451 min-slaves-to-write 2​##设置slave节点的数量,如果slave节点数量少于此值,那么master节点将停止客户端的一切写请求​452 min-slaves-max-lag 10​##master与slave之间同步数据的超时时间,若超过此时间,master节点将停止客户端的一切写操作​[root@redis ~]# killall -9 redis-server​[root@redis ~]# rm -rf /var/run/redis_6379.pid​[root@redis ~]# service redis_6379 start​Stopping ...​Redis stopped​Starting Redis server...

配置两个slave角色配置文件

[root@redis ~]# vim /etc/redis/6380.conf​282 slaveof 192.168.115.111 6379​##指定master的ip地址以及端口​289 mymaster 123456​##指定master的连接密码​[root@redis ~]# rm -rf /var/run/redis_6380.pid​[root@redis ~]# service redis_6380 start​Starting Redis server...​[root@redis ~]# vim /etc/redis/6381.conf​282 slaveof 192.168.115.111 6379​289 mymaster 123456​[root@redis ~]# rm -rf /var/run/redis_6381.pid​[root@redis ~]# service redis_6381 start​Starting Redis server...

验证主从复制

登录master节点创建键值对

[root@redis ~]# redis-cli -h 192.168.115.111 -a 123456 -p 6379​Warning: Using a password with '-a' option on the command lineinterface may not be safe.​192.168.115.111:6379> set name crushlinux​OK​192.168.115.111:6379> keys *​1) "name"​192.168.115.111:6379> get name​"crushlinux"​192.168.115.111:6379> info replication ##查看复制信息​# Replication​role:master​connected_slaves:2​min_slaves_good_slaves:2​slave0:ip=192.168.115.111,port=6380,state=online,offset=427,lag=1​slave1:ip=192.168.115.111,port=6381,state=online,offset=413,lag=1​master_replid:29649e0f6c63a351d670a1d07649cbf5575b8871​master_replid2:0000000000000000000000000000000000000000​master_repl_offset:427​second_repl_offset:-1​repl_backlog_active:1​repl_backlog_size:1048576​repl_backlog_first_byte_offset:1​repl_backlog_histlen:427​192.168.115.111:6379> exit ​

登录slave节点验证键值同步情况,并测试无法写入

[root@redis ~]# redis-cli -h 192.168.115.111 -p 6380 -a 123456​Warning: Using a password with '-a' option on the command lineinterface may not be safe.​192.168.115.111:6380> keys *​1) "name"​192.168.115.111:6380> get name​"crushlinux"​192.168.115.111:6380> set age 18​(error) READONLY You can't write against a read only slave.​192.168.115.111:6380> info replication​# Replication​role:slave​master_host:192.168.115.111​master_port:6379​master_link_status:up​master_last_io_seconds_ago:10​master_sync_in_progress:0​slave_repl_offset:693​slave_priority:100​slave_read_only:1​connected_slaves:0​master_replid:29649e0f6c63a351d670a1d07649cbf5575b8871​master_replid2:0000000000000000000000000000000000000000​master_repl_offset:693​second_repl_offset:-1​repl_backlog_active:1​repl_backlog_size:1048576​repl_backlog_first_byte_offset:1​repl_backlog_histlen:693​192.168.115.111:6380> exit​[root@redis ~]# redis-cli -h 192.168.115.111 -p 6381 -a 123456​Warning: Using a password with '-a' option on the command lineinterface may not be safe.​192.168.115.111:6381> keys *​1) "name"​192.168.115.111:6381> get name​"crushlinux"​192.168.115.111:6381> exit

4.4、配置Redis sentinel集群

Sentinel节点本身就是独立的Redis节点,只不过它们有一些特殊,它们不存储数据,只支持部分命令。

准备sentinel日志目录

 [root@redis ~]# mkdir -p /var/log/redis/

配置Sentinel1节点

 [root@redis ~]# vim /etc/redis/redis-sentinel-26379.conf​port 26379​dir "/var/log/redis"​logfile "26379.log"​daemonize yes​protected-mode no​sentinel monitor mymaster 192.168.115.111 6379 2​sentinel down-after-milliseconds mymaster 30000​sentinel parallel-syncs mymaster 1​sentinel failover-timeout mymaster 180000​sentinel auth-pass mymaster 123456​[root@redis ~]# redis-sentinel /etc/redis/redis-sentinel-26379.conf

查看Sentinel1节点状态

[root@redis ~]# redis-cli -h 192.168.115.111 -p 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=mymaster,status=ok,address=192.168.115.111:6379,slaves=2,sentinels=1

配置Sentinel1 和Sentinel2节点

 [root@redis ~]# vim /etc/redis/redis-sentinel-26380.conf​port 26380​dir "/var/log/redis"​logfile "26380.log"​daemonize yes​protected-mode no​sentinel monitor mymaster 192.168.115.111 6379 2  ## 2: 指定从节点个数​sentinel down-after-milliseconds mymaster 30000​sentinel parallel-syncs mymaster 1​sentinel failover-timeout mymaster 180000​sentinel auth-pass mymaster 123456​[root@redis ~]# vim /etc/redis/redis-sentinel-26381.conf​port 26381​dir "/var/log/redis"​logfile "26381.log"​daemonize yes​protected-mode no​sentinel monitor mymaster 192.168.115.111 6379 2​sentinel down-after-milliseconds mymaster 30000​sentinel parallel-syncs mymaster 1​sentinel failover-timeout mymaster 180000​sentinel auth-pass mymaster 123456​[root@redis ~]# redis-sentinel /etc/redis/redis-sentinel-26380.conf​[root@redis ~]# redis-sentinel /etc/redis/redis-sentinel-26381.conf​[root@redis ~]# netstat -lnpt | grep redis-sentine​tcp 0 0 0.0.0.0:26379 0.0.0.0:* LISTEN 5434/redis-sentinel​tcp 0 0 0.0.0.0:26380 0.0.0.0:* LISTEN 5481/redis-sentinel​tcp 0 0 0.0.0.0:26381 0.0.0.0:* LISTEN 5483/redis-sentinel​tcp6 0 0 :::26379 :::* LISTEN 5434/redis-sentinel​tcp6 0 0 :::26380 :::* LISTEN 5481/redis-sentinel​tcp6 0 0 :::26381 :::* LISTEN 5483/redis-sentinel

查看Sentinel1和Sentinel2节点状态

[root@redis ~]# redis-cli -h 192.168.115.111 -p 26380 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=mymaster,status=ok,address=192.168.115.111:6379,slaves=2,sentinels=3​[root@redis ~]# redis-cli -h 192.168.115.111 -p 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=mymaster,status=ok,address=192.168.115.111:6379,slaves=2,sentinels=3

4.5、Sentinel 配置说明

当所有sentinel节点启动后,配置文件中的内容将会发生变化,体现在三个方面:

  • Sentinel节点自动发现从节点及其余Sentinel节点。

  • 去掉文件中的默认配置,例如parallel-syncs、failover-timeout参数。

  • 添加了配置纪元相关参数。

Sentinel1节点的conf文件变为了

 [root@redis ~]# cat /etc/redis/redis-sentinel-26379.conf​port 26379​dir "/var/log/redis"​logfile "26379.log"​daemonize yes​protected-mode no​sentinel myid 7957e514582ea05e933cbea9413d1b3b6bc7afaa​sentinel monitor mymaster 192.168.115.111 6379 2​sentinel auth-pass mymaster 123456​sentinel config-epoch mymaster 0​sentinel leader-epoch mymaster 0​# Generated by CONFIG REWRITE​sentinel known-slave mymaster 192.168.115.111 6380​sentinel known-slave mymaster 192.168.115.111 6381​sentinel known-sentinel mymaster 192.168.115.111 26381314bbad973d428c3f124a7d10794908ed4556cc6​sentinel known-sentinel mymaster 192.168.115.111 26380e86dcf522af6b8f50d286b68b251971ab2d08d93​sentinel current-epoch 0
  • daemonize yes #以守护进程模式启动;

  • protected-mode no #在配置多个sentinel时需在每个sentinel配置文件中必须添加,否则主的redis挂掉时,所有的sentinel不会选举出新的master。

  • sentinel monitor mymaster 192.168.115.111 6379 2 #sentinel去监听地址为192.168.115.1116379的master;mymaster是集群名称,名称可以自定义;quorum是一个数字,指明当有多少个sentinel认为一个master失效时,master才算真正失效;master-name只能包含英文字母,数字,和".-_"这三个字符。需要注意的是master-ip要写真实的ip地址而不要用回环地址(127.0.0.1)。

  • sentinel down-after-milliseconds mymaster 3000 #这个配置项指定需要多少失效时间,一个master才会被这个sentinel主观地认为是不可用的。 单位是毫秒,默认为30秒

  • sentinel parallel-syncs mymaster 1 #这个配置项指定了在发生failover主备切换时最多可以有多少个slave同时对新的master进行同步,这个数字越小,完成failover所需的时间就越长,但是如果这个数字越大,就意味着越多的slave因为replication而不可用。可以通过将这个值设为 1 来保证每次只有一个slave 处于不能处理命令请求的状态。

  • sentinel failover-timeout mymaster 180000 #故障转移超时时间为180000

  • sentinel auth-pass mymaster 123456 #设置连接master和slave时的密码,注意的是sentinel不能分别为master和slave设置不同的密码,因此master和slave的密码应该设置相同。

4.6、Sentinel 集群测试

查看slaves信息

 [root@redis ~]# redis-cli -h 192.168.115.111 -p 6380 -a 123456 inforeplication​Warning: Using a password with '-a' option on the command lineinterface may not be safe.​# Replication​role:slave​master_host:192.168.115.111​master_port:[6379]{.mark}​master_link_status:up​master_last_io_seconds_ago:0​master_sync_in_progress:0​slave_repl_offset:184120​slave_priority:100​slave_read_only:1​connected_slaves:0​master_replid:29649e0f6c63a351d670a1d07649cbf5575b8871​master_replid2:0000000000000000000000000000000000000000​master_repl_offset:184120​second_repl_offset:-1​repl_backlog_active:1​repl_backlog_size:1048576​repl_backlog_first_byte_offset:1​repl_backlog_histlen:184120​[root@redis ~]# redis-cli -h 192.168.115.111 -p 6381 -a 123456 inforeplication​Warning: Using a password with '-a' option on the command lineinterface may not be safe.​# Replication​role:slave​master_host:192.168.115.111​master_port:[6379]{.mark}​master_link_status:up​master_last_io_seconds_ago:0​master_sync_in_progress:0​slave_repl_offset:185860​slave_priority:100​slave_read_only:1​connected_slaves:0​master_replid:29649e0f6c63a351d670a1d07649cbf5575b8871​master_replid2:0000000000000000000000000000000000000000​master_repl_offset:185860​second_repl_offset:-1​repl_backlog_active:1​repl_backlog_size:1048576​repl_backlog_first_byte_offset:85​repl_backlog_histlen:185776

模拟master故障

[root@redis ~]# netstat -lnpt | grep 6379​tcp 0 0 0.0.0.0:26379 0.0.0.0:* LISTEN 5573/redis-sentinel​tcp 0 0 192.168.115.111:6379 0.0.0.0:* LISTEN 5144/redis-server 1​tcp6 0 0 :::26379 :::* LISTEN 5573/redis-sentinel​[root@redis ~]# kill -9 5144​[root@redis ~]# rm -rf /var/run/redis_6379.pid​[root@redis ~]# redis-cli -h 192.168.115.111 -p 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=mymaster,status=ok,address=192.168.115.111:6381,slaves=2,sentinels=3​[root@redis ~]# redis-cli -h 192.168.115.111 -p 26380 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=mymaster,status=ok,address=192.168.115.111:6381,slaves=2,sentinels=3​[root@redis ~]# redis-cli -h 192.168.115.111 -p 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=mymaster,status=ok,address=192.168.115.111:6381,slaves=2,sentinels=3​[root@redis ~]# redis-cli -h 192.168.115.111 -p 6381 -a 123456 inforeplication​Warning: Using a password with '-a' option on the command lineinterface may not be safe.​# Replication​role:master​connected_slaves:1​slave0:ip=192.168.115.111,port=6380,state=online,offset=203105,lag=1​master_replid:6abfeb3b4a362efcda9b94fe78964e51a8911299​master_replid2:29649e0f6c63a351d670a1d07649cbf5575b8871​master_repl_offset:203119​second_repl_offset:193747​repl_backlog_active:1​repl_backlog_size:1048576​repl_backlog_first_byte_offset:85​repl_backlog_histlen:203035​[root@redis ~]# redis-cli -h 192.168.115.111 -p 6380 -a 123456 inforeplication​Warning: Using a password with '-a' option on the command lineinterface may not be safe.​# Replication​role:slave​master_host:192.168.115.111​master_port:[6381]{.mark}​master_link_status:up​master_last_io_seconds_ago:0​master_sync_in_progress:0​slave_repl_offset:201365​slave_priority:100​slave_read_only:1​connected_slaves:0​master_replid:6abfeb3b4a362efcda9b94fe78964e51a8911299​master_replid2:29649e0f6c63a351d670a1d07649cbf5575b8871​master_repl_offset:201365​second_repl_offset:193747​repl_backlog_active:1​repl_backlog_size:1048576​repl_backlog_first_byte_offset:1​repl_backlog_histlen:201365

故障修复

 [root@redis ~]# /etc/init.d/redis_6379 start​Starting Redis server...​[root@redis ~]# redis-cli -h 192.168.115.111 -p 6379 -a 123456 inforeplication​Warning: Using a password with '-a' option on the command lineinterface may not be​safe.# Replication​role:slave​master_host:192.168.115.111​master_port:6381​master_link_status:down​master_last_io_seconds_ago:-1​master_sync_in_progress:0​slave_repl_offset:1​master_link_down_since_seconds:1588232672​slave_priority:100​slave_read_only:1​connected_slaves:0​min_slaves_good_slaves:0​master_replid:432a98b82352bd06113e250c93d604efae97ad56​master_replid2:0000000000000000000000000000000000000000​master_repl_offset:0​second_repl_offset:-1​repl_backlog_active:0​repl_backlog_size:1048576​repl_backlog_first_byte_offset:0​repl_backlog_histlen:0​[root@redis ~]# redis-cli -h 192.168.115.111 -p 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=mymaster,status=ok,address=192.168.115.111:6381,slaves=2,sentinels=3

Sentinel集群总结

  • 对于master节点故障判断是由多个Sentinel节点共同完成,这样可以有效地防止误判。

  • Sentinel集群可由若干个(奇数)Sentinel节点组成的,这样即使个别Sentinel节点不可用,整个Sentinel节点集合依然是健壮的。

http://www.xdnf.cn/news/15752.html

相关文章:

  • Spring之【AnnotatedBeanDefinitionReader】
  • 针对大规模语言模型的上下文工程技术调研与总结(翻译并摘要)
  • 【C++】入门阶段
  • 基于开放API接口采集的定制开发开源AI智能名片S2B2C商城小程序数据整合与增长策略研究
  • 本地部署开源的 AI 驱动的搜索引擎 Perplexica 并实现外部访问
  • Spring Bean 的作用域(Bean Scope)
  • SpringAI_Chat模型_DeepSeek模型--基础对话
  • 扭蛋机系统开发:打造多元化娱乐生态的新引擎
  • Libevent(3)之使用教程(2)创建事件
  • Spring MVC @RequestParam注解全解析
  • 【Linux】重生之从零开始学习运维之Nginx之server小实践
  • 最新版vscode 连接ubuntu 18.04 保姆级教程
  • 编程实现Word自动排版:从理论到实践的全面指南
  • SurfaceView、TextureView、SurfaceTexture 和 GLSurfaceView
  • 【Android】ListView与RecyclerView的基础使用
  • 【unity游戏开发入门到精通——3D篇】3D光源之——unity使用Lens Flare (SRP) 组件实现太阳耀斑镜头光晕效果
  • C++实现单层时间轮
  • 4644电源管理芯片在微波射频组件中的技术优势与国产化实践
  • Linux驱动学习day24(UART子系统)
  • Ubuntu系统下快速体验iperf3工具(网络性能测试)
  • 嵌入式Linux:什么是线程?
  • 【RK3576】【Android14】开发环境搭建
  • Thread,ThreadLocal,ThreadLocalMap 三者的关系, 以及在实际开发中的应用【AI记录用】
  • 荷兰KIPP ZONEN CMP4 太阳辐射传感器耐热仪器设计高温日射计一种辐射计
  • 熔断和降*的区别
  • synchronized锁升级过程【AI笔记,仅供自己参考】
  • NIO网络通信基础
  • P1205 [USACO1.2] 方块转换 Transformations
  • 如何检查GitHub上可能潜在的信息泄漏
  • Vue3 Anime.js超级炫酷的网页动画库详解