我目前运行三个 Elasticsearch 节点。每个节点位于不同的数据中心(欧盟、美国、亚太地区),作为 AWS EC2 实例。
每个索引的每个分片有 2 个副本。写入仅发送到 EU 节点。
当你写入 EU 时,你的写入可能需要:
~ 400ms(如果复制是同步的,并且主分片位于美国或亚太地区)
你的写入将被重定向到具有主分片的节点,然后同步,
~ 200ms(如果复制是异步的,并且主分片位于美国或亚太地区)
你的写入将被重定向到主分片,然后异步同步,
~ x ms(如果复制是异步的并且主分片在欧盟)
您的写入不会被重定向并且您的应用程序不会等待同步,复制是异步的。
我希望后者总是发生。我希望所有主分片都在欧盟内。
我没有找到强制所有主分片位于 EU 的方法。我认为将 AP 和 US 设为数据节点可以解决问题。因此,我在 EU 设置了 3 个主节点+数据节点的集群,然后 AP 和 US 就变成了数据节点。我仍然可以看到,对于健康索引的一些分片来说,它们是主节点。
解决方案是什么?我可以强制一个节点或区域仅负责主分片吗?我发现了这一点:https://www.elastic.co/guide/en/elasticsearch/reference/1.4/index-modules-allocation.html
我曾经想过可以用exclude.tag
它来停止允许在 US 和 AP 节点上分配分片,但我的理解是我的副本分片也不会被分配。这不是重点。我想在这些节点上拥有副本。
我怎样才能实现它?
答案1
除了手动强制取消主分片的节点之外,我没有找到更好的方法。这是命令。
curl -s -POST 'http://localhost:9200/_cluster/reroute' -d '{
"commands": [
{
"cancel": {
"index": "your_index_name",
"shard": 0,
"node": "your_node_host",
"allow_primary": true
}
}]}'
我必须多次运行该命令,在每个节点上我都不想为每个索引和每个索引分片设置一个主分片。
您的节点仍然应该有副本分片。