精简版
0
0
0
云栖社区 > Java 技术进阶 > 博客 > 正文
javaedge 2019-07-06 11:59:17 浏览 238
云栖社区
分布式
Redis
架构
算法
java
监控
高可用
集群
测试
node
展开阅读全文
GitHub
1 Redis Sentinal 机制
sentinal, 中文名哨兵
哨兵是 Redis 集群架构中非常重要的一个组件, 主要功能如下
集群监控
监控 Redis master 和 slave 进程的正常工作
消息通知
如果某个 Redis 实例有故障, 那么哨兵负责发送报警消息给管理员
故障转移
若 master node 宕机, 会自动转移到 slave node 上
配置中心
若发生故障转移, 通知 client 客户端新的 master 地址
哨兵本身也是分布式的, 作为一个哨兵集群去运行, 协同工作
故障转移时, 判断一个 master node 是否宕机, 需要大部分的哨兵都同意, 涉及到了分布式选举问题
即使部分哨兵节点宕机, 哨兵集群还是能正常工作的
目前采用的是 sentinal 2 版本, sentinal 2 相对于 sentinal 1 来说, 重写了很多代码, 主要是让故障转移的机制和算法变得更加健壮和简单
2 哨兵的核心知识
哨兵需要至少 3 个实例, 保证自己的健壮性
哨兵 + Redis 主从的部署架构, 是不会保证数据零丢失的, 只能保证 Redis 集群的高可用性
对于哨兵 + Redis 主从这种复杂的部署架构, 尽量在测试环境和生产环境, 都进行充足的测试和演练
3 为什么仅 2 个节点时无法正常工作
必须部署 2 个以上的节点
若仅部署 2 个实例, quorum=1
- +----+ +----+
- | M1 |---------| R1 |
- | S1 | | S2 |
- +----+ +----+
- Configuration: quorum = 1
master 宕机, s1 和 s2 中只要有 1 个哨兵认为 master 宕机就可以进行切换, 同时会在 s1 和 s2 中选举出一个执行故障转移.
但此时, 需要 majority, 也就是大多数哨兵都是运行的, 2 个哨兵的 majority 就是 2
2 个哨兵的 majority=2
3 个哨兵的 majority=2
4 个哨兵的 majority=2
5 个哨兵的 majority=3
2 个哨兵都运行着, 就可以允许执行故障转移
若整个 M1 和 S1 运行的机器宕机了, 那么哨兵仅剩 1 个, 此时就无 majority 来允许执行故障转移, 虽然另外一台机器还有一个 R1, 但故障转移不会执行
4 3 - 节点哨兵集群 (经典)
- +----+
- | M1 |
- | S1 |
- +----+
- |
- +----+ | +----+
- | R2 |----+----| R3 |
- | S2 | | S3 |
- +----+ +----+
- Configuration: quorum = 2,majority
若 M1 节点宕机了, 还剩下 2 个哨兵, S2 和 S3 可以一致认为 master 宕机了, 然后选举出一个来执行故障转移
同时 3 个哨兵的 majority 是 2, 所以余存的 2 个哨兵运行着, 就可执行故障转移
参考
《Java 工程师面试突击第 1 季 - 中华石杉老师》
来源: https://yq.aliyun.com/articles/707889