RedisSentinel哨兵
RedisSentinel哨兵
注意
- 若master实例故障,sentinel会重新选主并启动自动故障切换:选择slave-priority最小的那个slave实例并将其提升为master,同时修改其它slave的配置,使其master配置项指向新的master,当old master恢复重启后,会自动降级为new master的slave。最后,根据配置,Redis Sentinel还会将新的master地址通知给当前正在访问Redis的应用程序。
- 要把
sentinel monito
配置放的靠前,否则会报错No such master with specified name.
因为会用到 - 如果我们的哨兵也使用了集群, 在编程语言中也要注意到这一块.
安装
如果是Ubuntu下,Redis版本可能会比较老,需要手动安装哨兵
apt install redis-sentinel -y
一步到位
apt install redis-server -y&& apt install redis-sentinel -y
配置哨兵
常用的哨兵配置
daemonize yes pidfile "/var/run/sentinel/redis-sentinel.pid"
logfile "/var/log/redis/redis-sentinel.log"
dir "/var/lib/redis"
# 线上要改为合适的IP,多个IP用空格隔开即可,
bind 0.0.0.0
port 26379
# 注意我这里用了小写和后面的不太一样
sentinel monitor mymaster 192.168.56.100 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 120000
sentinel parallel-syncs mymaster 1
配置解读
port 26379# 让Sentinel只工作在/tmp目录下,减少安全隐患
dir "/tmp/redis"
# 开启守护进程模式
daemonize yes
# 关闭保护模式
protected-mode no
# 格式:sentinel <option_name> <master_name> <option_value>
# 这里的127.0.0.1 6379代表主服务器的地址
# myMaster为起的别名,后面要用到
# 最后的一个2代表在sentinel集群中,多少个节点认为master死了,才能真正认为该master不可用
sentinel monitor myMaster 192.168.56.100 6379 2
# sentinel会向master发送心跳确认存活
# 如果master在“一定时间范围”内不回应PONG 或者是回复了一个错误消息
# 那么这个sentinel会主观地认为这个master已经不可用了
# (subjectively down, 也简称为SDOWN)。
# down-after-milliseconds 用来指定这个“一定时间范围”,单位是毫秒,默认30秒。
# 这里的配置意思是在5秒内, sentinel一直无法ping通mymaster的时候,认为mymaster是不可用的
sentinel down-after-milliseconds myMaster 5000
# failover过期时间。
# 当failover开始后,在此时间内仍然没有触发任何failover操作,当前sentinel将会认为此次failoer失败。
# 默认180秒,即3分钟。
# 1. 同一个sentinel对同一个master两次failover之间的间隔时间。
# 2. 当一个slave从一个错误的master那里同步数据开始计算时间。直到slave被纠正为向正确的master那里同步数据时。
# 3.当想要取消一个正在进行的failover所需要的时间。
#4.当进行failover时,配置所有slaves指向新的master所需的最大时间。不过,即使过了这个超时,slaves依然会被正确配置为指向master,但是就不按parallel-syncs所配置的规则来了。
sentinel failover-timeout myMaster 120000
# 在发生failover时,这个选项指定了最多可以有多少个slave同时对新的master进行同步。
# 这个数字越小,完成failover所需的时间就越长;
# 这个数字越大,就意味着越多的slave因为replication而不可用。
# 可以通过将这个值设为 1 来保证每次只有一个slave处于不能处理命令请求的状态。
# 这个配置项指定了在发生failover主备切换时最多可以有多少个slave同时对新的master进行 同步,
# 这个数字越小,完成failover所需的时间就越长,但是如果这个数字越大,就意味着越
# 多的slave因为replication而不可用。可以通过将这个值设为 1 来保证每次只有一个slave 处于不能处理命令请求的状态。
sentinel parallel-syncs myMaster 1
# sentinel Redis的连接密码验证,myMaster是主服务名称,password是Redis连接密码(非必须,根据情况来)
# sentinel auth-pass <master_name> <password>
# sentinel auth-pass myMaster password
# 发生切换之后执行的一个自定义脚本()
# sentinel notification-script <master-name> <script-path>
# sentinel client-reconfig-script <master-name> <script-path>
若脚本执行后返回1,那么该脚本稍后将会被再次执行,重复次数目前默认为10
若脚本执行后返回2,或者比2更高的一个返回值,脚本将不会重复执行。
如果脚本在执行过程中由于收到系统中断信号被终止了,则同返回值为1时的行为相同。
一个脚本的最大执行时间为60s,如果超过这个时间,脚本将会被一个SIGKILL信号终止,之后重新执行。
我这里准备三台虚拟机来做集群
主机说明 主机IP Redis端口 Sentinel端口
Master
192.168.56.100
6379
26379
Slave
192.168.56.101
6379
26379
Slave
192.168.56.102
6379
26379
我们的哨兵采用的也是集群的模式,单点模式的话一旦出现问题比如网络阻塞, 将无法实现redis集群的主备切换.
如果多个哨兵的话,redis的客户端可以任意连接一个哨兵来获得redis集群信息,即使有部分哨兵退出,依然可以进行主备切换.
启动哨兵
启动哨兵
# Ubuntu下使用默认安装的可以使用这个命令service redis-sentinel start
# 或者这个
redis-sentinel /etc/redis/sentinel.conf
对比新旧哨兵配置文件
已被修改,可以看到多了几个Generated by CONFIG REWRITE
由配置重写的参数
- 主机100
# Generated by CONFIG REWRITEsentinel config-epoch mymaster 0
sentinel leader-epoch mymaster 0
# 指明了当前群集的从库的ip和端口,在主从切换时该值会改变
sentinel known-slave mymaster 192.168.56.102 6379
sentinel known-slave mymaster 192.168.56.101 6379
# 除了当前的哨兵还有哪些监控的哨兵
sentinel known-sentinel mymaster 192.168.56.101 26379 b8dddc8055e57b4c11360febc7d9cfcb5542ac37
sentinel known-sentinel mymaster 192.168.56.102 26379 0b24c05f721cc0c1542f17d143449da31a0acd6a
sentinel current-epoch 0
- 从机101
# Generated by CONFIG REWRITEsentinel config-epoch mymaster 0
sentinel leader-epoch mymaster 0
sentinel known-slave mymaster 192.168.56.102 6379
sentinel known-slave mymaster 192.168.56.101 6379
sentinel known-sentinel mymaster 192.168.56.102 26379 0b24c05f721cc0c1542f17d143449da31a0acd6a
sentinel known-sentinel mymaster 192.168.56.100 26379 e2f8e9e7c46df32a3dd4e1bfa578f7c39240e385
sentinel current-epoch 0
- 从机102
# Generated by CONFIG REWRITEsentinel config-epoch mymaster 0
sentinel leader-epoch mymaster 0
sentinel known-slave mymaster 192.168.56.102 6379
sentinel known-slave mymaster 192.168.56.101 6379
sentinel known-sentinel mymaster 192.168.56.100 26379 e2f8e9e7c46df32a3dd4e1bfa578f7c39240e385
sentinel known-sentinel mymaster 192.168.56.101 26379 b8dddc8055e57b4c11360febc7d9cfcb5542ac37
sentinel current-epoch 0
也可也使用Redis命令行查看哨兵的状态
redis-cli -p 端口 info Sentinel
这里主从显示的都一样就只记录一个得了
注意这里进入的不是Redis,所以不能执行Redis命令,比如set name nihao
.
# 除了这样,也可也使用redis-cli -p 26379进入以后再执行inforedis-cli -p 26379 info Sentinel
# 案例
root@ubuntu1:~# redis-cli -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.56.100:6379,slaves=2,sentinels=3
查看Redis主从的情况
- 主机100
可以看到当前机器为master他有两个从机slave0和slave1
root@ubuntu0:~# redis-cli info Replication# Replication
role:master
connected_slaves:2
slave0:ip=192.168.56.101,port=6379,state=online,offset=54668,lag=1
slave1:ip=192.168.56.102,port=6379,state=online,offset=54668,lag=1
master_replid:439dd06a0afd98708e953a3b86761a849763e6cc
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:54668
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:54668
- 从机101
可以看到当前机器为slave而他的主机为192.168.56.100
root@ubuntu1:~# redis-cli info Replication# Replication
role:slave
master_host:192.168.56.100
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:54239
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:439dd06a0afd98708e953a3b86761a849763e6cc
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:54239
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:523
repl_backlog_histlen:53717
- 从机102
可以看到当前机器为slave而他的主机是192.168.56.100
root@ubuntu2:~# redis-cli info Replication# Replication
role:slave
master_host:192.168.56.100
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:53939
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:439dd06a0afd98708e953a3b86761a849763e6cc
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:53939
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:47034
repl_backlog_histlen:6906
测试主从自动切换
手动杀死100机器上的master
root@ubuntu0:~# ps -ef | grep redisroot@ubuntu0:~# ps -ef | grep redis-server | awk "{print $2}" | xargs kill -9
root 1807 1 0 14:03 ? 00:00:01 redis-server 0.0.0.0:6379
root 1828 1 0 14:04 ? 00:00:02 redis-sentinel *:26379 [sentinel]
root 1953 1572 0 14:13 pts/0 00:00:00 grep --color=auto redis
root@ubuntu0:~# ps -ef | grep redis
root 1828 1 0 14:04 ? 00:00:02 redis-sentinel *:26379 [sentinel]
root 1957 1572 0 14:13 pts/0 00:00:00 grep --color=auto redis
- 101的哨兵
此时我们去101机器上可以看到该Redis已成为了master
root@ubuntu1:~# redis-cli -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.56.101:6379,slaves=2,sentinels=3
- 102的哨兵
此时我们去102机器上可以看到该Redis依然是slave,但是master0已经变成了101机器
root@ubuntu2:~# redis-cli -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.56.101:6379,slaves=2,sentinels=3
- 同时可以看到尚且存活的Redis中的
sentinel.conf
文件也已经发生了改变,即100没了
# Generated by CONFIG REWRITEsentinel config-epoch mymaster 1
sentinel leader-epoch mymaster 1
sentinel known-slave mymaster 192.168.56.102 6379
sentinel known-slave mymaster 192.168.56.100 6379
sentinel known-sentinel mymaster 192.168.56.100 26379 e2f8e9e7c46df32a3dd4e1bfa578f7c39240e385
sentinel known-sentinel mymaster 192.168.56.101 26379 b8dddc8055e57b4c11360febc7d9cfcb5542ac37
sentinel current-epoch 1
- 查看100机器上的sentinel日志可以看到有这么一端
尤其是下面的+selected-slave slave 192.168.56.101:6379 192.168.56.101 6379 @ mymaster 192.168.56.100 6379
就是告诉我们主机已切换为101机器
1828:X 04 Mar 14:13:32.911 # +sdown master mymaster 192.168.56.100 63791828:X 04 Mar 14:13:32.988 # +odown master mymaster 192.168.56.100 6379 #quorum 2/2
1828:X 04 Mar 14:13:32.988 # +new-epoch 1
1828:X 04 Mar 14:13:32.988 # +try-failover master mymaster 192.168.56.100 6379
1828:X 04 Mar 14:13:32.991 # +vote-for-leader e2f8e9e7c46df32a3dd4e1bfa578f7c39240e385 1
1828:X 04 Mar 14:13:32.995 # 0b24c05f721cc0c1542f17d143449da31a0acd6a voted for e2f8e9e7c46df32a3dd4e1bfa578f7c39240e385 1
1828:X 04 Mar 14:13:33.057 # +elected-leader master mymaster 192.168.56.100 6379
1828:X 04 Mar 14:13:33.057 # +failover-state-select-slave master mymaster 192.168.56.100 6379
1828:X 04 Mar 14:13:33.158 # +selected-slave slave 192.168.56.101:6379 192.168.56.101 6379 @ mymaster 192.168.56.100 6379
1828:X 04 Mar 14:13:33.158 * +failover-state-send-slaveof-noone slave 192.168.56.101:6379 192.168.56.101 6379 @ mymaster 192.168.56.100 6379
1828:X 04 Mar 14:13:33.249 * +failover-state-wait-promotion slave 192.168.56.101:6379 192.168.56.101 6379 @ mymaster 192.168.56.100 6379
1828:X 04 Mar 14:13:33.872 # +promoted-slave slave 192.168.56.101:6379 192.168.56.101 6379 @ mymaster 192.168.56.100 6379
1828:X 04 Mar 14:13:33.872 # +failover-state-reconf-slaves master mymaster 192.168.56.100 6379
1828:X 04 Mar 14:13:33.920 # +failover-end master mymaster 192.168.56.100 6379
重启100的Redis
可以看到100的Redis已经变成了slave
root@ubuntu0:~# redis-server /etc/redis/redis.confroot@ubuntu0:~# redis-cli -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.56.101:6379,slaves=2,sentinels=3
如果想看的更仔细,可以继续以下命令查看各个机器的情况
redis-cli -p 26379 info sentinelroot@ubuntu0:~# redis-cli info Replication
tail -f /var/log/redis/redis-sentinel.log
tail -f /etc/redis/sentinel.conf
到此完事
以上是 RedisSentinel哨兵 的全部内容, 来源链接: utcz.com/z/532510.html