首页 文章

如何在Amazon EC2上使用自动扩展设置ElasticSearch集群?

提问于
浏览
23

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

现在我有了AMI,可以从这个AMI在集群中运行任意数量的节点 . 配置自动发现,并且节点按照实际应该加入群集 .

问题是 How to configure cluster in way that I can automatically launch/terminate nodes depending on cluster load?

例如,当我们没有任何负载且12个节点在峰值负载上运行时,我希望只有1个节点在运行 . 但是等等,如果我终止集群中的11个节点,那么分片和副本会发生什么? How to make sure I don't lose any data in cluster if I terminate 11 nodes out of 12 nodes?

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

手册中有一篇关于shards allocation的文章 . 可能是我遗漏了一些非常基本的东西,但我应该承认我没弄明白它是否 is possible to configure one node to always hold all the shards copies . 我的目标是确保如果这是集群中运行的唯一节点,我们仍然不会丢失任何数据 .

我现在能想象的唯一解决方案是配置索引以包含12个分片和12个副本 . 然后,当最多启动12个节点时,每个节点都会拥有每个分片的副本 . 但我不喜欢这个解决方案,因为如果我想在峰值负载上有超过12个节点,我将不得不重新配置集群 .

5 回答

  • 10

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

    由于这些节点没有分配给它们的分片,因此动态上下都不应该是一个问题,自动发现应该允许它们加入集群 .

  • 18

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

    • 使用现货实例,因为它们更便宜并且适合您的使用案例

    • "T"实例在这里不合适,因为他们需要时间来 Build 学分

    • 使用lambdas来打开和关闭任务,如果你想要想要你可以根据webhook到aws网关触发它

    • 对您的用例做出更多假设,考虑在您的ES机器前放置一个Varnish服务器,以便您可以根据您可以在正确的TTL中拨打的压力,根据缓存策略(此处有很多假设)更便宜地提供扩展用于缓存驱逐 . 查看我们的ES材料的软清除功能,我们从中获得了很多很好的 Value .

    • 如果您执行我在此处建议的任何内容,请确保使您生成的ES实例将任何日志报告回持久性ES计算机上的中央可寻址位置,以便在计算机死亡时不丢失日志

  • 0

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

    • 将分片映射到特定的EBS卷 . 让我们说我们需要15个碎片 . 我们需要15个EBS卷

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

    • 随着负载的增加,我们可以启动额外的实例 - 最多15个 .

    只有在您了解最大容量要求时,才建议采用上述解决方案 .

  • 0

    使用ElasticSearch进行自动缩放并没有多大意义 .

    碎片移动和重新分配不是一个轻松的过程,特别是如果你有很多数据 . 它强调IO和网络,并且可能严重降低ElasticSearch的性能 . (如果要限制效果,则应使用cluster.routing.allocation.cluster_concurrent_rebalance,indices.recovery.concurrent_streams,indices.recovery.max_size_per_sec等设置限制群集恢复 . 这将限制影响,但也会减慢重新 balancer 和复苏) .

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

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

    因此,理论上,如果您希望在低时间拥有2个节点并在峰值上拥有12个节点,则可以将索引设置为具有1个副本的6个分片 . 因此,在低速时,您有2个节点,每个节点可容纳6个分片,而在峰值时,您有12个节点,每个节点可容纳1个分片 .

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

  • 0

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

    关于自动缩放方法,有一些挑战,比如碎片移动会对现有群集产生影响,同时我们需要在缩小时更加警惕 . 你可以找到一篇关于缩小here的好文章,我已经测试过了 . 如果你能做一些通过一些脚本(python,shell)或通过自动化工具(如Ansible)实现上述链接步骤的智能自动化,然后可以实现扩展输入/输出 . 但是,您需要在正常限制之前开始扩展 . 扩展活动可能会对现有群集产生影响 .

    Question: 可以将一个节点配置为始终保存所有分片副本吗?

    Answer: 是的,它可以通过显式分片路由 . 更多详细信息here

相关问题