目录
- 简介
- 作用
- 架构图
- 实现
1. 简介:
redis的主从方式,使得slavof在整个系统中起到了数据的冗余和备份的作用,但是当master服务挂了之后,整个redis服务处于停用的状态,这时需要有服务在几个slavof中选举出一个新的master服务继续对外提供服务,redis并没有提供master的选举机制,而是需要借助一个哨兵来进行监控并选举
2.1 作用:
- 监控master和slavof是否正常运行
- 在slavof中选举新的master服务
3. 架构图:
3.1 单哨兵模式
哨兵时一个独立的进程,使用单个哨兵时候的架构图
3.2 单哨兵存在问题
单个哨兵容易导致单点问题,哨兵的可用性解决方式就是多起几个哨兵的方式,一般都是起单数的哨兵数量以保证系统的稳定。此时哨兵不仅会监控master和slavof,还会监控哨兵,这就是哨兵集群
3.3 哨兵集群
4. 实现
4.1 redis 一主两从
主机 | 端口 | 作用 |
---|---|---|
192.168.127.131 | 6379 | 主 |
192.168.127.132 | 6379 | 从 |
192.168.127.133 | 6379 | 从 |
4.2 sentinel:三台
主机 | 端口 |
---|---|
192.168.127.131 | 26379 |
192.168.127.132 | 26379 |
192.168.127.133 | 26379 |
4.3 配置方式
配置sentinel.conf文件(目前主服务器没有配置密码)
port 26379
#mymaster 主服务名称自定义 后续配置都有使用
#192.168.127.131 6379当前主master服务器主机ip和端口 #最后的2表示在sentinel集群中只要有两个节点检测到redis主节点出故障就进行切换
sentinel monitor mymaster 192.168.127.131 6379 2
#去除保护模式 这个不配置,多sentinel的时候就是无法选举
protected-mode no
#如果3s内mymaster无响应,则认为mymaster宕机了
sentinel down-after-milliseconds mymaster 3000
#如果10秒后,mysater仍没活过来,则启动failover
sentinel failover-timeout mymaster 10000
#后台运行
daemonize yes
#配置运行日志地址
logfile "/home/sentinel.log"
4.4 启动
命令:
./redis-sentinel ../sentinel.conf
4.5 启动后各文件变化
启动后sentinel会自动去redis主服务读取个从服务器的信息以及sentinel服务器信息
sentinel.conf文件最后会自动添加如下信息
#选项指定了在执行故障转移时, 最多可以有多少个从服务器同时对新的主服务器进行同步
sentinel config-epoch mymaster 0
sentinel leader-epoch mymaster 0
#发现的从服务器地址
sentinel known-slave mymaster 192.168.127.132 6379
#发现的从服务器地址
sentinel known-slave mymaster 192.168.127.133 6379
#发现的sentinel服务器地址
sentinel known-sentinel mymaster 192.168.127.132 26379 9fd8006394b620e79492953cdd919f75ea5f922c
#发现的sentinel服务器地址
sentinel known-sentinel mymaster 192.168.127.133 26379 30c2efd882c5c454fdd8ac409a00a6eda6b154a1
sentinel current-epoch 0
4.6 sentinel选举日志
+sdown master mymaster 192.168.127.132 6379
+new-epoch 30
+vote-for-leader 5dd7a844b99e912240805591f43127594425a553 30
+odown master mymaster 192.168.127.132 6379 #quorum 3/2
Next failover delay: I will not start a failover before Sat Sep 29 17:46:51 2018
+config-update-from sentinel 5dd7a844b99e912240805591f43127594425a553 192.168.127.131 26379 @ mymaster 192.168.127.132 6379
+switch-master mymaster 192.168.127.132 6379 192.168.127.131 6379
+slave slave 192.168.127.133:6379 192.168.127.133 6379 @ mymaster 192.168.127.131 6379
+slave slave 192.168.127.132:6379 192.168.127.132 6379 @ mymaster 192.168.127.131 6379
+sdown slave 192.168.127.132:6379 192.168.127.132 6379 @ mymaster 192.168.127.131 6379
4.7 选举流程
- 每个sentinel节点会定期向master节点发送心跳包来判断存活状态
- 当down-after-milliseconds选项所指定的时间点都没有回复的时候,这个实例会被sentinel标记为主观下线
- 当足够多的sentinel的节点数>quorum的节点认为master节点进入主观下线状态时,则master会被标记为客观下线
- 如果sentinel有多个,需要先用raft算法,选出一个leader来做决策
- 重新选举出新的master
4.8 重新选举后各文件变化
当master挂掉之后自动完成选举后(假设新主为132),各redis.conf变化
#主redis.conf自动添加
slaveof 192.168.127.132 6379
#从变主redis.conf 自动去除slavefo属性
#令一个从服务器自动修改slaveof为新的主服务器地址
slaveof 192.168.127.132 6379
sentinel的sentinel.conf配置变化
#会自动替换成新的主服务器地址
sentinel monitor mymaster 192.168.127.132 6379 2
#会自动增加
sentinel config-epoch mymaster 1
#会自动增加
sentinel leader-epoch mymaster 1
#会自动增加
sentinel current-epoch 1