elasticsearch - Elasticsearch 中的分片和副本

标签 elasticsearch full-text-search

我想了解 Elasticsearch 中的分片和副本是什么,但我没能理解。如果我下载 Elasticsearch 并运行脚本,那么据我所知,我已经启动了一个具有单个节点的集群。现在这个节点(我的电脑)有 5 个分片(?)和一些副本(?)。

它们是什么,我有 5 个重复的索引吗?如果是,为什么?我可能需要一些解释。

最佳答案

我会尝试用一个真实的例子来解释,因为你得到的答案和回复似乎对你没有帮助。

当您下载 elasticsearch 并启动它时,您会创建一个 elasticsearch 节点,该节点会尝试加入现有集群(如果可用)或创建一个新集群。假设您使用单个节点创建了自己的新集群,即您刚刚启动的节点。我们没有数据,因此我们需要创建一个索引。

当您创建索引时(当您为第一个文档编制索引时也会自动创建一个索引),您可以定义它将由多少个分片组成。如果您不指定数字,它将具有默认的分片数:5 个主分片。这是什么意思?

这意味着 elasticsearch 将创建 5 个包含您的数据的主分片:

 ____    ____    ____    ____    ____
| 1  |  | 2  |  | 3  |  | 4  |  | 5  |
|____|  |____|  |____|  |____|  |____|

每次您索引一个文档时,elasticsearch 将决定哪个主分片应该保存该文档并将其索引在那里。主分片不是数据的副本,它们就是数据!拥有多个分片确实有助于利用单台机器上的并行处理,但重点是如果我们在同一集群上启动另一个 elasticsearch 实例,分片将以均匀的方式分布在集群中。

然后节点 1 将只持有例如三个分片:

 ____    ____    ____ 
| 1  |  | 2  |  | 3  |
|____|  |____|  |____|

由于剩余的两个分片已经被移动到新启动的节点上:

 ____    ____
| 4  |  | 5  |
|____|  |____|

为什么会这样?因为 elasticsearch 是一个分布式搜索引擎,所以您可以利用多个节点/机器来管理大量数据。

每个 elasticsearch 索引都由至少一个主分片组成,因为这是存储数据的地方。但是,每个分片都是有代价的,因此,如果您只有一个节点并且没有可预见的增长,那就坚持使用一个主分片。

另一种类型的碎片是副本。默认值为 1,这意味着每个主分片都将被复制到另一个包含相同数据的分片。副本用于提高搜索性能和故障转移。副本分片永远不会分配到相关主分片所在的同一节点上(这很像将备份与原始数据放在同一磁盘上)。

回到我们的示例,对于 1 个副本,我们将在每个节点上拥有整个索引,因为将在第一个节点上分配 2 个副本分片,并且它们将包含与第二个节点上的主分片完全相同的数据:

 ____    ____    ____    ____    ____
| 1  |  | 2  |  | 3  |  | 4R |  | 5R |
|____|  |____|  |____|  |____|  |____|

第二个节点也一样,它将包含第一个节点上主分片的副本:

 ____    ____    ____    ____    ____
| 1R |  | 2R |  | 3R |  | 4  |  | 5  |
|____|  |____|  |____|  |____|  |____|

使用这样的设置,如果一个节点出现故障,您仍然拥有整个索引。副本分片将自动成为主分片,集群将在节点故障的情况下正常工作,如下所示:

 ____    ____    ____    ____    ____
| 1  |  | 2  |  | 3  |  | 4  |  | 5  |
|____|  |____|  |____|  |____|  |____|

因为您有 "number_of_replicas":1,所以无法再分配副本,因为它们永远不会分配到它们的主节点所在的同一节点上。这就是为什么您将有 5 个未分配的分片、副本和集群状态将为 YELLOW 而不是 GREEN。没有数据丢失,但可能会更好,因为无法分配某些分片。

一旦备份了离开的节点,它将再次加入集群并重新分配副本。可以加载第二个节点上的现有分片,但它们需要与其他分片同步,因为写操作很可能是在节点关闭时发生的。在此操作结束时,集群状态将变为 GREEN

希望这能为您澄清一些事情。

关于elasticsearch - Elasticsearch 中的分片和副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15694724/

相关文章:

solr - 如何提高solr中搜索文本的排名?

elasticsearch - 如何在Elasticsearch中设置Telegraf配置以收集kafka主题/分区滞后

javascript - 对象数组的客户端全文搜索

elasticsearch - Elasticsearch 5.x 中地理距离查询的返回距离

Elasticsearch - 获取子文档的计数,即使计数为零

php - 如何替换/加速使用 LIKE 的文本搜索查询?

database - 在服务器中实现自动完成的最佳方式是什么?

php - 错误: unknown key name 'CONCAT_WS' in sphinx query

ruby-on-rails - 使用轮胎 gem 进行 Elasticsearch 的刻面尺寸

caching - Elasticsearch 缓存清除似乎没有达到我的预期