Redis哨兵模式介绍及配置

Redis哨兵系统

redis哨兵模式单节点部署和分布式集群部署,主要功能如下

主要功能

  • 监控redis集群运行状态
  • 事件通知,在集群发生故障时通知管理员
  • 故障自动处理,可以根据配置处理故障转移
  • 提供给客户最新配置

开启一个哨兵

redis-sentinel启动

redis-sentinel sentinel.conf

redis-server启动

redis-server sentinel.conf --sentinel

这里使用redis-sentinel启动

3409:X 03 Mar 2021 14:14:27.938 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
3409:X 03 Mar 2021 14:14:27.938 # Redis version=6.0.10, bits=64, commit=00000000, modified=0, pid=3409, just started
3409:X 03 Mar 2021 14:14:27.938 # Configuration loaded
3409:X 03 Mar 2021 14:14:27.939 * Increased maximum number of open files to 10032 (it was originally set to 2560).
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 6.0.10 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                   
 (    '      ,       .-`  | `,    )     Running in sentinel mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 26379
 |    `-._   `._    /     _.-'    |     PID: 3409
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

3409:X 03 Mar 2021 14:14:27.942 # Sentinel ID is 4f2331e824e2b5bcc26c5a9d21781fee13c6f7a5
3409:X 03 Mar 2021 14:14:27.942 # +monitor master mymaster 127.0.0.1 6379 quorum 2

可以看到我们使用默认配置启动了,没有修改配置的话,默认监控 127.0.0.1 6379

哨兵配置

sentinel.conf

# 绑定固定IP
bind 127.0.0.1
# 是否开启保护模式
protected-mode no
# 哨兵的数据交互端口
port 26379
# 是否后台运行
daemonize no
# pid文件配置
pidfile /var/run/redis-sentinel.pid
# 日志配置
logfile ""
# 指定实例可访问IP和端口 
# 当配置以下地址后,该实例将在集群内广播此信息,其他实例将使用此地址访问该实例
sentinel announce-ip 10.0.0.1
sentinel announce-port 8080
# 工作文件夹
dir /tmp
# 配置哨兵监控的集群,<quorum>个哨兵同意后,才可将主节点置为D_DOWN状态
sentinel monitor <master-name> <ip> <redis-port> <quorum>
# 配置监控集群密码及用户
sentinel auth-pass <master-name> <password>
sentinel auth-user <master-name> <username>
# 配置超时时间后节点状态置为S_DOWN状态
sentinel down-after-milliseconds <master-name> <milliseconds>
# 哨兵访问密码,哨兵集群中如配置了密码,则需要配置相同的密码,哨兵实例会使用同一个密码访问其他实例
requirepass <password>
# 配置故障转移期间,哨兵可以配置多少个副本同时指向新节点
sentinel parallel-syncs <master-name> <numreplicas>
# 配置故障转移超时时间
sentinel failover-timeout <master-name> <milliseconds>
# 配置发生故障转移时,用于通知的脚本
sentinel notification-script <master-name> <script-path>
# 配置发生故障转移时,用户刷新客户端配置的脚本
sentinel client-reconfig-script <master-name> <script-path>
# 配置脚本是否可热更改
sentinel deny-scripts-reconfig yes
# 命令重命名
SENTINEL rename-command mymaster CONFIG CONFIG

搭建一个哨兵集群

一个完整的Redis高可用集群,首先需要一个redis集群和和一个哨兵集群,redis集群这里就不细说搭建了,感兴趣的小伙伴可以去翻我以前文章,这里我们重点介绍一下哨兵集群

首先准备配置文件sentinel.conf

port 5001

sentinel monitor mastera 127.0.0.1 7001 2
sentinel down-after-milliseconds mastera 5000
sentinel failover-timeout mastera 60000
sentinel parallel-syncs mastera 1

sentinel monitor masterb 127.0.0.1 7002 2
sentinel down-after-milliseconds masterb 5000
sentinel failover-timeout masterb 60000
sentinel parallel-syncs masterb 1

sentinel monitor masterc 127.0.0.1 7003 2
sentinel down-after-milliseconds masterc 5000
sentinel failover-timeout masterc 60000
sentinel parallel-syncs masterc 1

sentinel monitor masterd 127.0.0.1 7008 2
sentinel down-after-milliseconds masterd 5000
sentinel failover-timeout masterd 60000
sentinel parallel-syncs masterd 1

这里需要配置主机节点信息,可在redis集群中使用命令查看

redis-cli -p 7001 cluster nodes | grep master

image-20210303150352607

使用以上配置启动3个哨兵

如需在同一台机器上启动,则需要修改端口号

# 启动命令
redis-sentinel sentinel.conf

一个完整的进程如下

# ps -ef | grep redis
	
  501  3352     1   0  2:12下午 ??         0:28.53 redis-server *:7001 [cluster] 
  501  3354     1   0  2:12下午 ??         0:28.61 redis-server *:7002 [cluster] 
  501  3356     1   0  2:12下午 ??         0:28.32 redis-server *:7003 [cluster] 
  501  3358     1   0  2:12下午 ??         0:28.43 redis-server *:7004 [cluster] 
  501  3360     1   0  2:12下午 ??         0:29.96 redis-server *:7005 [cluster] 
  501  3362     1   0  2:12下午 ??         0:28.33 redis-server *:7006 [cluster] 
  501  4397     1   0  3:14下午 ??         0:02.93 redis-server *:7008 [cluster] 
  501  4467     1   0  3:15下午 ??         0:01.80 redis-server *:7007 [cluster] 
  501  4322  3336   0  3:10下午 ttys000    0:02.99 redis-sentinel *:5001 [sentinel] 
  501  4338  4113   0  3:11下午 ttys001    0:02.86 redis-sentinel *:5002 [sentinel] 
  501  4376  4343   0  3:13下午 ttys002    0:02.42 redis-sentinel *:5003 [sentinel] 
  501  4565  4383   0  3:21下午 ttys003    0:00.00 grep redis

集群信息如下

# redis-cli -p 7001 cluster nodes  

6aaaff204289440db6dbe0be589fb46522ba015c 127.0.0.1:7001@17001 myself,master - 0 1614756186000 1 connected 666-5460
8bc190edfeafc9bdd71d68faca062e1f491b83ed 127.0.0.1:7004@17004 slave faf57276fcd0e44c09472beb13ed64a972db3d79 0 1614756187441 3 connected
299403c911514294d69cae39dc621c08bf1af184 127.0.0.1:7002@17002 master - 0 1614756188453 2 connected 6128-10922
c4dc9e656c66c870836686e455244f742d300911 127.0.0.1:7007@17007 slave 6aaaff204289440db6dbe0be589fb46522ba015c 0 1614756188555 1 connected
faf57276fcd0e44c09472beb13ed64a972db3d79 127.0.0.1:7003@17003 master - 0 1614756187000 3 connected 11589-16383
68323fc50d406d860467bf40c1f26ed39d5f9410 127.0.0.1:7005@17005 slave 3f3abba12b3acbea3eb2e45e8ca3ec1493f864a0 0 1614756187000 7 connected
3f3abba12b3acbea3eb2e45e8ca3ec1493f864a0 127.0.0.1:7008@17008 master - 0 1614756188555 7 connected 0-665 5461-6127 10923-11588
bdf81d7c75edfd7d7778af82573f36990adc13e5 127.0.0.1:7006@17006 slave 299403c911514294d69cae39dc621c08bf1af184 0 1614756188000 2 connected

哨兵运行日志

4322:X 03 Mar 2021 15:10:43.059 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
4322:X 03 Mar 2021 15:10:43.059 # Redis version=6.0.10, bits=64, commit=00000000, modified=0, pid=4322, just started
4322:X 03 Mar 2021 15:10:43.059 # Configuration loaded
4322:X 03 Mar 2021 15:10:43.060 * Increased maximum number of open files to 10032 (it was originally set to 2560).
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 6.0.10 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                   
 (    '      ,       .-`  | `,    )     Running in sentinel mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 5001
 |    `-._   `._    /     _.-'    |     PID: 4322
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

4322:X 03 Mar 2021 15:10:43.063 # Sentinel ID is 2c0687b9adb5186b93435fc02e2a8f13c3d5d122
4322:X 03 Mar 2021 15:10:43.063 # +monitor master masterc 127.0.0.1 7003 quorum 2
4322:X 03 Mar 2021 15:10:43.063 # +monitor master masterb 127.0.0.1 7002 quorum 2
4322:X 03 Mar 2021 15:10:43.063 # +monitor master masterd 127.0.0.1 7008 quorum 2
4322:X 03 Mar 2021 15:10:43.063 # +monitor master mastera 127.0.0.1 7001 quorum 2
4322:X 03 Mar 2021 15:10:43.065 * +slave slave 127.0.0.1:7006 127.0.0.1 7006 @ masterb 127.0.0.1 7002
4322:X 03 Mar 2021 15:10:43.066 * +slave slave 127.0.0.1:7004 127.0.0.1 7004 @ masterc 127.0.0.1 7003
4322:X 03 Mar 2021 15:10:48.101 # +sdown master masterd 127.0.0.1 7008
4322:X 03 Mar 2021 15:11:28.963 * +sentinel sentinel 38c0b7911e511107dd2cb7bd5c65a6046cfb6746 127.0.0.1 5002 @ masterb 127.0.0.1 7002
4322:X 03 Mar 2021 15:11:28.966 * +sentinel sentinel 38c0b7911e511107dd2cb7bd5c65a6046cfb6746 127.0.0.1 5002 @ mastera 127.0.0.1 7001
4322:X 03 Mar 2021 15:11:28.968 * +sentinel sentinel 38c0b7911e511107dd2cb7bd5c65a6046cfb6746 127.0.0.1 5002 @ masterc 127.0.0.1 7003
4322:X 03 Mar 2021 15:13:36.063 * +sentinel sentinel 28383fa71f6783f803f00bef078c4b992269b848 127.0.0.1 5003 @ masterb 127.0.0.1 7002
4322:X 03 Mar 2021 15:13:36.067 * +sentinel sentinel 28383fa71f6783f803f00bef078c4b992269b848 127.0.0.1 5003 @ masterc 127.0.0.1 7003
4322:X 03 Mar 2021 15:13:36.069 * +sentinel sentinel 28383fa71f6783f803f00bef078c4b992269b848 127.0.0.1 5003 @ mastera 127.0.0.1 7001
4322:X 03 Mar 2021 15:14:05.747 # -sdown master masterd 127.0.0.1 7008
4322:X 03 Mar 2021 15:14:06.106 * +sentinel sentinel 28383fa71f6783f803f00bef078c4b992269b848 127.0.0.1 5003 @ masterd 127.0.0.1 7008
4322:X 03 Mar 2021 15:14:06.391 * +sentinel sentinel 38c0b7911e511107dd2cb7bd5c65a6046cfb6746 127.0.0.1 5002 @ masterd 127.0.0.1 7008
4322:X 03 Mar 2021 15:14:15.690 * +slave slave 127.0.0.1:7005 127.0.0.1 7005 @ masterd 127.0.0.1 7008
4322:X 03 Mar 2021 15:20:35.503 * +slave slave 127.0.0.1:7007 127.0.0.1 7007 @ mastera 127.0.0.1 7001
4322:X 03 Mar 2021 15:28:55.885 # +sdown master mastera 127.0.0.1 7001
4322:X 03 Mar 2021 15:28:55.970 # +new-epoch 1
4322:X 03 Mar 2021 15:28:55.971 # +vote-for-leader 28383fa71f6783f803f00bef078c4b992269b848 1
4322:X 03 Mar 2021 15:28:55.990 # +odown master mastera 127.0.0.1 7001 #quorum 2/2
4322:X 03 Mar 2021 15:28:55.991 # Next failover delay: I will not start a failover before Wed Mar  3 15:30:56 2021
4322:X 03 Mar 2021 15:28:59.202 # +config-update-from sentinel 28383fa71f6783f803f00bef078c4b992269b848 127.0.0.1 5003 @ mastera 127.0.0.1 7001
4322:X 03 Mar 2021 15:28:59.202 # +switch-master mastera 127.0.0.1 7001 127.0.0.1 7007
4322:X 03 Mar 2021 15:28:59.202 * +slave slave 127.0.0.1:7001 127.0.0.1 7001 @ mastera 127.0.0.1 7007
4322:X 03 Mar 2021 15:29:04.249 # +sdown slave 127.0.0.1:7001 127.0.0.1 7001 @ mastera 127.0.0.1 7007
4322:X 03 Mar 2021 15:31:22.858 # -sdown slave 127.0.0.1:7001 127.0.0.1 7001 @ mastera 127.0.0.1 7007

可以看到一个哨兵监控了4个主节点mastera、masterb、masterb、masterc,因为masterd我没有启动,出现了+sdown master masterd 127.0.0.1 7008,启动了masterd后-sdown master masterd 127.0.0.1 7008,从哨兵日志可以清楚了解redis集群的节点变动情况

小结

Redis哨兵模式,跟想象中的有差别,学习之后逐渐明白

参考

https://redis.io/topics/sentinel

image-20210303155727252