elasticseach的数据分片shard,在创建索引之后,在生命周期内就不可改变了,所以在索引开始创建的时候,要根据预估的数据规模合理的设置shard数目。在集群中让shard分布均匀,可以有效的均衡集群负载,所以我们要尽量保证shard的在集群中分布均匀。
每个shard都有自己的编号,从1往后数。你可以通过
curl -XGET ‘http://192.168.1.1:9200/_cat/shards’
来查看shard分布情况:
index_1 100 p STARTED 44217999 12.3gb 192.168.1.1 Strongarm
index_1 100 r STARTED 44217999 12.3gb 192.168.1.2 Agony
index_1 109 p STARTED 39394176 10.7gb 192.168.1.3 Captain America
index_1 109 r STARTED 39394176 10.6gb 192.168.1.1 Smuggler
index_1 103 p STARTED 42910705 11.9gb 192.168.1.2 Alyssa Moy
index_1 103 r STARTED 42910716 11.9gb 192.168.1.1 Chi Demon
index_1 169 r STARTED 40889958 11.4gb 192.168.1.2 Milos Masaryk
index_1 169 p STARTED 40889958 11.3gb 192.168.1.1 Sergeant Fury
index_1 55 r STARTED 44243841 12.2gb 192.168.1.3 Milos Masaryk
index_1 55 p STARTED 44243841 12.1gb 192.168.1.3 Whiteout
index_1 214 r STARTED 43512570 12gb 192.168.1.1 Mekano
index_1 214 p STARTED 43512570 12gb 192.168.1.2 Sergeant Fury
index_1 97 r STARTED 45660486 12.7gb 192.168.1.1 Pathway
index_1 97 p STARTED 45660486 12.7gb 192.168.1.2 Mekano
p 就表示是主分片 primary shard
r 就表示是副本分片 replica shard
分片数和副本个数在创建索引的时候都可以设置,副本的个数在创建索引之后可以随时更改。
elasticsearch的shard分布是根据集群设置的比重进行分配的,你可以设置:
curl -XPUT ‘http://192.168.1.1:9200/_cluster/settings?pretty=true’ -d ‘{
“transient” : {
“cluster.routing.allocation.balance.shard” : 0.33
“cluster.routing.allocation.balance.index” : 0.33
“cluster.routing.allocation.balance.primary” : 0.34
“cluster.routing.allocation.balance.threshold” : 1
}
}’
elasticsearch内部计算公式是:
weightindex(node, index) = indexBalance * (node.numShards(index) – avgShardsPerNode(index))
weightnode(node, index) = shardBalance * (node.numShards() – avgShardsPerNode)
weightprimary(node, index) = primaryBalance * (node.numPrimaries() – avgPrimariesPerNode)
weight(node, index) = weightindex(node, index) + weightnode(node, index) + weightprimary(node, index)
如果计算最后的weight(node, index)大于threshold, 就会发生shard迁移。
注:cluster.routing.allocation.balance.primary 在1.3.8版本之后被废弃了。
在一个已经创立的集群里,shard的分布总是均匀的。但是当你扩容节点的时候,你会发现,它总是先移动replica shard到新节点。
这样就导致新节点全部分布的全是副本,主shard几乎全留在了老的节点上。
cluster.routing.allocation.balance参数,比较难找到合适的比例。
建议一种方式是在扩容的时候,设置cluster.routing.allocation.enable=primaries。指只允许移动主shard。
当你发现shard数已经迁移了一半的时候,改回cluster.routing.allocation.enable=all。这样后面的全迁移的是副本shard。
扩容之后,shard和主shard的分布还是均匀的。
curl -XPUT ‘http://192.168.1.1:9200/_cluster/settings’ -d ‘{
“transient” : {
“cluster.routing.allocation.enable” : “primaries”
}
}’
那如果shard分布已经不均匀了,也可以手动进行shard迁移。
curl -XPOST ‘http://192.168.1.1:9200/_cluster/reroute’ -d ‘{
“commands” : [ {
“move” :
{
“index” : “index_1”, “shard” : 23,
“from_node” : “192.168.1.1”, “to_node” : “192.168.1.2”
}
}
]
}’
除非注明,赵岩的博客文章均为原创,转载请以链接形式标明本文地址
本文地址:https://zhaoyanblog.com/archives/687.html
我试了下,可以通过先 取消一个副分片,再移动主分片到那个节点的方式。
不知道这么做是否合适?
你可以先disable分片迁移。
然后选择A节点的某个一个主分片(在B上没有)移动到B节点
选择B节点的某个一个主分片(在A上没有)移动到A节点
然后再enable分片迁移。
这样就相当于A节点的一个主分片 和B节点的一个副分片进行了交换。
重启,和下了这个节点 重新上,不一样吗?
如果是重新索引,成本也太高了吧?
能手动设置某个分片的主副吗?
还有cluster.routing.allocation.balance.primary 为何被废弃了呢?如果不废弃,估计还能让集群自动平衡
版本2.3.0 两台node的集群,每个索引5个分片, 副本为1。
当其中一个node重启后, 重启的这台node 上所有分片都变为Replica, 只有当再新建索引 ,才是主副平衡的,这个怎么解呢?
把这个节点下了,重新上,就会有parimary shard均衡回来,或者你手动移动shard
据知 1.7.x后面版本(不了解1.4.x 1.5.x 1.6.x的情况),对均衡算法进行了优化,在扩容的时候,主本和副本都会进行迁移,分布也比较均匀。
1.X版本不太清楚,但是2.0版本以后确实是主副本同时会进行均衡分布
我用的5.6.3版本,是这样的。