Redis Sentinel哨兵集群
Redis Sentinel哨兵集群
一、Redis主从复制中的问题
Redis主从复制集群可以将主节点的数据改变同步给从节点,这样从节点就可以起到两个作用:第一:作为主节点的一个备份,一旦主节点出了故障不能继续对外提供服务时,从节点可以作为后备"顶"上来,并且保证数据尽量不丢失。第二,从节点可以扩展主节点的读能力,通过实现读写分离结构,可以大大减轻主节点在进行高并发读写操作时的访问压力。
但是主从同步也带了一些问题:
一旦主节点故障,需要手动将一个从节点晋升为主节点 slaveof no one 。
需要修改客户端或者应用程序的主节点地址。
如果是一主多从结构,还需将其他从节点调整,让其从新的主节点进行复制而以上整个过程都需要人工干预。
二、Redis高可用方案
Redis Sentinel是Redis的高可用实现方案,在实际的生产环境中,对提高整个系统的高可用性是非常有帮助的。哨兵是一个分布式架构,其中包含若干个Sentinel节点和Redis数据节点,每个Sentinel节点都会对数据节点和其他Sentinel节点进行监控,当他发现节点不可达时,会对节点做下线标识。如果被标识的是主节点,他还会和其他Sentinel节点进行"协商",当半数以上Sentinel节点都认为主节点不可达时,它们会选举出一个Sentinel节点来完成自动故障转移的工作,同时会将这个变化实时通知给Redis的应用方。整个过程是完全自动的,不需要人工来介入,所以这套方案很有效的解决了Redis的高可用问题。
整个故障转移的处理逻辑基本上可分为4步:
主节点出现故障,此时两个从节点与主节点失去连接,主从复制失败
每个Sentinel节点通过定期监控发现主节点出现了故障
多个Sentinel节点对主节点的故障达成一致,选举出其中一个Sentinel节点作为领导者(leader)负责本次故障转移工作。
Sentinel领导者节点执行了故障转移,如下图所示
故障转移后整个Redis Sentinel的拓扑关系如下所示
三、Sentinel实现原理
3.1、三个定时监控任务
Redis Sentinel通过三个定时监控任务完成对各个节点发现和监控:
每隔10秒,每个Sentinel节点会向主节点和从节点发送info命令获取最新的拓扑结构,这个定时任务的作用具体可以表现在三个方面:
通过向主节点执行info命令,获取从节点的信息,这也是为什么Sentinel节点不需要显示配置监控从节点
当有新的从节点加入时都可以立刻感知出来
节点不可达或者故障转移后,可以通过info命令实时更新节点拓扑信息
每隔2秒,每个Sentinel节点会向Redis数据节点的sentinel:hello频道上发送该Sentinel节点对于主节点的判断以及当前Sentinel节点的信息,同时每个Sentinel节点也会订阅该频道,来了解其他Sentinel节点以及它们对主节点的判断,所以这个定时任务可以完成以下两个工作:
发现新的Sentinel节点:通过订阅主节点的sentinel:hello了解其他的Sentinel节点信息,如果是新加入的Sentinel节点,将该Sentinel节点信息保存起来,并与该Sentinel节点创建连接。
Sentinel节点之间交换主节点的状态,作为后面客观下线以及领导者选举的依据。
每隔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算法实现领导者选举,大致思路如下:
每个在线的Sentinel节点都有资格成为领导者,当他确认主节点主观下线时,会向其他Sentinel节点发送sentinel is-master-down-by-addr命令,要求将自己设置为领导者。
收到命令的节点,如果没有同意过其他节点的请求,则会同意该请求,否则拒绝。
如果某一个节点的票数已经大于等于max(quorum,num(sentinels)/2+1),那么它将成为领导者。
如果此过程没有选举出领导者,将进入下一次选举。
3.5、故障转移
领导者选举出的Sentinel节点负责故障转移,具体步骤如下:
在从节点列表中选出一个节点作为新的主节点,方法如下:
过滤:"不健康"(主观下线、断线)、5秒内没有回复过Sentinel节点ping响应,与主节点失联超过down-after-milliseconds*10秒。
选择slave-priority(从优先级)最高的从节点列表,如果存在则返回,不存在则继续。
选择复制偏移量最大的从节点
选择runid最小的从节点
领导者节点会对第一步选出来的从节点执行slaveof no one命令,使其成为新主
领导者节点会向剩余的从节点发送命令,让他们成为新主的从节点
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 0setenforce: 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]# makeHint: 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 installerThis script will help you easily set up a running redis server#一路回车即可Please select the redis port for this instance: [6379] #设置服务端口号Selecting default: 6379Please select the redis config file name [/etc/redis/6379.conf]#设置主配置文件存放位置Selected default - /etc/redis/6379.confPlease select the redis log file name [/var/log/redis_6379.log]#设置reids日志存放位置Selected default - /var/log/redis_6379.logPlease select the data directory for this instance[/var/lib/redis/6379] #设置数据目录Selected default - /var/lib/redis/6379Please 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_6379Installing service...Successfully added to chkconfig!Successfully added to runlevels 345!Starting Redis server...[Installation successful! #显示此信息表示配置成功
配置slave1实例
[root@redis utils]# ./install_server.shWelcome to the redis service installerThis script will help you easily set up a running redis serverPlease 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.confPlease select the redis log file name [/var/log/redis_6380.log]Selected default - /var/log/redis_6380.logPlease select the data directory for this instance[/var/lib/redis/6380]Selected default - /var/lib/redis/6380Please select the redis executable path [/usr/local/bin/redis-server]Selected config:Port : 6380Config file : /etc/redis/6380.confLog file : /var/log/redis_6380.logData dir : /var/lib/redis/6380Executable : /usr/local/bin/redis-serverCli Executable : /usr/local/bin/redis-cliIs this ok? Then press ENTER to go on or Ctrl-C to abort.Copied /tmp/6380.conf => /etc/init.d/redis_6380Installing service...Successfully added to chkconfig!Successfully added to runlevels 345!Starting Redis server...Installation successful!
配置slave2实例
[root@redis utils]# ./install_server.shWelcome to the redis service installerThis script will help you easily set up a running redis serverPlease 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.confPlease select the redis log file name [/var/log/redis_6381.log]Selected default - /var/log/redis_6381.logPlease select the data directory for this instance[/var/lib/redis/6381]Selected default - /var/lib/redis/6381Please select the redis executable path [/usr/local/bin/redis-server]Selected config:Port : 6381Config file : /etc/redis/6381.confLog file : /var/log/redis_6381.logData dir : /var/lib/redis/6381Executable : /usr/local/bin/redis-serverCli Executable : /usr/local/bin/redis-cliIs this ok? Then press ENTER to go on or Ctrl-C to abort.Copied /tmp/6381.conf => /etc/init.d/redis_6381Installing service...Successfully added to chkconfig!Successfully added to runlevels 345!Starting Redis server...Installation successful!
在执行安装脚本后redis服务其实已经启动了
[root@redis utils]# netstat -lnpt | grep redistcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 4762/redis-server 1tcp 0 0 127.0.0.1:6380 0.0.0.0:* LISTEN 4841/redis-server 1tcp 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 restartStopping ...Redis stoppedStarting 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 restartStopping ...Redis stoppedStarting 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 restartStopping ...Redis stoppedStarting Redis server...[root@redis utils]# netstat -lnpt | grep redistcp 0 0 192.168.115.111:6379 0.0.0.0:* LISTEN 4966/redis-server 1tcp 0 0 192.168.115.111:6380 0.0.0.0:* LISTEN 5038/redis-server 1tcp 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 6379pingWarning: 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 6380pingWarning: 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 6381pingWarning: Using a password with '-a' option on the command lineinterface may not be safe.PONG
4.3、主从集群配置
配置master角色配置文件
[root@redis ~]# vim /etc/redis/6379.conf451 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 startStopping ...Redis stoppedStarting Redis server...
配置两个slave角色配置文件
[root@redis ~]# vim /etc/redis/6380.conf282 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 startStarting Redis server...[root@redis ~]# vim /etc/redis/6381.conf282 slaveof 192.168.115.111 6379289 mymaster 123456[root@redis ~]# rm -rf /var/run/redis_6381.pid[root@redis ~]# service redis_6381 startStarting Redis server...
验证主从复制
登录master节点创建键值对
[root@redis ~]# redis-cli -h 192.168.115.111 -a 123456 -p 6379Warning: Using a password with '-a' option on the command lineinterface may not be safe.192.168.115.111:6379> set name crushlinuxOK192.168.115.111:6379> keys *1) "name"192.168.115.111:6379> get name"crushlinux"192.168.115.111:6379> info replication ##查看复制信息# Replicationrole:masterconnected_slaves:2min_slaves_good_slaves:2slave0:ip=192.168.115.111,port=6380,state=online,offset=427,lag=1slave1:ip=192.168.115.111,port=6381,state=online,offset=413,lag=1master_replid:29649e0f6c63a351d670a1d07649cbf5575b8871master_replid2:0000000000000000000000000000000000000000master_repl_offset:427second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:1repl_backlog_histlen:427192.168.115.111:6379> exit
登录slave节点验证键值同步情况,并测试无法写入
[root@redis ~]# redis-cli -h 192.168.115.111 -p 6380 -a 123456Warning: 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# Replicationrole:slavemaster_host:192.168.115.111master_port:6379master_link_status:upmaster_last_io_seconds_ago:10master_sync_in_progress:0slave_repl_offset:693slave_priority:100slave_read_only:1connected_slaves:0master_replid:29649e0f6c63a351d670a1d07649cbf5575b8871master_replid2:0000000000000000000000000000000000000000master_repl_offset:693second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:1repl_backlog_histlen:693192.168.115.111:6380> exit[root@redis ~]# redis-cli -h 192.168.115.111 -p 6381 -a 123456Warning: 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.confport 26379dir "/var/log/redis"logfile "26379.log"daemonize yesprotected-mode nosentinel monitor mymaster 192.168.115.111 6379 2sentinel down-after-milliseconds mymaster 30000sentinel parallel-syncs mymaster 1sentinel failover-timeout mymaster 180000sentinel 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# Sentinelsentinel_masters:1sentinel_tilt:0sentinel_running_scripts:0sentinel_scripts_queue_length:0sentinel_simulate_failure_flags:0master0:name=mymaster,status=ok,address=192.168.115.111:6379,slaves=2,sentinels=1
配置Sentinel1 和Sentinel2节点
[root@redis ~]# vim /etc/redis/redis-sentinel-26380.confport 26380dir "/var/log/redis"logfile "26380.log"daemonize yesprotected-mode nosentinel monitor mymaster 192.168.115.111 6379 2 ## 2: 指定从节点个数sentinel down-after-milliseconds mymaster 30000sentinel parallel-syncs mymaster 1sentinel failover-timeout mymaster 180000sentinel auth-pass mymaster 123456[root@redis ~]# vim /etc/redis/redis-sentinel-26381.confport 26381dir "/var/log/redis"logfile "26381.log"daemonize yesprotected-mode nosentinel monitor mymaster 192.168.115.111 6379 2sentinel down-after-milliseconds mymaster 30000sentinel parallel-syncs mymaster 1sentinel failover-timeout mymaster 180000sentinel 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-sentinetcp 0 0 0.0.0.0:26379 0.0.0.0:* LISTEN 5434/redis-sentineltcp 0 0 0.0.0.0:26380 0.0.0.0:* LISTEN 5481/redis-sentineltcp 0 0 0.0.0.0:26381 0.0.0.0:* LISTEN 5483/redis-sentineltcp6 0 0 :::26379 :::* LISTEN 5434/redis-sentineltcp6 0 0 :::26380 :::* LISTEN 5481/redis-sentineltcp6 0 0 :::26381 :::* LISTEN 5483/redis-sentinel
查看Sentinel1和Sentinel2节点状态
[root@redis ~]# redis-cli -h 192.168.115.111 -p 26380 info Sentinel# Sentinelsentinel_masters:1sentinel_tilt:0sentinel_running_scripts:0sentinel_scripts_queue_length:0sentinel_simulate_failure_flags:0master0: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# Sentinelsentinel_masters:1sentinel_tilt:0sentinel_running_scripts:0sentinel_scripts_queue_length:0sentinel_simulate_failure_flags:0master0: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.confport 26379dir "/var/log/redis"logfile "26379.log"daemonize yesprotected-mode nosentinel myid 7957e514582ea05e933cbea9413d1b3b6bc7afaasentinel monitor mymaster 192.168.115.111 6379 2sentinel auth-pass mymaster 123456sentinel config-epoch mymaster 0sentinel leader-epoch mymaster 0# Generated by CONFIG REWRITEsentinel known-slave mymaster 192.168.115.111 6380sentinel known-slave mymaster 192.168.115.111 6381sentinel known-sentinel mymaster 192.168.115.111 26381314bbad973d428c3f124a7d10794908ed4556cc6sentinel known-sentinel mymaster 192.168.115.111 26380e86dcf522af6b8f50d286b68b251971ab2d08d93sentinel 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 inforeplicationWarning: Using a password with '-a' option on the command lineinterface may not be safe.# Replicationrole:slavemaster_host:192.168.115.111master_port:[6379]{.mark}master_link_status:upmaster_last_io_seconds_ago:0master_sync_in_progress:0slave_repl_offset:184120slave_priority:100slave_read_only:1connected_slaves:0master_replid:29649e0f6c63a351d670a1d07649cbf5575b8871master_replid2:0000000000000000000000000000000000000000master_repl_offset:184120second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:1repl_backlog_histlen:184120[root@redis ~]# redis-cli -h 192.168.115.111 -p 6381 -a 123456 inforeplicationWarning: Using a password with '-a' option on the command lineinterface may not be safe.# Replicationrole:slavemaster_host:192.168.115.111master_port:[6379]{.mark}master_link_status:upmaster_last_io_seconds_ago:0master_sync_in_progress:0slave_repl_offset:185860slave_priority:100slave_read_only:1connected_slaves:0master_replid:29649e0f6c63a351d670a1d07649cbf5575b8871master_replid2:0000000000000000000000000000000000000000master_repl_offset:185860second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:85repl_backlog_histlen:185776
模拟master故障
[root@redis ~]# netstat -lnpt | grep 6379tcp 0 0 0.0.0.0:26379 0.0.0.0:* LISTEN 5573/redis-sentineltcp 0 0 192.168.115.111:6379 0.0.0.0:* LISTEN 5144/redis-server 1tcp6 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# Sentinelsentinel_masters:1sentinel_tilt:0sentinel_running_scripts:0sentinel_scripts_queue_length:0sentinel_simulate_failure_flags:0master0: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# Sentinelsentinel_masters:1sentinel_tilt:0sentinel_running_scripts:0sentinel_scripts_queue_length:0sentinel_simulate_failure_flags:0master0: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# Sentinelsentinel_masters:1sentinel_tilt:0sentinel_running_scripts:0sentinel_scripts_queue_length:0sentinel_simulate_failure_flags:0master0: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 inforeplicationWarning: Using a password with '-a' option on the command lineinterface may not be safe.# Replicationrole:masterconnected_slaves:1slave0:ip=192.168.115.111,port=6380,state=online,offset=203105,lag=1master_replid:6abfeb3b4a362efcda9b94fe78964e51a8911299master_replid2:29649e0f6c63a351d670a1d07649cbf5575b8871master_repl_offset:203119second_repl_offset:193747repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:85repl_backlog_histlen:203035[root@redis ~]# redis-cli -h 192.168.115.111 -p 6380 -a 123456 inforeplicationWarning: Using a password with '-a' option on the command lineinterface may not be safe.# Replicationrole:slavemaster_host:192.168.115.111master_port:[6381]{.mark}master_link_status:upmaster_last_io_seconds_ago:0master_sync_in_progress:0slave_repl_offset:201365slave_priority:100slave_read_only:1connected_slaves:0master_replid:6abfeb3b4a362efcda9b94fe78964e51a8911299master_replid2:29649e0f6c63a351d670a1d07649cbf5575b8871master_repl_offset:201365second_repl_offset:193747repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:1repl_backlog_histlen:201365
故障修复
[root@redis ~]# /etc/init.d/redis_6379 startStarting Redis server...[root@redis ~]# redis-cli -h 192.168.115.111 -p 6379 -a 123456 inforeplicationWarning: Using a password with '-a' option on the command lineinterface may not besafe.# Replicationrole:slavemaster_host:192.168.115.111master_port:6381master_link_status:downmaster_last_io_seconds_ago:-1master_sync_in_progress:0slave_repl_offset:1master_link_down_since_seconds:1588232672slave_priority:100slave_read_only:1connected_slaves:0min_slaves_good_slaves:0master_replid:432a98b82352bd06113e250c93d604efae97ad56master_replid2:0000000000000000000000000000000000000000master_repl_offset:0second_repl_offset:-1repl_backlog_active:0repl_backlog_size:1048576repl_backlog_first_byte_offset:0repl_backlog_histlen:0[root@redis ~]# redis-cli -h 192.168.115.111 -p 26379 info Sentinel# Sentinelsentinel_masters:1sentinel_tilt:0sentinel_running_scripts:0sentinel_scripts_queue_length:0sentinel_simulate_failure_flags:0master0:name=mymaster,status=ok,address=192.168.115.111:6381,slaves=2,sentinels=3
Sentinel集群总结
对于master节点故障判断是由多个Sentinel节点共同完成,这样可以有效地防止误判。
Sentinel集群可由若干个(奇数)Sentinel节点组成的,这样即使个别Sentinel节点不可用,整个Sentinel节点集合依然是健壮的。