redis的哨兵_地面哨兵

redis的哨兵_地面哨兵[TOC] RedisSentinel哨兵 注意 若master实例故障,sentinel会重新选主并启动自动故障切换:选择slave-priority最小的那个slave实例并将其提升为maste…

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

代码100分

一步到位

代码100分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

配置解读

代码100分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 REWRITE
sentinel 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 REWRITE
sentinel 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 REWRITE
sentinel 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进入以后再执行info
redis-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 redis
root@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 REWRITE
sentinel 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 6379
1828: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.conf
root@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 sentinel
root@ubuntu0:~# redis-cli info Replication
tail -f /var/log/redis/redis-sentinel.log
tail -f /etc/redis/sentinel.conf

到此完事

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/9700.html

(0)
上一篇 2023-02-02
下一篇 2023-02-02

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注