Elasticsearch - 限制分片的分配



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

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

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

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

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

这甚至可能实现吗?

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

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

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

谢谢。 我对此进行了更多研究,并得到了确实使用部落节点的解决方案。

对于不熟悉它们的人来说,这是 ES 1.0.0+ 中的一个新功能

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

因此,在我的方案中,我有两个不同的集群,每个区域一个。

美国地区

cluster.name: us-region

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

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

英国地区

cluster.name: uk-region

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

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

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

用这样的内容编辑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 仪表板仍然可以保存,尽管我不确定它如何选择要保存到哪个集群,但似乎解决了我的问题,所以玩得更多一点,我想我会对其进行排序。

相关内容

  • 没有找到相关文章

最新更新