本篇聚焦 分片机制(Shard),涵盖基础概念、实践经验、问题排查与场景设计,适合中高级开发工程师及架构师面试复习使用。
Elasticsearch 如何通过分片(Shard)实现数据的分布式存储?设置分片数量时需要考虑哪些因素?
_id
哈希)分配到特定分片;查询时,协调节点并行请求所有相关分片并合并结果。因素 | 说明 |
---|---|
数据量 | 单分片建议控制在 20~50GB(日志类可放宽至 100GB),避免过小或过大 |
硬件资源 | 分片数应与节点数匹配,单节点负载不宜过高(如 10 分片 / 5 节点 ≈ 2 分片/节点) |
扩展性 | 分片数不可更改(除非重建索引),需预留增长空间 |
查询性能 | 分片过多增加元数据开销,过少则无法充分利用并行计算能力 |
假设你有一个索引,存储了 10TB 的日志数据,每天新增 500GB。你会如何设计分片策略?如果发现现有分片数量不合理,如何调整?
按时间滚动分片
Rollover API
按大小(如 50GB)或时间(如每天)创建新索引(如 logs-2023-10-01
)。冷热分离策略
集群监控显示某个节点的磁盘使用率远高于其他节点,可能是什么原因?如何解决?
原因 | 描述 |
---|---|
分片不均 | 分片未均匀分布(如手动分配或故障恢复失败) |
热点数据 | 某些分片承载高频率访问的数据(如路由键倾斜) |
段合并压力 | 该节点正在进行大量段合并(Segment Merge)操作 |
_cluster/reroute
手动迁移分片,或调整 cluster.routing.rebalance
参数;merge.scheduler.max_thread_count
或增大 index.merge.policy.*
参数以减少段合并压力。分片和副本的区别是什么?为什么副本分片能提升查询性能但不能提升写入性能?
类型 | 角色 | 是否可读写 |
---|---|---|
主分片(Primary) | 数据源,负责写入 | ✅ |
副本分片(Replica) | 主分片拷贝,用于容灾和查询 | ❌(只读) |
wait_for_active_shards
参数降低一致性要求,提升写入速度。设计一个电商商品搜索系统,要求支持高频写入(每秒 1 万次)和低延迟搜索(P99 < 100ms)。你会如何设计分片和副本?
product_id
的哈希作为路由键,避免热点。refresh_interval=30s
;doc_values
,避免深度分页。本套面试题围绕 Elasticsearch 分片机制 展开,考察候选人以下能力:
能力维度 | 考察点 |
---|---|
基础概念 | 分片 vs 副本、路由规则、分片数影响 |
实践经验 | 分片策略设计、问题排查与调整手段 |
原理理解 | 分片对读写性能的影响机制 |
场景设计 | 结合业务需求合理规划分片与副本 |