上一篇上一篇
🛡️ 第六幕:集群容灾与扩展
1. 脑裂(Split Brain)
- 网络分区 → 多个 Master 同时存在 → 数据写坏
- 对策 :
discovery.zen.minimum_master_nodes = (master_eligible_nodes / 2) + 1(7.x 前)- 7.x+ 用 Raft,自动防脑裂
场景:某台服务器宕机
- 如果挂的是 Data Node :
- Primary Shard 挂了?→ 自动提升 Replica 为 Primary
- 集群状态变 Yellow(副本缺失),但服务不中断!
- 如果挂的是 Master Node :
- 其他 Master-eligible 节点自动选举新老大(基于 Zen Discovery 或新版 Raft)
如何扩容?
- 加机器 → 自动加入集群
- 索引分片会自动 rebalance(数据迁移)
- 查询自动路由到新节点 → 无缝扩展
💡 最佳实践:
- 至少 3 个 Master 节点(防脑裂)
- Data 节点按角色分离(hot-warm-cold 架构)
第七幕:调优与问题
| 瓶颈 | 优化手段 |
|---|---|
| Refresh 太频繁 | refresh_interval: 30s |
| Translog 同步太勤 | translog.durability: async |
| 副本太多 | 写入时设 replicas: 0,写完再加 |
| Bulk 太小 | 单次 Bulk 5--15MB(约 1000--5000 docs) |
| Mapping 动态膨胀 | 关闭 dynamic: strict |
1. 慢查询雪崩
- 一个复杂聚合占满 CPU → 其他查询排队 → 集群 hang
- 对策 :
search.default_search_timeout(超时熔断)indices.breaker.*(内存熔断)- 监控
thread_pool.search.rejected
2. Field Data 爆炸
text字段做聚合 → 加载到堆内存(Field Data)- 对策 :永远不要对 text 做聚合!用 keyword
3.极限写入架构:
Logstash/Filebeat → Kafka → Spark/Flink → ES Bulk Write
- 中间加消息队列削峰
- Flink 做窗口聚合,减少 ES 写入量
🚫 ES 对 JVM 的特殊要求:
- 堆内存 ≤ 32GB(否则指针压缩失效,内存翻倍)
- 堆内存 ≤ 物理内存 50%(留一半给 OS Page Cache)
- 禁用 Swap (
bootstrap.memory_lock: true)
| 区域 | 用途 | 调优建议 |
|---|---|---|
| Heap | 存储查询上下文、聚合中间结果 | ≤ 31GB,G1GC |
| Page Cache | 缓存 Segment 文件 | 越大越好(靠 OS 管理) |
| Translog | 事务日志 | SSD 必备 |
| 场景 | 为什么不适合 | 正确姿势 |
|---|---|---|
| 强事务 | ES 不支持 ACID | 用 MySQL,ES 只做搜索同步 |
| 频繁更新 | 更新 = 删除+重建,性能差 | 少量更新 or 用 _update 脚本 |
| 大宽表 JOIN | 不支持 JOIN | 用 Nested / Parent-Child(慎用)或应用层关联 |
| 精确计数(10亿级) | total: 10000+ 是估算 |
用 track_total_hits=true(性能代价大) |
✅ 记住 :
ES 是"搜索加速器",不是"主数据库"!
🎯 终极总结
| 原则 | 实现 | 目的 |
|---|---|---|
| 不可变性 | Immutable Segments | 高并发、缓存友好 |
| 近实时 | Refresh + Translog | 写入吞吐 vs 可见性平衡 |
| 列存聚合 | Doc Values | 高效 BI 分析 |
| 分片自治 | Shard = Lucene Index | 水平扩展 |
| 协调解耦 | Coordinating Node | 无状态,易扩展 |
ES 不是银弹,而是一套精密的权衡系统:
- 用 空间换时间(Doc Values + 副本)
- 用 延迟换吞吐(Refresh 间隔)
- 用 复杂度换能力(分布式协调)
真正的大神,不是会用 ES,而是知道什么时候不该用 ES。
| 超能力 | 技术实现 | 效果 |
|---|---|---|
| 闪电搜索 | 倒排索引 + 分词 | 毫秒级全文检索 |
| 横向扩展 | 分片 + 集群 | PB 级数据轻松扛 |
| 高可用 | 副本 + 自动故障转移 | 节点挂了照常工作 |
| 智能分析 | 聚合 + Doc Values | 实时 BI 报表 |
| 近实时 | Refresh + Translog | 写入1秒可见,不丢数据 |
"如果你还在用 LIKE %keyword% 做搜索,那你不是在查数据,你是在给用户表演'系统正在思考人生'。"