前言
Redis Sentinel是Redis官方建议的高可用(HA)解决方案,在我们搭建Redis集群时,Redis本身并未集成主备切换功能,sentinel本身是独立运行的,能够监控多个Redis集群,发现master宕机后能够自动切换,选举一个slave成为新的master,当原master恢复之后,sentinel会自动将其作为slave加入到集群中,整个过程不需要人工参与,完全自动化。
主要介绍
-
sentinel主要功能
- 定期监控Redis服务是否运行正常
- 定期监控其他sentinel服务是否正常
- 能够自动切换master节点
- sentinel节点不存储数据
-
sentinel集群
这个不难理解,如果我们用一个非高可用的sentinel去实现Redis的高可用,明显是不科学的,当这一台sentinel宕机之后,Redis显然无法继续保持它的高可用,所以我们在部署sentinel的时候也会采用集群的方式
优势:
即使有sentinel服务宕机,只要还有一台sentinel运行正常,就可以使Redis继续保持高可用
-
sentinel版本问题
sentinel在Redis2.6版本中引入的,当时是sentinel 1,貌似有蛮多问题,毕竟初版
在Redis2.8版本中升级到sentinel 2,之后就非常稳定了
不过现在Redis已经发展了很久,版本也越来越高,sentinel已经非常值得信赖了
-
sentinel中的定时任务
- 每隔10秒向各个Redis服务器(master和slave节点)发送INFO命令,根据回应获取master和slave信息,通过master的回复可以获取到新增的slave节点
- 每隔02秒向Redis的master服务器发送命令(hello消息),用于发现和监视其他sentinel,sentinel之间的监控不在额外创建订阅
- 每隔01秒向Redis和sentinel所有服务发送PING消息(sentinel本身的ip、端口、id等内容),通过回复PONG判断服务是否在线
-
下线判断
- 主观下线:当前sentinel断定master下线
- 客观下线:满足sentinel配置文件中quorum数量的sentinel均断定master下线
-
配置文件解读
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35# sentinel运行的端口,默认为26379
port 26377
dir "/private/tmp"
logfile "/var/log/redis/sentinel_26377.log"
# 以守护进程执行
daemonize yes
# 守护进程运行的pid保存文件
pidfile "/var/run/redis-sentinel.pid"
# 格式:sentinel monitor <master-name> <ip> <redis-port> <quorum>
# 该行的意思是:<master-name>:自定义
# <ip>:master主机的IP
# <redis-port>:master的端口
# <quorum>:表示在sentinel集群中,使master由主观下线变为客观下线的sentinel数量。
sentinel monitor cc_master 127.0.0.1 6379 2
# 格式:sentinel down-after-milliseconds <master-name> <milliseconds>
# sentinel会向master发送心跳PING来确认master是否存活,如果master在<milliseconds>时间内回应的不是PONG,那么这个sentinel会主观地认为这个master下线了。<milliseconds>的单位是毫秒,默认30秒。
sentinel down-after-milliseconds cc_master 15000
# 格式:sentinel failover-timeout <master-name> <milliseconds>
# failover过期时间,当failover开始后,在此时间内仍然没有触发任何failover操作,当前sentinel将会认为此次failoer失败。默认180秒,即3分钟。
sentinel failover-timeout cc_master 60000
# sentinel parallel-syncs <master-name> <numreplicas>
# 在发生failover主备切换时,这个选项指定了最多可以有多少个slave同时对新的master进行同步,这个数字越小,完成failover所需的时间就越长,但是如果这个数字越大,就意味着越多的slave因为replication而不可用。可以通过将这个值设为1来保证每次只有一个slave处于不能处理命令请求的状态。
sentinel parallel-syncs cc_master 1
# 格式:sentinel auth-pass <master-name> <password>
# sentinel连接的master节点的登录密码
sentinel auth-pass cc_master redis -
故障转移
- sentinel使用Raft投票选举出一个leader去执行故障转移
- 每一个将master标记为主观下线的sentinel节点发起投票
- 其他sentinel节点收到投票后,若尚未参与投票(也就是尚未投票给其他sentinel),则同意,否则拒绝
- 最终收到过半同意的sentinel节点作为leader
- 若有两个sentinel收到了过半投票,那么就再重新选举
- 选举新的master节点
- 选择replica-priority配置数字最高的slave节点为master,默认为100
- 若replica-priority相同,则选择偏移量最大的slave节点,偏移量是指slave从master同步的进度,偏移量越大说明数据越完整,可以通过Redis的info命令查看(slave_repl_offset)当前slave的偏移量
- 若偏移量相同,则选择最先启动的slave作为master
- 更改master后,通知其他slave节点同步为新的master节点的slave节点
- 原master节点恢复之后自动加入到集群中,成为新master的slave节点
- sentinel使用Raft投票选举出一个leader去执行故障转移
实战
在本机上启动3个Redis实例,采用1主2从的模式,以下只记录redis.conf和sentinel.conf中关键内容
-
redis.conf
-
redis-master.conf配置
1
2# 默认端口
port 6379 -
redis-slave1.conf配置
1
2
3
4
5
6# 端口
port 63791
# 格式:replicaof <masterip> <masterport>
# 从节点归属的master节点
replicaof 127.0.0.1 6379 -
redis-slave2.conf配置
1
2
3
4
5
6# 端口
port 63792
# 格式:replicaof <masterip> <masterport>
# 从节点归属的master节点
replicaof 127.0.0.1 6379
-
-
sentinel.conf
-
sentinel0.conf
1
2
3
4
5
6
7# 端口
port 26379
sentinel myid 842c9102c48eb0cedeb06fe55e7d2258595ac267
# 监控master
sentinel monitor cc_master 127.0.0.1 6379 2 -
sentinel1.conf
1
2
3
4
5
6
7# 端口
port 26378
sentinel myid 842c9102c48eb0cedeb06fe55e7d2258595ac266
# 监控master
sentinel monitor cc_master 127.0.0.1 6379 2 -
sentinel2.conf
1
2
3
4
5
6
7# 端口
port 26377
sentinel myid 842c9102c48eb0cedeb06fe55e7d2258595ac265
# 监控master
sentinel monitor cc_master 127.0.0.1 6379 2
-
-
启动
-
启动sentinel
1
2
3
4
5redis-sentinel ~/Documents/develop_tools/tools/redis-5.0.5/sentinel0.conf
redis-sentinel ~/Documents/develop_tools/tools/redis-5.0.5/sentinel1.conf
redis-sentinel ~/Documents/develop_tools/tools/redis-5.0.5/sentinel2.conf -
启动Redis
1
2
3
4
5redis-server ~/Documents/develop_tools/tools/redis-5.0.5/redis-master.conf
redis-server ~/Documents/develop_tools/tools/redis-5.0.5/redis-slave1.conf
redis-server ~/Documents/develop_tools/tools/redis-5.0.5/redis-slave2.conf
-
Redis通过info查看信息
127.0.0.1:6379>info all
1 | # Server服务器信息 |