副本分片

目前为止我们只讨论过主分片,但我们身边还有另一个工具:副本分片。 副本分片的主要目的就是为了故障转移,正如在 集群内的原理 中讨论的:如果持有主分片的节点挂掉了,一个副本分片就会晋升为主分片的角色。

在索引写入时,副本分片做着与主分片相同的工作。新文档首先被索引进主分片然后再同步到其它所有的副本分片。增加副本数并不会增加索引容量。

无论如何,副本分片可以服务于读请求,如果你的索引也如常见的那样是偏向查询使用的,那你可以通过增加副本的数目来提升查询性能,但也要为此 _增加额外的硬件资源_。

让我们回到那个有着两个主分片索引的例子。我通过增加第二个节点来提升索引容量。 增加额外的节点不会帮助我们提升索引写入能力,但我们可以通过增加副本数在搜索时利用额外的硬件:

PUT /my_index/_settings
{
  "number_of_replicas": 1
}

拥有两个主分片,加上每个主分片的一个副本,总共给予我们四个分片:每个节点一个,如图所示 Figure 51, “一个拥有两个主分片一份副本的索引可以在四个节点中横向扩展”

Figure 51. 一个拥有两个主分片一份副本的索引可以在四个节点中横向扩展

一个拥有两个主分片一份副本的索引可以在四个节点中横向扩展

通过副本进行负载均衡

搜索性能取决于最慢的节点的响应时间,所以尝试均衡所有节点的负载是一个好想法。 如果我们只是增加一个节点而不是两个,最终我们会有两个节点各持有一个分片,而另一个持有两个分片做着两倍的工作。

我们可以通过调整副本数量来平衡这些。通过分配两份副本而不是一个,最终我们会拥有六个分片,刚好可以平均分给三个节点,如图所示 Figure 52, “通过调整副本数来均衡节点负载”

PUT /my_index/_settings
{
  "number_of_replicas": 2
}

作为奖励,我们同时提升了我们的可用性。我们可以容忍丢失两个节点而仍然保持一份完整数据的拷贝。

Figure 52. 通过调整副本数来均衡节点负载

通过调整副本数来均衡节点负载

Note

事实上节点 3 持有两个副本分片,然而没有主分片并不重要。副本分片与主分片做着相同的工作;它们只是扮演着略微不同的角色。没有必要确保主分片均匀地分布在所有节点中。