我在 ec2 中有一个由 8 个节点组成的集群。每个 AZ 有 4 个节点,cluster.routing.allocation.awareness.attributes: aws_availability_zone 我想要将所有分片迁移到不同的节点类型。因此我设置了新节点并将它们添加到集群中。一些分片现在正在移动到新节点。最终目标是关闭所有旧节点,并将所有分片拆分到两个节点之间。如果不逐个关闭节点并将分片放在即将关闭的节点上,最好的方法是什么?
编辑:我想“cluster.routing.allocation.exclude._ip”:“xxxx,yyyy,zzzz”应该对我有用?
答案1
所以cluster.routing.allocation.exclude._ip
可能会工作正常,但你可能需要强制进行重组,但老实说,一旦新节点上线,最好的方法就是杀死一个旧节点。集群将进入一种yellow
状态,但它仍将工作
如果您设置了活动分片和单个备份分片。黄色仅表示它无法将所有备份映射到活动分片,或者备份没有活动分片。因此它会重新执行这些操作,很快集群就会再次变为绿色。
我已经通过这种方式升级了生产集群
例如,有 3 个 m3.large 集群成员。启动 3 个新的 m4.2xlarge 成员。关闭一个 m3.large 并等待集群变绿。然后对最后两个 m3.large 重复此操作。我从来没有遇到过问题
答案2
解决办法是
curl -XPUT localhost:9200/_cluster/settings -d '{
"transient" : {
"cluster.routing.allocation.exclude._ip" : "172.31.3.53,172.31.32.44,172.31.32.43,172.31.41.155,172.31.41.152,172.31.15.219,172.31.6.166,172.31.15.72"
}
}'
从 Github 上的源代码获取:
96 clusterExcludeFilters = DiscoveryNodeFilters.buildFromKeyValue(OR,excludeMap);
和
String[] 值 = Strings.splitStringByCommaToArray(entry.getValue());