美团一面:ES 集群日增 1TB 数据怎么抗?90% 的人只报数字,结果面试就挂!

22 阅读8分钟

关注我的公众号:【Fox爱分享】,可获取首发内容。

写在开头

大家好,我是 Fox

最近帮一位工作 5 年的兄弟复盘美团一面,聊到 Elasticsearch(ES)架构时,现场可谓是“惨烈”。

面试官问了一个非常经典的问题:

“说说你们生产环境 ES 的集群架构?数据量多大?分片怎么分的?依据是什么?”

这位兄弟张口就来:

“额,我们大概有 13 台机器,日增 200G 日志,分了 10 个片……”

面试官当场反问:

“日增才 200G,你要用 13 台物理机?你的分片数是怎么算出来的?JVM 内存给了多少?针对聚合查询有做计算分离吗?

全场沉默。

兄弟们,这道题考的根本不是你的“记忆力”,而是考你的“计算能力”和“架构规划能力”。

如果你只会被动地报数字,面试官会认为你根本没参与过核心架构建设,充其量就是个“CRUD 熟练工”。

今天 Fox 就带大家把这笔账算清楚,教你给出一份P7 架构师级别的满分答案。

一、 第一步:学会“算账”(拒绝资源浪费)

很多人的通病是:数据量说太小,机器说太多。 这在懂运维的面试官眼里,就是典型的“败家”。

既然要聊架构,我们就要聊TB 级的场景。以一个标准的ELK 日志分析平台为例:

1. 场景设定

  • 业务场景: 核心业务链路日志。
  • 数据增量: 每天新增 1TB(这才配得上分布式集群)。
  • 保留策略: 热数据保留 7 天,冷数据归档到 S3。
  • 副本策略: 1 主 1 从(1 Replica),保证数据高可用。

2. 容量计算

你的存储需求不是 1TB,而是:

1TB (日增)×7 (天)×2 (副本)=14TB1TB \text{ (日增)} \times 7 \text{ (天)} \times 2 \text{ (副本)} = 14TB

这就结束了吗?错! ES 在运行过程中需要进行 Segment Merge(段合并),还需要预留磁盘 Watermark(水位线) 防止只读。

💡Fox 小词典:

  • Segment Merge: ES 底层 Lucene 会不断把小文件合并成大文件,极其消耗磁盘 I/O。
  • Watermark: 当磁盘使用率达到 85%-90% 时,ES 会拒绝写入。所以你不能把磁盘塞满。

经验公式:实际磁盘需求\approx原始数据÷0.6\div 0.6

14TB÷0.623.3TB14TB \div 0.6 \approx 23.3TB

架构推导:

我们需要一个能提供 24TB 有效存储的集群。

如果你申请 10 台 Data 节点,每台挂载一块 4TB 的 NVMe SSD,总容量 40TB。

水位线:24/40=60%24 / 40 = 60\%。这是一个非常健康、且具备扩容缓冲的生产配置。

二、 第二步:分片数怎么定?(黄金法则)

算完了机器,最关键的来了:1TB 的索引,分几个片?

很多兄弟随口说“5个”、“10个”,问他为什么,支支吾吾说不出话。

请记住业内公认的分片黄金法则

单个主分片(Primary Shard)的大小,建议控制在 30GB - 50GB 之间。

为什么卡在这个范围?

  • < 30GB(太小): 分片过多会导致文件句柄爆炸,Master 节点维护元数据压力剧增。
  • > 50GB(太大):
    • 故障恢复慢: 节点宕机后,50G+ 的分片在网络间传输极慢。
    • 查询卡顿: 尤其在段合并时,大分片会长时间占用 I/O,拖垮查询性能。

回到我们的案例

日增 1TB 数据,按照黄金法则计算:

1024GB÷42GB (取中间值)24 个分片1024GB \div 42GB \text{ (取中间值)} \approx 24 \text{ 个分片}

高薪回答:

“针对日增 1TB 的日志索引,我经过测算,将主分片数设置为 24。这样单分片大小约 42GB,完美落在 30-50G 的最佳区间。”

三、 第三步:物理与逻辑架构(百万年薪的细节)

有了机器和分片,怎么部署?这里有四个关键点:角色分离、跨区容灾、协调节点演进、RAID 配置。

1. 物理拓扑(13 节点基础版)

  • 3 台 Dedicated Master(专有主节点):
    • 配置: 低配(4核 8G)。
    • 作用: 只负责集群管理,绝对不存数据
    • 关键点:跨可用区(Zone)部署。Zone A、Zone B、Zone C 各一台。即使某个机房光纤被挖断,集群依然存活,这叫机房级容灾
  • 10 台 Data Node(数据节点):
    • 配置: 高配(16核 64G + NVMe SSD)。
    • 作用: 负责海量数据的写入和聚合查询。

2. 协调节点的演进(Coordinating Node)

