我将尝试用一个真实的例子来解释,因为你得到的答案和回复似乎对你没有帮助。
当您下载 elasticsearch 并启动它时,您会创建一个 elasticsearch 节点,该节点会尝试加入现有集群(如果可用)或创建一个新集群。假设您使用单个节点创建了自己的新集群,即您刚刚启动的那个。我们没有数据,因此我们需要创建一个索引。
创建索引时(索引第一个文档时也会自动创建索引),您可以定义它将由多少个分片组成。如果您不指定数字,它将具有默认的分片数:5 个主分片。这是什么意思?
这意味着 elasticsearch 将创建 5 个包含您的数据的主分片:
____ ____ ____ ____ ____
| 1 | | 2 | | 3 | | 4 | | 5 |
|____| |____| |____| |____| |____|
每次索引文档时,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。
希望这可以为您澄清事情。