Elasticsearch - 限制分片的分配

时间:2014-04-08 08:34:30

标签: elasticsearch logstash kibana

我已经阅读了很多关于索引/分片放置的文章/论坛,但还没有找到解决方案。

从根本上说,我想使用Logstash(+ Elasticsearch / Kibana)来构建全局分布式群集,但我想将主分片和副本分片的位置限制为创建它们的区域的本地,以减少WAN流量,但我也希望能够将所有数据作为单个数据集进行查询。

实施例

假设我在英国有两个ES节点(uknode1 / uknode2),在美国有两个ES节点(usnode1 / usnode2)。 如果Logstash将一些数据发送到usnode1,我希望它将副本放在usnode2上,通过WAN将其发送到uknode *节点。

我尝试过使用索引和路由分配设置,但无法阻止分片在所有4个节点上分布。由于索引名称是基于“类型”动态构建的,但这是后来的另一个挑战,这有点复杂。即使有一个索引,我也无法解决这个问题。

我可以把它拆分成两个独立的集群,但我希望能够将所有节点作为单个数据集进行查询(通过Kibana),所以我不认为这是一个有效的选项,因为Kibana只能查询一个集群

这甚至可以实现吗?

我问这是否可能的原因是,如果我写入英国节点上名为“myTest”的索引,以及美国节点上的相同索引,会发生什么情况.....因为这最终是相同的索引我不确定ES会如何处理这个问题。

因此,如果有人有任何建议,或只是说“不可能”,那将非常有帮助。

2 个答案:

答案 0 :(得分:3)

它是possible,但不推荐。 Elasticsearch需要群集中节点之间的可靠数据连接才能运行,这对于地理位置分散的群集来说很难确保。一个更好的解决方案是拥有两个集群,一个在英国,另一个在美国。如果您需要同时搜索它们,可以使用tribal node

答案 1 :(得分:1)

感谢。我更多地研究了这个问题并找到了确实使用部落节点的解决方案。

对于不熟悉它们的人来说,这是ES 1.0.0 +

中的新功能

您所做的是将新的ES节点分配为部落节点,并将其配置为连接到所有其他群集,当您针对它运行查询时,它会查询所有群集并返回所有群集的整合结果他们。

所以在我的场景中,我有两个不同的聚类,每个区域都有一个聚类。

美国地区

cluster.name: us-region

此区域中的两个节点称为usnode1usnode2

两个节点都是主节点/数据节点

英国地区

cluster.name: uk-region

此区域中的两个节点称为uknode1uknode2

两个节点都是主节点/数据节点

您创建另一个ES节点并添加一些配置以使其成为Tribe节点。

使用以下内容编辑elasticsearch.yml

node.data: false node.master: false tribe.blocks.write: false tribe.blocks.metadata: false tribe.t1.cluster.name: us-region tribe.t1.discovery.zen.ping.unicast.hosts: ["usnode1","usnode2"] tribe.t2.cluster.name: uk-region tribe.t2.discovery.zen.ping.unicast.hosts: ["uknode1","uknode2"]

然后,您将Kibana指向部落节点,它的工作非常出色 - 非常出色。

Kibana仪表板仍然保存,虽然我不确定它如何选择要保存到哪个群集,但似乎解决了我的问题,所以更多的玩,我认为我会对它进行排序。