如何根据负载在 kubernetes 中自动缩放 elasticsearch?

How to autoscale elastic search in kubernates based on load?

我正在使用 Google Cloud,我正在做 RnD 是否可以在 Kubernetes 中的 elasticsearch 上应用 HPA(Horizo​​ntal Pod Auto scaling)。

我在 Kubernetes 上做了 elasticsearch 设置:https://github.com/elastic/helm-charts/tree/master/elasticsearch

但我在论坛上发现了一个 post,他们说 elasticsearch HPA 很难

https://discuss.elastic.co/t/how-to-scale-up-and-down-nodes-automatically/224089/2

那么是否可以在 elasticsearch 上做 HPA 呢?

我认为它效果不佳,而且您有丢失数据的风险。 HPA 倾向于以一分钟左右的规模响应负载变化,并且偶尔会做出较大的变化(例如,从 5 个副本扩展到 2 个)。对于 Elasticsearch,您需要一次扩展一个节点,在继续之前监控集群的状态,并且可能需要很长时间才能从一个节点移动到下一个节点。


假设您是 StatefulSet 中的 运行 Elasticsearch。请记住,每个 ES 索引由 shards 组成;你将有一些分片副本分布在 ES 集群中的节点上。因此,假设您的索引有 10 个分片,每个分片有 2 个副本。

横向扩展很容易。随心所欲地增加 StatefulSet 的大小;配置每个节点以与 es-0 对话以进行发现。 ES 将看到集群已经增长并开始自行将分片移动到新节点。

缩小规模很难。您一次只能删除一个节点。一旦该节点关闭并且集群意识到它丢失了,那么曾经在该节点上的分片将被复制不足。 ES 将在剩余的节点上创建新的副本,并将分片数据复制到那里。您可以通过 /_cat/shards API 之类的东西观察到这种情况的发生。只要有复制不足的分片,索引状态就会是“黄色”,然后在复制序列完成后切换回“绿色”。

假设你目前有 8 个节点,你想缩小到 6 个。有可能给定分片的只有两个副本在 es-6es-7 上,所以你可以'把它们一起关掉;您必须先关闭 es-7,等待复制赶上,然后关闭 es-6。还有一种可能性是,当您关闭 es-7 时,新的副本将在注定的节点 es-6.

上创建

您也可以 tell Elasticsearch to move shards off of a replica 在删除它之前。这避免了集群进入“黄色”状态,但更难监控。

最后,重新复制可能需要很长时间,具体取决于集群中实际有多少数据。 (在过去的集群中,我维护了一个设计糟糕的索引结构,关闭一个节点需要几个小时。)这比 HPA 准备的操作要慢得多。