面试官可能会追问:“你们有单独部署协调节点吗?”

千万别死板地说“有”或者“没有”,你要讲出**“架构演进”**的味道。

P7 回答话术:

“在业务初期,为了节省成本,我们让 Client 直连 Data 节点。

但随着业务发展,我们发现部分**重度聚合查询(Deep Aggregation)**非常消耗内存,甚至导致 Data 节点 OOM。

所以,我们目前规划了 2 台独立的协调节点

为什么要加它? 它的作用是 Scatter-Gather(分发与汇聚)。它不存数据,只负责把 Data 节点查回来的结果在内存中做排序和归并。

架构收益: 把‘计算风险’从‘存储节点’剥离出来。即使聚合查询把内存撑爆了,也只是挂掉协调节点,不影响核心写入。这就叫风险隔离!”

3. 31GB 内存陷阱

面试官继续追问:“Data 节点有 64G 内存,JVM 堆内存你给多少?”

如果你回答“32G”或者“48G”,恭喜你,挂了。

标准答案是:31GB!

底层原理:

在 Java 中,当堆内存小于 32GB 时,JVM 会开启指针压缩(Compressed Oops)。一旦超过这个阈值,指针膨胀为 64 位,性能不升反降!

剩下的 33G 去哪了? 全部留给操作系统的 Page Cache!ES 的底层是 Lucene,只有 Page Cache 足够大,查询才能像“走内存”一样快。

4. 磁盘 RAID 的“反直觉”配置

还有一个隐蔽的坑:磁盘做 RAID 几?

很多小白为了“安全”去做 RAID 10 或 RAID 5。

错!我们直接上 RAID 0!

理由: ES 应用层本身就有 Replica 副本机制,数据安全已经由软件层保证了。底层硬件我们要的是极致的 I/O 速度100% 的磁盘利用率

坏盘了怎么办?ES 集群会自动 Rebalance,毫秒级切换,这才是分布式系统的自信!

当然,如果你的运维能力够强,配置 JBOD (Just a Bunch of Disks) 多路径挂载是更优解。坏一块盘只丢部分分片,恢复压力比 RAID 0 坏整个节点要小得多。但为了面试回答的条理性,强调 RAID 0 的极致性能和利用率通常就够了。

四、 第四步:场景化调优(没有银弹)

如果面试官继续追问:“日志场景写入压力这么大,你怎么优化的?”

这里一定要注意场景区分

1. 针对“日志场景”(我们当前的案例)

日志的特点是:写多读少,容忍短暂延迟。

  • 优化 A:加大 refresh_interval。
    • 默认 1s 改为 30s。虽然数据晚 30s 才能搜到,但减少了 Merge 开销,写入性能提升一倍
  • 优化 B:Translog 异步化。
    • index.translog.durability 改为 async。虽然有丢几秒数据的风险,但能极大提升吞吐量。

2. 针对“电商搜索场景”(面试官可能的追问)

如果面试官问:“那如果是商品搜索呢?”

千万别照搬! 商品搜索是读多写少,要求低延迟

  • 分片策略: 单分片建议压缩到 20GB-30GB,提高查询并发度。
  • 刷新策略:refresh_interval 调回 1s - 5s,保证商家改价后用户立马能看到。

五、 总结:拿来即用的面试模板

架构全景图

以后再被问到 ES 架构,别再干巴巴报数字了,把下面这段话背下来:

“关于 ES 架构,我是根据业务增量架构演进来规划的。

  1. 容量与分片: 针对日增 1TB 的日志业务,我申请了 10 台 Data 节点(每台 4TB NVMe SSD,组 RAID 0)。依据单分片 30-50GB 的原则,将主分片设为 24,单片约 42GB。
  2. 物理架构: 采用 13+2 节点角色分离 模式。
    • 3 台 Master 跨可用区部署防脑裂;
    • 10 台 Data 节点内存锁定在 31GB 利用指针压缩,剩余内存留给 Page Cache。
    • 针对重度聚合业务,我还预留了 2 台独立的协调节点,做计算与存储的分离,防止 OOM。
  3. 场景调优: 鉴于日志场景对实时性要求不高,我将 refresh_interval 调整为 30s 并开启 Translog 异步,用极小的可见性延迟换取了写入性能的翻倍。”

把这套逻辑讲清楚,谁敢说你不懂架构?

写在最后

架构设计没有标准答案,只有最适合业务的答案。

P6 关注“怎么搭建”,P7 关注“为什么这么搭”。从计算容量,到分片规划,再到协调节点和 RAID 0 的取舍,这每一步的决策过程,才是你薪资翻倍的筹码。

**你的 ES 集群踩过哪些坑?有没有被面试官追问过分片计算逻辑?评论区聊聊~ **

我是Fox,更多干货,关注公众号【Fox爱分享】,只讲书上不写的实战坑。

文章首发地址