31

关于在 Amazon EC2 上配置 ES, ec2 上有一个很棒的教程elasticsearch 。我研究了它并应用了所有建议。

现在我有了 AMI,可以从这个 AMI 运行集群中的任意数量的节点。配置了自动发现,并且节点按照它们真正应该的方式加入集群。

问题是如何配置集群,以便我可以根据集群负载自动启动/终止节点?

例如,我希望在没有任何负载时仅运行 1 个节点,而在峰值负载时运行 12 个节点。但是等等,如果我终止集群中的 11 个节点,分片和副本会发生什么?如果我终止 12 个节点中的 11 个节点,如何确保不会丢失集群中的任何数据?

我可能想为此配置S3 网关。但是除本地之外的所有网关都已弃用。

手册中有一篇关于分片分配的文章。可能是我遗漏了一些非常基本的东西,但我应该承认我未能弄清楚是否可以将一个节点配置为始终保存所有分片副本。我的目标是确保如果这是集群中唯一运行的节点,我们仍然不会丢失任何数据。

我现在能想到的唯一解决方案是将索引配置为具有 12 个分片和 12 个副本。然后,当启动多达 12 个节点时,每个节点都会拥有每个分片的副本。但我不喜欢这种解决方案,因为如果我可能希望在峰值负载下拥有超过 12 个节点,我将不得不重新配置集群。

4

5 回答 5

26

自动缩放对 ElasticSearch 没有多大意义。

分片移动和重新分配不是一个轻松的过程,尤其是在您有大量数据的情况下。它强调 IO 和网络,并且会严重降低 ElasticSearch 的性能。(如果您想限制影响,您应该使用 cluster.routing.allocation.cluster_concurrent_rebalance、indices.recovery.concurrent_streams、indices.recovery.max_size_per_sec 等设置来限制集群恢复。这将限制影响,但也会减慢重新平衡和恢复)。

此外,如果您关心您的数据,您不希望只有 1 个节点。您需要复制数据,因此您将需要至少 2 个节点(如果您觉得更高的复制级别更安全,则需要更多节点)。

要记住的另一件事是,虽然您可以更改副本的数量,但不能更改分片的数量。这是在您创建索引时配置的并且无法更改(如果您想要更多分片,您需要创建另一个索引并重新索引所有数据)。因此,您的分片数量应该考虑数据大小和集群大小,考虑到您想要的更多节点数量以及您的最小设置(是否可以使用更少的节点来容纳所有分片并提供估计的流量?)。

所以理论上,如果你想在低时有 2 个节点,在高峰时有 12 个节点,你可以将你的索引设置为有 6 个分片和 1 个副本。因此,在低谷时,您有 2 个节点,每个节点拥有 6 个分片,而在高峰期,您有 12 个节点,每个节点拥有 1 个分片。

但同样,我强烈建议重新考虑这一点并测试分片移动对集群性能的影响。

于 2013-08-05T13:31:45.513 回答
12

如果您的应用程序的弹性是由可变查询负载驱动的,您可以设置 ES 节点配置为不存储任何数据(node.data = false,http.enabled = true),然后将它们放入自动缩放。这些节点可以从您的主要数据节点卸载所有 HTTP 和结果合并处理(释放它们以进行更多索引和搜索)。

由于这些节点不会分配给它们的分片,因此动态地上下移动它们应该不是问题,并且自动发现应该允许它们加入集群。

于 2013-08-07T21:49:03.100 回答
0

我认为在采用可自动扩展的架构来满足临时需求时,这通常是一个问题,但仍然需要保存数据。我认为有一个利用 EBS 的解决方案

  • 将分片映射到特定的 EBS 卷。假设我们需要 15 个分片。我们将需要 15 个 EBS 卷

  • amazon 允许您挂载多个卷,因此当我们开始时,我们可以从几个附有多个卷的实例开始

  • 随着负载的增加,我们可以增加额外的实例——最多 15 个。

仅当您知道您的最大容量要求时,才建议使用上述解决方案。

于 2014-03-14T23:09:11.563 回答
0

我可以为您提供一种使用 aws 弹性搜索服务的替代方法(它的成本将比普通的 ec2 elasticsearch 高一点)。编写一个简单的脚本来持续监控服务上的负载(通过 api/cli),如果负载超出阈值,以编程方式增加您的 aws elasticsearch-service 集群的节点。这里的优势是 aws 将负责扩展(根据文档,他们正在使用 snaphost 并启动一个全新的集群)。这也适用于缩减.

关于 Auto-scaling 方法,存在一些挑战,例如分片移动会对现有集群产生影响,我们在缩减时也需要更加警惕。你可以在这里找到一篇关于缩减的好文章,我已经测试过。如果你可以做一些通过一些脚本(python,shell)或通过 Ansible 等自动化工具对上述链接中的步骤进行智能自动化,然后可以实现缩放。但是您需要在正常限制之前开始缩放,因为扩大规模活动可能会对现有集群产生影响。

问题:是否可以将一个节点配置为始终保存所有分片副本?

答:是的,可以通过显式分片路由来实现。更多详情请点击此处

于 2018-03-30T11:22:25.783 回答
-1

我很想建议在 AWS 中以不同的方式解决这个问题。我不知道这是什么 ES 数据或它如何更新等...做了很多假设我会将 ES 实例放在 ALB(应用程序负载均衡器)后面我会有一个定期创建更新的 AMI 的计划进程(如果你这样做它通常会很快做到),然后根据您的单个服务器的负载,我会触发从您可用的最新实例创建更多实例。将新实例添加到 ALB 以分担部分负载。当这安静下来时,我会触发临时实例的终止。如果你走这条路,这里还有几件事要考虑

  • 使用 Spot 实例,因为它们更便宜并且适合您的用例
  • “T”实例不适合这里,因为它们需要时间来建立信用
  • 使用 lambdas 来完成打开和关闭事物的任务,如果你想花哨,你可以基于到 aws 网关的 webhook 来触发它
  • 对你的用例做更多的假设,考虑在你的 ES 机器前面放置一个 Varnish 服务器,这样你就可以更便宜地提供基于缓存策略的规模(这里有很多假设),基于你可以拨入正确 TTL 的压力缓存驱逐。查看我们的 ES 内容的软清除功能,我们从中获得了很多很好的价值。
  • 如果您执行我在此处建议的任何操作,请确保让您生成的 ES 实例将任何日志报告回持久 ES 机器上的中央可寻址位置,这样您就不会在机器死机时丢失日志
于 2017-01-20T08:24:52.390 回答