elasticseach日常维护之shard管理

转自我自己的博客:

elasticseach的数据分片shard,在创建索引之后,在生命周期内就不可改变了,所以在索引开始创建的时候,要根据预估的数据规模合理的设置shard数目。在集群中让shard分布均匀,可以有效的均衡集群负载,,所以我们要尽量保证shard的在集群中分布均匀。

每个shard都有自己的编号,从1往后数。你可以通过

curl -XGET ‘:9200/_cat/shards’

来查看shard分布情况:index_1 100 p STARTED 44217999 12.3gb 192.168.1.1 Strongarmindex_1 100 r STARTED 44217999 12.3gb 192.168.1.2 Agonyindex_1 109 p STARTED 39394176 10.7gb 192.168.1.3 Captain Americaindex_1 109 r STARTED 39394176 10.6gb 192.168.1.1 Smugglerindex_1 103 p STARTED 42910705 11.9gb 192.168.1.2 Alyssa Moyindex_1 103 r STARTED 42910716 11.9gb 192.168.1.1 Chi Demonindex_1 169 r STARTED 40889958 11.4gb 192.168.1.2 Milos Masarykindex_1 169 p STARTED 40889958 11.3gb 192.168.1.1 Sergeant Furyindex_1 55 r STARTED 44243841 12.2gb 192.168.1.3 Milos Masarykindex_1 55 p STARTED 44243841 12.1gb 192.168.1.3 Whiteoutindex_1 214 r STARTED 43512570 12gb 192.168.1.1 Mekanoindex_1 214 p STARTED 43512570 12gb 192.168.1.2 Sergeant Furyindex_1 97 r STARTED 45660486 12.7gb 192.168.1.1 Pathwayindex_1 97 p STARTED 45660486 12.7gb 192.168.1.2 Mekano

p 就表示是主分片 primary shardr 就表示是副本分片 replica shard

分片数和副本个数在创建索引的时候都可以设置,副本的个数在创建索引之后可以随时更改。

elasticsearch的shard分布是根据集群设置的比重进行分配的,你可以设置:curl -XPUT ‘: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 ‘:9200/_cluster/settings’ -d ‘{“transient” : {“cluster.routing.allocation.enable” : “primaries”}}’

那如果shard分布已经不均匀了,也可以手动进行shard迁移。curl -XPOST ‘:9200/_cluster/reroute’ -d ‘{“commands” : [ {“move” :{“index” : “index_1″, “shard” : 23,“from_node” : “192.168.1.1”, “to_node” : “192.168.1.2”}}]}’

然后拍一些美得想哭的照片,留给老年的自己。

elasticseach日常维护之shard管理

相关文章:

你感兴趣的文章:

标签云: