使用 elasticsearch 集群和 Web 服务器集群避免单点故障的最佳方法
Posted
技术标签:
【中文标题】使用 elasticsearch 集群和 Web 服务器集群避免单点故障的最佳方法【英文标题】:Best way to avoid a single point of failure with an elasticsearch cluster and a web server cluster 【发布时间】:2013-09-18 00:38:15 【问题描述】:我们有一个在 AWS 上运行的 Web 应用程序,其架构如下:
1 个带有 2 个数据节点的 elasticseach 集群 1 个自动扩展负载平衡的 Web 服务器集群由于 elasticsearch 做了一些巧妙的内部负载平衡,我们可以将所有 Web 服务器指向其中一个数据节点。但这会产生单点故障 - 如果该节点出现故障,那么我将不会得到任何查询结果。
到目前为止,我的解决方案是让 elasticsearch 在每个 Web 服务器上作为非数据节点运行。每个 Web 服务器查询其本地 elasticsearch 节点,该节点又将请求发送到数据节点之一。这似乎是elasticsearch website
上的建议方法这很好,因为如果其中一个数据节点以某种方式发生故障,我们不会失去提供搜索查询的能力。但是,这确实意味着 elasticsearch 正在使用每个 Web 服务器上的资源,如果我们迁移到使用 elastic beanstalk(我很想这样做),那么我们将需要一些如何在我们的 Web 实例上安装 elasticsearch。编辑:我现在已经成功了,但还没有弄清楚如何为每个环境指定不同的配置。
是否有另一种方法可以避免单点故障,而无需在每个 Web 服务器上运行 elasticsearch?
我曾考虑在数据节点前使用负载均衡器来处理来自 Web 服务器的查询,但这也意味着将集群开放给公共访问,而无需设置 VPC 来限制访问。
我缺少更简单的解决方案吗?
【问题讨论】:
如果您有 2 个数据节点和 1 个副本,则一个节点可以关闭,您仍然可以提供查询服务,甚至不会丢失文档。我在你的问题中遗漏了什么吗? 你是对的。但是,如果不使用本地非数据节点,我将失去处理节点宕机的内置能力。即,我必须检测连接失败并切换到工作数据节点。也许这没什么大不了的。它似乎不是最佳的 您的意思是要将客户端节点用作某种负载均衡器?客户端库应该通过循环支持更多地址,并希望在第一个地址不起作用时回退到其他地址。有意义吗? 是的,这是有道理的。我们将 elasticsearch 与 symfony2 php 应用程序一起使用,不幸的是它不支持指定多个连接。因此,对于实时环境,我们指定 localhost,并让 elasticsearch 自己选择将查询发送到哪个数据节点。它工作得很好,是一个非常简洁的解决方案。我只是想知道我是否错过了另一个不涉及在每个 Web 服务器上运行 elasticsearch 的解决方案。 我认为你应该在你的问题中添加这个棘手的部分,因为它会有所作为。您可以只在弹性搜索(nginx 或 Apache)前使用负载均衡器,但您的问题与弹性搜索暴露于单点故障没有任何关系! 【参考方案1】:我认为这不能直接回答您的问题,但如果您仍然可以在 Web 服务器节点上运行 ES,您可以自定义使用 .ebextensions mechanism 安装的软件,它允许您运行脚本和/或在新的 Elastic Beanstalk 实例启动时安装软件包。如果这还不够,您可以使用自定义 AMI 启动您的 Elastic Beanstalk 实例。
此外,您可能不知道您可以在 VPC 中运行 Elastic Beanstalk。
【讨论】:
谢谢肯。我已经设法使用 .ebextensions 路由安装了 elasticsearch。我现在要解决的问题是如何为每个环境指定不同的 elasticsearch 配置文件,即 dev / staging / production 这可以帮助您配置每个环境的设置:***.com/questions/16585898/…以上是关于使用 elasticsearch 集群和 Web 服务器集群避免单点故障的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章
elasticsearch Web管理工具之cerebro安装与配置
flask-web—— 搜索系统Elasticsearch分布式搜索引擎原理分片与集群IK中文分析器索引与文档Logstash导入数据与查询