转自我自己的博客:http://zhaoyanblog.com/archives/687.html
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”
}
}
]
}’