分片数量设置多少最为好?
在 Elasticsearch 集群中,number_of_shards
设置应根据集群的硬件资源、查询/写入负载和数据量来决定。对于 6 个数据节点,以下是一些考虑因素和推荐的设置:
1. 合理分配分片数量:
每个数据节点会持有分片的数据副本和主分片。
理论上,分片数量应能够均匀分布在所有节点上,因此你可以设置分片数量为节点数量的倍数,例如 6、12、18 等。
对于一个有 6 个数据节点的集群,设置为 6 或 12 个分片是常见的选择。这样,每个节点可以持有 1 个或 2 个主分片。
2. 数据量考虑:
每个分片的大小通常不宜超过 50GB(较大索引可以适当调整),否则会影响查询性能。
如果你的索引预计会很大,考虑设置更多的分片,例如 12 或 18,这样每个分片的大小会更小,性能也能得到更好的保障。
3. 写入负载:
如果你的写入负载很高,可能需要更多的分片来处理高并发的写入操作。如果你的索引写入压力较小,那么较少的分片数量就足够了。
4. 副本数量:
number_of_replicas
(副本数量)也影响资源分配,副本会占用额外的存储空间。如果副本数量为 1,则每个分片会有 1 个副本,实际分片数会是主分片的 2 倍。例如,如果你设置
number_of_shards: 6
和number_of_replicas: 1
,那么每个节点上会有 2 个分片副本(主分片和副本分片)。
推荐设置:
小规模索引(数据量小于 50GB):
设置为 6 个分片。
中等规模索引(数据量大约在 50GB 到 200GB):
设置为 12 个分片。
大型索引(数据量超过 200GB):
设置为 18 或 24 个分片,确保每个分片不超过 50GB。
示例:
假设你的索引数据量较小,设置为 6 个主分片:
"number_of_shards": 6,
"number_of_replicas": 1
如果数据量更大,则设置更多的分片,例如:
"number_of_shards": 12,
"number_of_replicas": 1
总结:
对于 6 个节点,
number_of_shards
可以设置为 6 或 12。选择的关键是根据数据量、性能需求和负载来决定。
我之前的某一个索引的情况如下:
uuid pri rep docs.count docs.deleted store.size pri.store.size
yellow open market-subjects-merged-v3 T1leCfXERre6GGKJbq97Jw 6 4 435224398 112661324 1.6tb 387.6gb
这说明 market-subjects-merged-v3
索引的分片设置为 6 个主分片(pri: 6
),并且副本数量为 4(rep: 4
),当前索引存储了约 16TB 的数据。
分析:
主分片数量(
pri
):6副本数量(
rep
):4文档数:约 4.35 亿条文档
存储大小:
总大小(
store.size
):约 1.6TB每个主分片的大小(
pri.store.size
):约 387.6GB
对应的 number_of_shards
设置:
每个分片的大小接近 387.6GB,远超过了常见的推荐分片大小(通常不超过 50GB)。
这可能会影响查询和写入性能,因为分片过大会导致分片迁移和数据读取速度慢,尤其是在节点故障恢复和负载均衡时。
建议:
分片过大:当前的每个主分片超过了 350GB(最好的做法是将每个分片限制在 50GB 左右),这可能影响性能。
减小分片大小:
如果可能的话,建议重建索引,将
number_of_shards
设置为更多的分片,例如 12 或 18,以便每个分片的大小更合理,约为 100GB 或更小。可以根据数据量估算每个分片的大小,并优化索引设计。
示例优化:
假设你打算将每个分片的大小保持在 50GB 以下,考虑到索引的数据量(约 1.6TB),可以重新设置主分片数为 32 或 36 个分片,以确保每个分片的大小合理:
"number_of_shards": 36,
"number_of_replicas": 1
这样,每个分片的大小将接近 45GB,符合 Elasticsearch 的最佳实践,提升查询和写入性能,并避免分片过大的问题。
其他优化:
副本数量(
rep
):根据实际需求决定是否需要如此多的副本。副本数量过多不仅占用存储,还可能增加集群的负载。如果没有严格的高可用要求,可以减少副本数量,例如设置为 1。定期合并分片:考虑使用索引生命周期管理(ILM)来定期合并分片并归档历史数据,避免过多的小分片。
总结,建议你调整 number_of_shards
来减小每个分片的大小,并根据数据量和负载来决定副本数量。
评论区