分布式缓存Redis-哨兵

1.前言

  当使用一主多从的redis系统时,如果主数据库出现故障就需要手动选择一个从数据库升格为主数据库。所以我门就需要哨兵来实现自动化的系统监控和故障恢复功能。

2.什么是哨兵

  哨兵的作用就是监控redis系统的运行状况。它的功能包括以下两个:

  1. 监控主数据库和从数据库是否正常运行。

  2. 主数据库出现故障时自动将从数据库转换为主数据库。

  哨兵是一个独立的进程,在一个一主多从的redis系统中,可以使用多个哨兵进行监控任务以保证系统足够稳健,此时哨兵不仅会同时监控主从数据库,哨兵相互之间也会互相监控。

3.使用哨兵

  我们先建立一个一主二从的redis数据库配置,其中端口6380和6381是从数据库,6379是主数据库,如下:

redis-server --port 6380 --slaveof 127.0.0.1 6379
redis-server --port 6381 --slaveof 127.0.0.1 6379

  接下来配置哨兵。建立一个配置文件,如sentinel.conf,内容为:

sentinel monitor mymaster 127.0.0.1 6379 1

  其中mymaster表示要监控的主数据的名字,可以自定义。这个名字必须仅有大小写字母、数据和“.-_”这三个字符组成。后两个参数表示主数据库的地址和端口,最后一位表示最低通过票数。然后启动该哨兵:

C:\Users\Xu>redis-server.exe E:\redis\sentinel.conf --sentinel

[16596] 23 May 15:03:15.351 # Sentinel ID is 86c7bf6fe7d13e2392ac25580463d764ec4c678d
[16596] 23 May 15:03:15.351 # +monitor master mymaster 127.0.0.1 6379 quorum 1
[16596] 23 May 15:03:15.353 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379
[16596] 23 May 15:03:15.360 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379

  可以看到哨兵已经自动查询到了主数据库的两个从数据库,并监控了这三个redis实例。接着我们直接将redis的实例进程关闭,等待一会可以看到哨兵输出了以下:

[16596] 23 May 15:06:30.583 # +sdown master mymaster 127.0.0.1 6379
[16596] 23 May 15:06:30.583 # +odown master mymaster 127.0.0.1 6379 #quorum 1/1
[16596] 23 May 15:06:30.584 # +new-epoch 1
[16596] 23 May 15:06:30.584 # +try-failover master mymaster 127.0.0.1 6379
[16596] 23 May 15:06:30.586 # +vote-for-leader 86c7bf6fe7d13e2392ac25580463d764ec4c678d 1
[16596] 23 May 15:06:30.586 # +elected-leader master mymaster 127.0.0.1 6379
[16596] 23 May 15:06:30.593 # +failover-state-select-slave master mymaster 127.0.0.1 6379
[16596] 23 May 15:06:30.657 # +selected-slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379
[16596] 23 May 15:06:30.657 * +failover-state-send-slaveof-noone slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379
[16596] 23 May 15:06:30.759 * +failover-state-wait-promotion slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379
[16596] 23 May 15:06:31.611 # +promoted-slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379
[16596] 23 May 15:06:31.611 # +failover-state-reconf-slaves master mymaster 127.0.0.1 6379
[16596] 23 May 15:06:31.708 * +slave-reconf-sent slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379
[16596] 23 May 15:06:32.668 * +slave-reconf-inprog slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379
[16596] 23 May 15:06:32.668 * +slave-reconf-done slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379
[16596] 23 May 15:06:32.743 # +failover-end master mymaster 127.0.0.1 6379
[16596] 23 May 15:06:32.743 # +switch-master mymaster 127.0.0.1 6379 127.0.0.1 6380
[16596] 23 May 15:06:32.744 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380
[16596] 23 May 15:06:32.744 * +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6380
[16596] 23 May 15:07:02.778 # +sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6380

  通过哨兵的输出内容可以看到,已经将端口6380的redis实例转为主数据库,6379的redis实例转为从数据库。其中“+sdown”表示哨兵主观认为主数据库已经停止服务了,而“+odown“表示哨兵客观的认为主数据已经停止服务了,”#quorum 1/1“表示总共有一个哨兵一个同意。”+try-failover“表示哨兵可是进行故障恢复,”+failover-end“表示故障恢复结束。”+switch-master“表示主数据库从6379端口迁移到6380,同时确定了其他的从数据库。如果6380在之后恢复了,那会继续当从数据库来运行。

 4.实现原理

  一个哨兵进程启动时会读取配置文件的内容,通过如下的配置找出需要监控的主数据库:

sentinel monitor master-name ip redis-port quorum

   一个哨兵可以同时监控多个主从节点,只要配置多个sentinel monitor就行。多个哨兵也可同时监控一个redis主从系统,从而形成网状结构。在配置文件中还可以定义其他的监控参数,例如:

# 当在Redis实例中开启了requirepass foobared 授权密码 这样所有连接Redis实例的客户端都要提供密码
# 设置哨兵sentinel 连接主从的密码 注意必须为主从设置一样的验证密码
# sentinel auth-pass <master-name> <password>
sentinel auth-pass mymaster MySUPER--secret-0123passw0rd
 
# 指定多少毫秒之后 主节点没有应答哨兵sentinel 此时 哨兵主观上认为主节点下线 默认30秒
# sentinel down-after-milliseconds <master-name> <milliseconds>
sentinel down-after-milliseconds mymaster 30000
 
# 这个配置项指定了在发生failover主备切换时最多可以有多少个slave同时对新的master进行 同步,
这个数字越小,完成failover所需的时间就越长,
但是如果这个数字越大,就意味着越 多的slave因为replication而不可用。
可以通过将这个值设为 1 来保证每次只有一个slave 处于不能处理命令请求的状态。
# sentinel parallel-syncs <master-name> <numslaves>
sentinel parallel-syncs mymaster 1
 
# 故障转移的超时时间 failover-timeout 可以用在以下这些方面: 
#1. 同一个sentinel对同一个master两次failover之间的间隔时间。
#2. 当一个slave从一个错误的master那里同步数据开始计算时间。直到slave被纠正为向正确的master那里同步数据时。
#3.当想要取消一个正在进行的failover所需要的时间。  
#4.当进行failover时,配置所有slaves指向新的master所需的最大时间。不过,即使过了这个超时,slaves依然会被正确配置为指向master,但是就不按parallel-syncs所配置的规则来了
# 默认三分钟
# sentinel failover-timeout <master-name> <milliseconds>
sentinel failover-timeout mymaster 180000

   哨兵启动后,会与要监控的主数据库建立两条连接,这两个连接的建立方式和普通的redis客户端一样。其中一条连接用来订阅该主数据的_sentinel_:hello频道以获取其他同样监控该数据库的哨兵节点信息,另外哨兵也需要定期向主数据库发送info等命令来获取主数据库本身的信息,因为连接进入订阅模式时就不能再执行其他命令,所以另一条连接来发送这些命令。和主数据库的连接建立完成后,哨兵会定时执行下面3个操作,贯穿哨兵的整个生命周期:

  • 每十秒哨兵向主数据库和从数据库发送info命令。
  • 每两秒哨兵向主数据库和从数据库的_sentinel_:hello频道发送自己的信息。
  • 每一秒哨兵向主数据库、从数据库和其他哨兵节点发送ping命令。

 

posted @ 2020-05-30 10:41  以往清泉  阅读(311)  评论(0编辑  收藏  举报
//替换成自己路径的js文件