迁移分片
1 | elasticsearch可以通过reroute api来手动进行索引分片的分配.不过要想完全手动,必须先把"cluster.routing.allocation.disable_allocation"参数设置为true,禁止es进行自动索引分片分配,否则你从一节点把分片移到另外一个节点,那么另外一个节点的一个分片又会移到那个节点. |
1 | //迁移分片 |
分片说明
1 | [wisdom@10 ~]$ curl -XGET '10.0.3.41:9200/_cat/shards'|grep v2-inbound-request-2017.03 |
- 分片分配规则
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30elasticsearch的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"
}
}'