elasticsearch migrate shard

迁移分片

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
30
31
elasticsearch可以通过reroute api来手动进行索引分片的分配.不过要想完全手动,必须先把"cluster.routing.allocation.disable_allocation"参数设置为true,禁止es进行自动索引分片分配,否则你从一节点把分片移到另外一个节点,那么另外一个节点的一个分片又会移到那个节点.

一共有三种操作,分别为:移动(move),取消(cancel)和分配(allocate)
下面分别介绍这三种情况:
1.移动(move)
把分片从一节点移动到另一个节点.可以指定索引名和分片号.
2.取消(cancel)
取消分配一个分片.可以指定索引名和分片号.node参数可以指定在那个节点取消正在分配的分片.allow_primary参数支持取消分配主分片.
3.分配(allocate)
分配一个未分配的分片到指定节点.可以指定索引名和分片号.node参数指定分配到那个节点.allow_primary参数可以强制分配主分片,不过这样可能导致数据丢失.
4.例如:
curl -XPOST 'localhost:9200/_cluster/reroute' -d '{
"commands" : [ {
"move" :
{
"index" : "test", "shard" : 0,
"from_node" : "node1", "to_node" : "node2"
}
},
"cancel" :
{
"index" : "test", "shard" : 0, "node" : "node1"
}
},
{
"allocate" : {
"index" : "test", "shard" : 1, "node" : "node3"
}
}
]
}'
1
2
3
4
5
6
7
8
9
10
11
//迁移分片
curl -XPOST 'localhost:9200/_cluster/reroute' -d '{
"commands" : [ {
"move" :
{
"index" : "test", "shard" : 0,
"from_node" : "node1", "to_node" : "node2"
}
}
]
}'

分片说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[wisdom@10 ~]$ curl -XGET '10.0.3.41:9200/_cat/shards'|grep v2-inbound-request-2017.03
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 26082 100 26082 0 0 61893 0 --:--:-- --:--:-- --:--:-- 61952
v2-inbound-request-2017.03 1 r STARTED 25071632 35.2gb 10.0.3.41 10.0.3.41
v2-inbound-request-2017.03 1 p STARTED 25071643 35.2gb 10.0.3.40 10.0.3.40
v2-inbound-request-2017.03 3 p STARTED 25107804 35.3gb 10.0.3.41 10.0.3.41
v2-inbound-request-2017.03 3 r STARTED 25107796 35.3gb 10.0.3.42 10.0.3.42
v2-inbound-request-2017.03 2 r STARTED 25098807 35.2gb 10.0.3.42 10.0.3.42
v2-inbound-request-2017.03 2 p STARTED 25098799 35.2gb 10.0.3.40 10.0.3.40
v2-inbound-request-2017.03 4 p STARTED 25108295 35.3gb 10.0.3.41 10.0.3.41
v2-inbound-request-2017.03 4 r STARTED 25108301 35.3gb 10.0.3.42 10.0.3.42
v2-inbound-request-2017.03 0 r STARTED 25105055 35.3gb 10.0.3.42 10.0.3.42
v2-inbound-request-2017.03 0 p STARTED 25105050 35.3gb 10.0.3.40 10.0.3.40

p 表示主分片 primary shard
r 表示副本分片 replica shard
分片数和副本个数在创建索引的时候都可以设置,副本的个数在创建索引之后可以随时更改
  1. 分片分配规则
    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
    30
    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"
    }
    }'