Redis哨兵
作用:监控主节点和从节点的状态,自动完成故障发现和故障迁移(保证Redis服务的高可用)
节点信息:
角色 | IP | 端口 | 别名 |
---|---|---|---|
master | 127.0.0.1 | 6379 | 主节点 |
slave-A | 127.0.0.1 | 7001 | 从节点A |
slave-B | 127.0.0.1 | 7002 | 从节点B |
slave-C | 127.0.0.1 | 7003 | 从节点C |
sentinel-A | 127.0.0.1 | 8001 | 哨兵A |
sentinel-B | 127.0.0.1 | 8002 | 哨兵B |
sentinel-C | 127.0.0.1 | 8003 | 哨兵C |
哨兵配置文件
daemonize yes
Port 8001
sentinel monitor mymaster 127.0.0.1 6379 2
启动所有服务
启动之后,哨兵会根据节点信息修改配置文件(真的是直接修改)
关闭6379端口的主节点
关闭主节点后,选取了slave-B(port:7002)作为新的主节点,并且重写了所有节点的配置文件(直接改变了conf下的文件),当原来的master(port:6379)重新启动后会作为现在主节点的从节点
实现原理
- 每个哨兵都有三个定时任务监控
- 每隔10秒,向主节点和从节点发送info命令,获取最新的拓扑结构
- 每隔2秒,哨兵向Redis数据解读的sentinel:hello频道上发送该哨兵对主节点的判断以及当前哨兵(自身)的信息
- 每隔1秒,哨兵向所有节点和其它哨兵发送ping命令做一次心跳检测,确实是否可达
- 主观下线和客观下线
- 主观下载:当前哨兵ping检测,超过了down-after-milliseconds没有进行回复,该哨兵对该节点做失败判定,这是主观下线
- 客观下线:当哨兵主观下线的节点是主节点时,会通过sentinel is-master-down-by-addr命令询问其它哨兵对主节点的判断,如果超过<quorum>个数,当前哨兵认为主节点确实有问题,这时该哨兵做出客观下线的决定
- 领导者 Sentinel 节点选举
- 每个 Sentinel都可以成为领导者,当Sentinel认为主节点主观下线之后,发送sentinel is-master-down-by-addr命令,要求将自己设置为领导者
- 收到命令的Sentinel节点,如果没有同意过其他Sentinel节点的sentinel is-master-down-by-addr命令,将同意,否则将拒绝(只能同意一个Sentinel)
- 如果该Sentinel节点发现自己的票数已经大于max(quorum, num(sentinels)/2 + 1),那么它将成为领导者
- 如果没有产生领导者,进行下一次选举
- 选择从节点(slave)作为新的主节点(master)
<img src='https://wang_ya_nan.gitee.io/pages/image/2018/05/16/redis.svg' style="align-content: center;width: 90%;margin:20px auto;display:block;"></img>
说明
- 官方配置说明路径 redis/sentinel.conf (以后补个可下载路径)
- 官方API说明
网友评论