扩容的单元(The Unit of Scale)edit

动态更新索引中,我们介绍了一个分片即一个Lucene 索引,一个 Elasticsearch 索引即一系列分片的集合。 你的应用程序与索引进行交互,Elasticsearch 帮助你将请求路由至相应的分片。

一个分片即为 扩容的单元(unit of scale) 。最小的一个索引可以只有一个分片。 这可能已经完全满足你的需求了 — 单个分片即可存储大量的数据 — 但这限制了你的可扩展性。

想象一下我们的集群由一个节点组成,在集群内有一个索引,这个索引只含一个分片:

PUT /my_index
{
  "settings": {
    "number_of_shards":   1, 
    "number_of_replicas": 0
  }
}

创建一个拥有 1 个主分片 0 个副本分片的索引.

这个设置也许很小,但它满足我们当前的需求而且成本很低。

当前我们只讨论主 (primary)分片(shard)。我们将在 副本分片 讨论 副本 (replica)分片(shard)。

在美好的一天,互联网发现了我们,一个节点再也承受不了我们的流量。 我们决定根据 Figure 49, “一个只有一个分片的索引无扩容因子” 添加一个节点。这将会发生什么呢?

一个只有一个分片的索引无扩容因子
Figure 49. 一个只有一个分片的索引无扩容因子 (An index with one shard has no scale factor)

答案是:什么都不会发生。因为我们只有一个分片,已经没有什么可以放在第二个节点上的了。 我们不能增加索引的分片数因为它是 路由文档到分片(route documents to shards) 算法中的重要元素:

shard = hash(routing) % number_of_primary_shards

我们当前的选择只有一个,就是将数据重新索引至一个拥有更多分片的一个更大的索引,但这样做将消耗的时间是我们无法承受的。 通过事先规划,我们可以使用预分配(overallocating)的方式来完全避免这个问题。