RedisSentinel哨兵

database

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 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

到此完事

以上是 RedisSentinel哨兵 的全部内容, 来源链接: utcz.com/z/532510.html

回到顶部