MySQL · Redis · Elasticsearch · MongoDB · Kafka · ZooKeeper · Nacos
7 大技术的高可用方案、集群架构、选型指南、故障处理,一页讲透
| 技术 | 最小高可用方案 | 推荐集群方案 | 自动故障转移 | 数据分片 | 复杂度 |
|---|---|---|---|---|---|
| MySQL | 主从复制(1主N从) | MGR(Group Replication)或 MHA | MHA / Orchestrator 自动切 | ShardingSphere / MyCat | 中 |
| Redis | 主从复制(1主N从) | 哨兵 Sentinel + 主从 | 哨兵投票自动升主 | Cluster 槽位分片(16384) | 中 |
| ES | 多节点 + 副本分片 | 原生集群(Master/Data/Coordinating) | Master 选举 + 副本提升 | 路由算法自动分片 | 低→中 |
| MongoDB | 副本集 Replica Set(3节点) | 副本集 + 分片 Sharded Cluster | Raft 选举新 Primary | Mongos 路由 + Config Server | 中 |
| Kafka | 多副本 Replication(3副本) | Broker 集群 + ISR 同步队列 | Controller 重新分配 Leader | Partition 分区 | 中 |
| ZooKeeper | 3/5 节点 ensemble(奇数) | Zab 协议 Leader+Follower | Zab 协议自动选举 | 无(协调服务不存大数据) | 低 |
| Nacos | AP模式:Distro 协议 CP模式:Raft |
3+ 节点集群 | Distro 各节点平等 Raft Leader选举 |
无(注册中心/配置中心) | 低 |
冗余 ≠ 高可用,冗余只是第一步,自动故障转移才是关键。
| 阶段 | 方案 | 架构 | 故障转移 | 适合场景 |
|---|---|---|---|---|
| Lv.1 基础 | 主从复制 | 1 主 N 从,binlog 异步同步 | ❌ 手动切换(改 VIP 或 DNS) | 读写分离 + 数据备份,能接受人工介入 |
| Lv.2 进阶 | MHA(Master High Availability) | 主从 + MHA Manager 监控进程 | ✅ 自动检测 + 自动提升最优从库为主(30s 内完成) | 要高可用但不接受 MySQL 原生 MGR 的限制 |
| Lv.3 生产 | MGR(Group Replication,MySQL 5.7.17+) | Paxos 协议多主/单主模式,所有节点互相同步 | ✅ 自动检测 + 自动踢出故障节点 + 新主自动接管 | MySQL 官方推荐方案,强一致性要求 |
| 阶段 | 方案 | 架构 | 数据容量 | 复杂度 |
|---|---|---|---|---|
| Lv.1 基础 | 主从复制 | 1 主 N 从,异步复制(2.8 版本前只支持全量同步,之后支持增量) | 受单机内存限制(最大 ~单机 RAM) | 低 |
| Lv.2 推荐 | 主从 + 哨兵 Sentinel | 主从 + 3 个哨兵进程监控,主挂了投票选出新主并通知客户端 | 同上(仍受单机内存限制) | 中 |
| Lv.3 海量 | 集群 Cluster | 16384 个槽位分布在多个主节点,每个主有从节点备份 | 理论上无限(加节点就行) | 高 |
Elasticsearch 天然就是分布式设计的——创建索引时就自动分片。不像 MySQL/Redis 需要额外搭建集群组件。
| 角色 | 职责 | 资源需求 | 生产建议 |
|---|---|---|---|
| Master-eligible | 管理集群状态(创建索引、分配分片、节点加入退出)。轻量,不处理数据请求 | CPU 低、内存低、SSD | 专门 3 台做 Master,不混用 Data 节点 |
| Data | 存放分片数据,执行 CRUD、聚合、搜索。最吃资源的角色 | CPU 高、内存高(堆内存 ≥ 31GB)、SSD | 根据数据量和 QPS 水平扩展 |
| Coordinating | 接收客户端请求,分发到各 Data 节点,汇总结果返回。相当于"网关" | CPU 中等、内存中等 | 每个节点默认都是 Coordinating,大集群可独立部署 |
-Xms31g -Xmx31g 封顶MongoDB 的高可用分两层:副本集(Replica Set)解决单点故障 + 分片集群(Sharded Cluster)解决海量数据。
| 副本集 Replica Set | 分片集群 Sharded Cluster | |
|---|---|---|
| 解决什么 | 高可用 + 读写分离 | 海量数据 + 高并发写入 |
| 最小配置 | 3 节点(1 Primary + 2 Secondary) | Mongos ×2 + Config Server ×3 + Shard ×≥2 |
| 选举协议 | Raft(多数派选举) | 每个 Shard 内部也是 Raft |
| 数据容量 | 单机上限(~TB 级) | 理论上无限(加 Shard 即可) |
| 何时用 | 所有 MongoDB 生产环境必备 | 单机 > 2TB 或 写入 QPS > 万级 |
Kafka 的高可用靠两套机制:Partition(分区)并行消费 + Replica(副本)容错。和别的技术不一样的是——Kafka 的副本是在 Broker 之间分布的,不是像 Redis 那样主从关系。
replication.factor=3 — 每个分区 3 个副本(容忍 2 台宕机)min.insync.replicas=2 — 至少 2 个副本确认才算写入成功(保证持久化)acks=all — 等 ISR 中所有副本确认后才返回(最强一致性)unclean.leader.enable=false — 不允许非 ISR 副本成为 Leader(防数据丢失)
ZooKeeper 本身就是一个分布式协调服务,它的集群叫 Ensemble。ZK 的设计哲学和其他技术不同——它不存储大量业务数据,而是存储元数据/状态/配置,追求的是强一致性(CP)。
Nacos 最独特的卖点:同时支持 AP 和 CP 两种一致性模式,可以按需切换。注册中心用 AP(可用性优先),配置中心用 CP(一致性优先)。
| AP 模式(Distro 协议) | CP 模式(Raft 协议) | |
|---|---|---|
| 协议 | Distro(自研,最终一致性) | Raft(强一致性) |
| 适合场景 | 服务注册/发现(临时实例多、网络偶尔抖动) | 配置管理(配置不能丢、不能冲突) |
| 一致性保证 | 最终一致(可能有短暂不一致) | 强一致(多数派确认后提交) |
| 可用性 | 极高(部分节点挂了不影响整体) | 较高(需要过半数节点存活) |
| 如何切换 | 临时实例(ephemeral=true)自动走 AP | 永久实例(ephemeral=false)走 CP |
cluster.conf 声明所有节点 IP,不要漏
SLAVE STOP; RESET MASTER; → Slave-1 变成新 MasterCHANGE MASTER TO → 指向新 Master-A (原 Slave-1)| 分片 | 之前位置 | 现在位置 | 状态 |
|---|---|---|---|
| P0 (Primary) | Data-1 | Data-1 | 不变 |
| R0 (Replica) | Data-2 | Data-7 (新) | 已迁移 ✅ |
| P3 (Primary) | Data-3 | Data-3 | 不变 |
| R3 (Replica) | Data-1 | Data-7 (新) | 已迁移 ✅ |
| P1 (Primary) | Data-2 | Data-2 | 不变 |
| R1 (Replica) | Data-3 | Data-7 (新) | 迁移中... |
MOVED 12345 10.0.0.3:6379 错误。-Xms64g -Xmx64g,觉得"内存大点好"。结果 JVM 超过 31GB 后停用了 Compressed Object Pointers(压缩指针),导致:-Xms30g -Xmx30g,剩余内存留给 OS 文件系统缓存(ES 大量依赖 filesystem cache 加速查询)。min.insync.replicas 默认是 1,意味着只要 Leader 自己确认就算成功。当 Leader 所在 Broker 宕机且还没同步给 Follower 时,这部分消息就丢了。min.insync.replicas=2(至少 2 个副本确认)unclean.leader.enable=false(禁止非 ISR 副本成为 Leader)acks=all(Producer 等所有 ISR 副本确认)| 步骤 | 做什么 | 目的 |
|---|---|---|
| 1. 冗余 | 数据/服务复制到多台机器 | 不把鸡蛋放一个篮子 |
| 2. 监控 | 健康检查 / 心跳检测 | 及时发现问题 |
| 3. 决策 | 共识协议(Paxos/Raft/Zab/投票) | 多个节点达成一致 |
| 4. 动作 | 故障转移 / 流量切换 / 提升 | 自动恢复服务 |
| 5. 通知 | 告警 + 客户端更新路由 | 让人和系统都知道变化 |