如何使用具有不同分片数量的索引在 ElasticSearch 上实现负载的均匀分布?

Posted

技术标签:

【中文标题】如何使用具有不同分片数量的索引在 ElasticSearch 上实现负载的均匀分布?【英文标题】:How to achieve even distribution of load on ElasticSearch with indexes with different amount of shards? 【发布时间】:2020-12-14 13:22:17 【问题描述】:

我们正在研究解决 ES 集群的一些性能问题。我们正在研究数据节点上的分片分布。我知道有一个建议是让分片在节点之间均匀分布 - 这是我的问题:

对于具有 8 个数据节点的集群 - 我们有一些索引具有 2 个主分片和 3 个副本(总共 8 个分片)。我们还有一些索引有 1 个主分片和 3 个副本(总共 4 个)。

我的问题是 - 可以认为设置是“均匀分布”的吗?我们认为它不是,我们正在考虑使用 1 个主分片的索引 - 7 个副本(因此每个索引都将托管在 8 个节点上) - 但我们不知道这样的设置是否有任何意义?如果不是 - 你会推荐什么来更均匀地分配碎片?

这是分片猫查询的结果:

id1     0 p STARTED  2138  16.1mb x.x.x.x node1
id1     0 r STARTED  2138  16.1mb x.x.x.x node2
id1     0 r STARTED  2138  16.1mb x.x.x.x node3
id1     0 r STARTED  2138  16.1mb x.x.x.x node4
id2     0 r STARTED  3379  26.8mb x.x.x.x node5
id2     0 r STARTED  3379  26.8mb x.x.x.x node3
id2     0 r STARTED  3379  26.8mb x.x.x.x node4
id2     0 p STARTED  3379  26.8mb x.x.x.x node6
id3     0 r STARTED 20086  76.1mb x.x.x.x node1
id3     0 r STARTED 20086  76.1mb x.x.x.x node5
id3     0 p STARTED 20086  76.1mb x.x.x.x node6
id3     0 r STARTED 20086  76.1mb x.x.x.x node7
id4     0 r STARTED  2754   7.3mb x.x.x.x node2
id4     0 r STARTED  2754   7.3mb x.x.x.x node3
id4     0 r STARTED  2754   7.3mb x.x.x.x node8
id4     0 p STARTED  2754   7.3mb x.x.x.x node7
id5     0 r STARTED 10239  42.3mb x.x.x.x node1
id5     0 p STARTED 10239  42.3mb x.x.x.x node4
id5     0 r STARTED 10239  42.3mb x.x.x.x node6
id5     0 r STARTED 10239  42.3mb x.x.x.x node8
id6     0 r STARTED 13388  42.4mb x.x.x.x node1
id6     0 p STARTED 13388  42.4mb x.x.x.x node5
id6     0 r STARTED 13388  42.4mb x.x.x.x node3
id6     0 r STARTED 13388  42.4mb x.x.x.x node8
id7     1 r STARTED 27483 136.2mb x.x.x.x node2
id7     1 r STARTED 27483 136.2mb x.x.x.x node3
id7     1 r STARTED 27483 136.3mb x.x.x.x node8
id7     1 p STARTED 27483 136.2mb x.x.x.x node7
id7     0 r STARTED 27189 146.5mb x.x.x.x node1
id7     0 p STARTED 27189 146.6mb x.x.x.x node5
id7     0 r STARTED 27189 146.6mb x.x.x.x node4
id7     0 r STARTED 27189 146.7mb x.x.x.x node6
.kibana 0 r STARTED    13 106.8kb x.x.x.x node2
.kibana 0 p STARTED    13 106.8kb x.x.x.x node3
id8     1 r STARTED 13555  80.8mb x.x.x.x node2
id8     1 r STARTED 13555  80.8mb x.x.x.x node4
id8     1 r STARTED 13555  80.8mb x.x.x.x node8
id8     1 p STARTED 13555  80.8mb x.x.x.x node7
id8     0 r STARTED 13390    63mb x.x.x.x node1
id8     0 p STARTED 13390  62.7mb x.x.x.x node5
id8     0 r STARTED 13390  62.7mb x.x.x.x node6
id8     0 r STARTED 13390  62.8mb x.x.x.x node7

【问题讨论】:

您处于经典的过度分片情况。你必须有很多小索引。看看你能不能收集它们,然后对这个新的更大的索引进行强制合并。 索引的内容经常变化 - 在这样的设置中强制合并是个好主意吗? 定期进行强制合并是一个很好的做法。但是你需要做的第一件事是改变你的分片策略。 (关注 Opster 的文章。 @MichałPrzybylak,如果我的回答对您有帮助,您可以投票并接受,那就太好了,TIA :) 【参考方案1】:

由于各种原因,为每个索引在所有 ES 数据节点上分配所有分片没有意义。

    应根据大小选择主分片的数量,并帮助您水平扩展索引。 副本分片数量可帮助您提高可用性并提高搜索性能。

在 ES 集群中实现完美的分片平衡确实很难(基于分片的数量、大小和流量),尽管基于您的分片大小非常小(小于 100MB),您可以选择1 个分片和 7 个副本用于您的所有索引,您需要根据集群设置和用例进行基准测试并选择正确数量的分片和副本。

【讨论】:

以上是关于如何使用具有不同分片数量的索引在 ElasticSearch 上实现负载的均匀分布?的主要内容,如果未能解决你的问题,请参考以下文章

数据分布在具有许多索引的大型集群中(Elasticsearch)

如何从具有不同数量和索引顺序的三组字典中制作包含三列的条形图?

第04章 分布式索引架构

Elasticsearch 分片达到文档数量上限

ES Rollover and Shrink API

MongoDB分片详细说明(ITSOM)