我有一个运行在AWS EC2上的3个ElasticSearch节点的集群。这些节点是使用OpsWorks/Chef设置的。我的目的是将这个集群设计为非常有弹性和弹性的(节点可以在需要时进出)。
从我所读到的关于ElasticSearch的所有内容来看,似乎没有人建议在集群前面放置负载平衡器;相反,似乎建议执行以下两项操作之一:
1.将您的客户端指向一个节点的URL/IP,让ES为您执行负载平衡,并希望该节点永远不会出现故障。
1.将所有节点的URL/IP硬编码到客户端应用程序中,并让应用程序处理故障转移逻辑。
我的背景主要是在Web场,在那里创建一个巨大的自治Web服务器池,在它们前面放置一个ELB,让负载平衡器决定哪些节点是活的或死的,这是常识。为什么ES似乎不支持这种相同的架构?
4条答案
按热度按时间lzfw57am1#
我认为对Elasticsearch集群进行负载平衡是一个好主意(设计一个容错系统,对单节点故障具有弹性)。
要构建集群,您需要了解Elasticsearch的两个主要功能:1.单据的编写和更新; 2.单据的查询。
在ElasticSearch中编写文档/为文档编制索引:
1.当一个新文档进入Elasticsearch进行索引时,Elasticsearch使用“碎片路由算法”确定该文档应该分配到的“主碎片”
1.与碎片关联的Lucene进程“Map”文档中的字段;
1.然后,任何“副本碎片”接收该文档;副本碎片“Map”该文档并将该文档添加到副本碎片的Lucene“反向索引,”
正在ElasticSearch中查询文档:
1.默认情况下,当一个查询被发送到Elasticsearch时,该查询命中一个节点--这成为该查询的“查询节点”或“网关查询节点
1.节点将查询广播到索引中的每个碎片(主和副本)
1.每个碎片都在碎片的本地Lucene倒排索引上执行查询。
1.每个碎片将前10 - 20个结果返回到“网关查询节点,”
1.然后,“网关查询节点”对从其他碎片返回的组合结果执行合并排序,
为写入/索引编制/更新构建负载平衡器
Elasticsearch自我管理节点上碎片的位置,“主节点”保存并更新“碎片路由表”,“主节点”向集群中的其他节点提供碎片路由表的副本。
通常,您不希望主节点执行的工作仅限于检查集群的运行状况、更新路由表和管理碎片。
最好将负载平衡器指向“数据节点”(数据节点是包含数据碎片的节点)进行写入,并让数据节点使用它们的碎片路由表来将写入内容发送到正确的碎片。
为查询设计架构
Elasticsearch创建了一个特殊的节点类型:“客户机节点”,它包含“无数据”,并且不能成为“主节点”。客户机节点的功能是在查询结束时执行最后的资源重合并排序。
对于AWS,您可能会使用c3或c4示例类型作为“客户端节点”
最佳做法是将查询的负载平衡器指向客户端节点。
干杯干杯干杯
参考资料:
5t7ly7z52#
你不需要负载平衡器-- ES已经提供了这个功能,你只需要另一个组件,它可能会运行不正常,并且会增加一个不必要的网络跳。
ES将对数据进行分片(默认情况下为5个分片),并尝试在示例之间平均分配这些分片。在您的情况下,2个示例应该有2个分片,1个示例只有一个分片,但您可能希望将分片改为6个以实现平均分配。
默认情况下,复制设置为
"number_of_replicas":1
,因此每个分片有一个副本。假设您使用6个分片,它可能如下所示(R是一个复制的分片):假设node 1停止运行,群集将更改为以下设置:
根据您的连接设置,您可以连接到一个示例(传输客户端),也可以加入集群(节点客户端)。使用节点客户端,您将避免双跳,因为您将始终连接到正确的分片/索引。使用传输客户端,您的请求将被路由到正确的示例。
因此,您无需为自己进行负载平衡,只会增加开销。自动集群可能是ES最大的优势。
798qvoo83#
您希望针对“故障切换”进行设计是完全正确的,在AWS中,我建议您这样做。
1)限制群集中可被选为主节点的节点。对于其余节点,请设置node.client:true。根据您希望有多少个可用于故障转移的节点来选择您拥有的主节点候选节点的数量。
2)创建一个仅包括主候选节点的ELB。
3)在Route 53中,为群集创建一个CNAME,并将其值设置为ELB的DNS名称。
hs1ihplo4#
当主节点出现故障时,我们还不太清楚该怎么做。
1.如果您使用客户端连接到elasticsearch群集,您可以在连接配置中指定一组DNS名称。客户端将尝试按顺序解析DNS。如果第一个失败,将尝试第二个。
1.使用循环DNS。类似于选项一,但没有客户端。这两个选项都可能导致延迟,因为DNS需要先失败才能路由到下一个可用别名。DNS或客户端无法知道特定主机已关闭。
1.使用某种负载平衡器,这样LB将提前知道行为不端的主机,而不会导致任何延迟。