elasticseach日常维护之shard管理

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”
}
}
]
}’

  1. 亚瑟王说道:

    我试了下,可以通过先 取消一个副分片,再移动主分片到那个节点的方式。
    不知道这么做是否合适?

    1. 大岩不灿说道:

      你可以先disable分片迁移。
      然后选择A节点的某个一个主分片(在B上没有)移动到B节点
      选择B节点的某个一个主分片(在A上没有)移动到A节点

      然后再enable分片迁移。

      这样就相当于A节点的一个主分片 和B节点的一个副分片进行了交换。

  2. 亚瑟王说道:

    重启,和下了这个节点 重新上,不一样吗?
    如果是重新索引,成本也太高了吧?
    能手动设置某个分片的主副吗?
    还有cluster.routing.allocation.balance.primary 为何被废弃了呢?如果不废弃,估计还能让集群自动平衡

  3. cxy说道:

    版本2.3.0 两台node的集群,每个索引5个分片, 副本为1。
    当其中一个node重启后, 重启的这台node 上所有分片都变为Replica, 只有当再新建索引 ,才是主副平衡的,这个怎么解呢?

    1. 大岩不灿说道:

      把这个节点下了,重新上,就会有parimary shard均衡回来,或者你手动移动shard

  4. 大岩不灿说道:

    据知 1.7.x后面版本(不了解1.4.x 1.5.x 1.6.x的情况),对均衡算法进行了优化,在扩容的时候,主本和副本都会进行迁移,分布也比较均匀。

    1. susan说道:

      1.X版本不太清楚,但是2.0版本以后确实是主副本同时会进行均衡分布

      1. akira说道:

        我用的5.6.3版本,是这样的。

留言

提示:你的email不会被公布,欢迎留言^_^

*

验证码 *