《Elastic Stack 实战手册》——三、产品能力——3.3.基础篇——3.3.2.专有名词解释(3) https://developer.aliyun.com/article/1231572
有两种类型的分片:Primary shard 和 Replica shard。
l Primary shard: 每个文档都存储在一个Primary shard。 索引文档时,它首先在 Primary shard上编制索引,然后在此分片的所有副本上(replica)编制索引。索引可以包含一个或多个主分片。 此数字确定索引相对于索引数据大小的可伸缩性。 创建索引后,无法更改索引中的主分片数。
l Replica shard: 每个主分片可以具有零个或多个副本。 副本是主分片的副本,有两个目的:
○ 增加故障转移:如果主要故障,可以将副本分片提升为主分片
提高性能:get 和 search 请求可以由主 shard 或副本 shard 处理。
从上面的公式我们也可以看出来,我们的 shard 数目是不可以动态修改的,否则之后也找不到相应的 shard 号码了。必须指出的是,replica 的数目是可以动态修改的。
Shard
由于 Elasticsearch 是一个分布式搜索引擎,因此索引通常会拆分为分布在多个节点上的称为分片的元素。 Elasticsearch 自动管理这些分片的排列。 它还根据需要重新平衡分片,因此用户无需担心细节。
默认情况下,每个主分片都有一个副本,但可以在现有索引上动态更改副本数。 永远不会在与其主分片相同的节点上启动副本分片。
下面的图表示的是一个 index 有5个 shard 及1个 replica:
这些 Shard 分布于不同的物理机器上:
我们可以为每个 Index 设置相应的 Shard 数值:
curl -XPUT http://localhost:9200/another_user?pretty -H 'Content-Type: application/json' -d ' { "settings" : { "index.number_of_shards" : 2, "index.number_of_replicas" : 1 } }
比如在上面的 REST 接口中,我们为 another_user 这个 index 设置了2个 shards,并且有一个 replica。一旦设置好 primary shard 的数量,我们就不可以修改了。这是因为 Elastics-earch 会依据每个 document 的 id 及 primary shard 的数量来把相应的 document 分配到相应的 shard 中。如果这个数量以后修改的话,那么每次搜索的时候,可能会找不到相应的shard。
我们可以通过如下的接口来查看我们的 index 中的设置:
curl -XGET http://localhost:9200/twitter/_settings?pretty
上面我们可以得到 twitter index 的设置信息:
{ "twitter" : { "settings" : { "index" : { "creation_date" : "1565618906830", "number_of_shards" : "1", "number_of_replicas" : "1", "uuid" : "rwgT8ppWR3aiXKsMHaSx-w", "version" : { "created" : "7030099" }, "provided_name" : "twitter" } } } }
《Elastic Stack 实战手册》——三、产品能力——3.3.基础篇——3.3.2.专有名词解释(5) https://developer.aliyun.com/article/1231570