我已经阅读了很多关于索引/分片放置的文章/论坛,但还没有找到解决方案。
从根本上说,我想使用Logstash(+ Elasticsearch / Kibana)来构建全局分布式群集,但我想将主分片和副本分片的位置限制为创建它们的区域的本地,以减少WAN流量,但我也希望能够将所有数据作为单个数据集进行查询。
假设我在英国有两个ES节点(uknode1 / uknode2),在美国有两个ES节点(usnode1 / usnode2)。 如果Logstash将一些数据发送到usnode1,我希望它将副本放在usnode2上,不通过WAN将其发送到uknode *节点。
我尝试过使用索引和路由分配设置,但无法阻止分片在所有4个节点上分布。由于索引名称是基于“类型”动态构建的,但这是后来的另一个挑战,这有点复杂。即使有一个索引,我也无法解决这个问题。
我可以把它拆分成两个独立的集群,但我希望能够将所有节点作为单个数据集进行查询(通过Kibana),所以我不认为这是一个有效的选项,因为Kibana只能查询一个集群
这甚至可以实现吗?
我问这是否可能的原因是,如果我写入英国节点上名为“myTest”的索引,以及美国节点上的相同索引,会发生什么情况.....因为这最终是相同的索引我不确定ES会如何处理这个问题。
因此,如果有人有任何建议,或只是说“不可能”,那将非常有帮助。
答案 0 :(得分:3)
它是possible,但不推荐。 Elasticsearch需要群集中节点之间的可靠数据连接才能运行,这对于地理位置分散的群集来说很难确保。一个更好的解决方案是拥有两个集群,一个在英国,另一个在美国。如果您需要同时搜索它们,可以使用tribal node。
答案 1 :(得分:1)
感谢。我更多地研究了这个问题并找到了确实使用部落节点的解决方案。
对于不熟悉它们的人来说,这是ES 1.0.0 +
中的新功能您所做的是将新的ES节点分配为部落节点,并将其配置为连接到所有其他群集,当您针对它运行查询时,它会查询所有群集并返回所有群集的整合结果他们。
所以在我的场景中,我有两个不同的聚类,每个区域都有一个聚类。
美国地区
cluster.name: us-region
此区域中的两个节点称为usnode1
和usnode2
两个节点都是主节点/数据节点
英国地区
cluster.name: uk-region
此区域中的两个节点称为uknode1
和uknode2
两个节点都是主节点/数据节点
您创建另一个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仪表板仍然保存,虽然我不确定它如何选择要保存到哪个群集,但似乎解决了我的问题,所以更多的玩,我认为我会对它进行排序。