知识卡片
分索引优于盲目增加Shard数量:I/O压力与可控性的取舍
内容
当单个索引变得越来越大、查询速度随之下降时,一个直觉上的解法是给这个索引增加更多Shard(分片)来分摊压力,但实践经验表明这条路走不通:更多的Shard会带来额外的I/O压力,官方文档也建议一个Node最好不要多于3个Shard,如果真的要”更多Shard”,唯一的办法是配更多机器,但这在很多场景下并不现实(书中提到256个Shard的集群就变得极难控制,每次扩容都很慢)。更有效的替代方案是”分索引”——不是在同一个索引内堆Shard,而是把数据按业务维度(比如每个大分类一个索引,或每个主要大城市一个索引)拆分成多个独立的、Shard数量可控(3个以内)的索引,查询时再通过Elasticsearch原生支持的合并查询语法(在URL里同时指定多个索引名和对应的routing参数),把原本该由一个巨型索引承担的查询,动态路由并聚合到多个小索引上完成。这个思路和[[Routing是查询性能优化的”王道”:把查询流量按维度拆分到独立小集群]]是同一套治理哲学在索引结构层面的体现:面对规模增长带来的压力,优先考虑”按业务维度拆分成多个可控的小单元、查询时再按需合并”,而不是简单粗暴地在同一个单元内部堆资源——后者的边际收益会随着规模增长而递减(更多Shard带来的I/O开销会抵消并行处理的收益),前者则能让每个独立单元始终保持在一个可控、可预测的规模区间内。
参考来源
- 位置:《高可用架构(第1卷)》第2章《高可用架构原理与分布式实践》"2.8 亿级规模的Elasticsearch优化实战"节,"2.8.2 查询性能(Query Performance)"(源文件:_epub-src/OEBPS/Text/Chapter2_8_3.xhtml)
- 结论依据:原文说明"更多的shard会带来额外的索引压力,即I/O压力。因此我们选择了分索引……Elastic官方文档建议:一个Node最好不要多于3个Shard……若是'more Shards',除增加更多的机器外,实际是没办法做到这一点的",直接支撑本卡片结论。
- 原始内容:在实践过程中,更多的shard会带来额外的索引压力,即I/O压力。因此我们选择了分索引……Elastic官方文档建议:一个Node最好不要多于3个Shard。若是"more Shards",除增加更多的机器外,实际是没办法做到这一点的。