首页 文章

Elasticsearch中的碎片和副本

提问于
浏览
238

我试图了解Elasticsearch中的碎片和副本是什么,但我无法理解它 . 如果我下载Elasticsearch并运行脚本,那么据我所知,我已经启动了一个具有单个节点的集群 . 现在这个节点(我的PC)有5个分片(?)和一些副本(?) .

他们是什么,我有5个重复的索引?如果是这样的话?我需要一些解释 .

7 回答

  • 777

    索引被分解为碎片以便分发它们并进行缩放 .

    副本是分片的副本 .

    节点是弹性搜索的运行实例,属于集群 .

    群集由一个或多个共享相同群集名称的节点组成 . 每个群集都有一个主节点,由群集自动选择,如果当前主节点出现故障,可以替换该节点 .

  • 1

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

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

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

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

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

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

    然后,节点1将仅保存三个分片:

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

    由于剩余的两个分片已移至新启动的节点:

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

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

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

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

    回到我们的示例,使用1个副本,我们将在每个节点上拥有整个索引,因为将在第一个节点上分配3个副本分片,它们将包含与第二个节点上的原色完全相同的数据:

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

    对于第二个节点也是如此,它将包含第一个节点上主分片的副本:

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

    使用这样的设置,如果节点出现故障,您仍然拥有整个索引 . 副本分片将自动成为主要分片,尽管节点发生故障,群集仍能正常工作,如下所示:

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

    由于您有 "number_of_replicas":1 ,因此无法再分配副本,因为它们从未在主节点所在的同一节点上分配 . 's why you'将有5个未分配的分片,副本和群集状态将是 YELLOW 而不是 GREEN . 没有数据丢失,但可能更好,因为无法分配一些分片 .

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

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

  • 19

    如果你真的不喜欢看到黄色 . 您可以将副本数设置为零:

    curl -XPUT 'localhost:9200/_settings' -d '
    {
        "index" : {
            "number_of_replicas" : 0
        }
    }
    '
    

    请注意,您应该只在本地开发框中执行此操作 .

  • 2

    索引被分解为碎片以便分发它们并进行缩放 .

    副本是分片的副本,并在节点丢失时提供可靠性 . 此数字通常存在混淆,因为副本计数== 1表示群集必须具有可用于处于绿色状态的主分片和分片的复制副本 .

    要创建副本,您必须至少有2个节点你的集群 .

    您可能会发现这里的定义更容易理解:http://www.elasticsearch.org/guide/reference/glossary/

    最诚挚的问候,保罗

  • 17

    Shard:

    • 作为分布式搜索服务器, ElasticSearch 使用名为 Shard 的概念在所有节点上分发索引文档 .

    • index 可能存储大量可能超过 single node 硬件限制的数据

    • 例如,占用1TB磁盘空间的十亿个文档的单个索引可能不适合单个节点的磁盘,或者可能太慢而无法单独从单个节点提供搜索请求 .

    • 为解决此问题, Elasticsearch 提供了将索引细分为多个名为 shards 的功能 .

    • 创建索引时,只需定义所需的 shards 数即可 .

    • Documents 存储在 shards 中,并且在 cluster 中将分片分配给 nodes

    • cluster 增大或缩小时, Elasticsearch 将自动在 nodes 之间迁移分片,以便 cluster 保持 balancer .

    • 分片可以是 primary shardreplica shard .

    • 索引中的每个文档都属于 single primary shard ,因此您拥有的主分片数决定了索引可以容纳的最大数据量

    • A replica shard 只是主分片的副本 .

    Replica:

    • Replica shardprimary Shard 的副本,用于防止硬件故障时数据丢失 .

    • Elasticsearch 允许您将索引的分片的一个或多个副本复制到所谓的副本分片中,或者简称为 replicas .

    • index 也可以复制为零(表示没有复制品)或更多次 .

    • 可以在创建索引时为每个索引定义 number of shards 和副本 .

    • 创建索引后,您可以随时动态更改副本的数量,但事后才能实现.1327865_ .

    • 默认情况下, Elasticsearch 中的每个索引都分配了5个主分片和 1 replica ,这意味着如果群集中至少有两个节点,则索引将包含5个主分片和另外5个副本分片(1个完整副本),总计为每个索引10个分片 .

  • 4

    在ElasticSearch中,在顶层我们将文档索引为索引 . 每个索引都有内部分配数据的分片数,而内部分片中存在Lucene分段,它是数据的核心存储 . 因此,如果索引具有5个分片,则意味着数据已经跨分片分布,而分片中不存在相同的数据 .

    请注意解释ES核心的视频https://www.youtube.com/watch?v=PpX7J-G2PEo

    有关多个索引或多个分片的文章Elastic search, multiple indexes vs one index and types for different data sets?

  • 0

    我将使用真实的单词场景来解释这一点 . 想象一下,你是一个运营电子商务网站 . 随着您越来越受欢迎,更多卖家和产品会添加到您的网站 . 您将意识到索引所需的产品数量已经增长,并且它太大而无法放入一个节点的一个硬盘中 . 即使它适合硬盘,在一台机器上执行所有文档的线性搜索也非常慢 . 一个节点上的一个索引将不利用elasticsearch工作的分布式群集配置 .

    因此,elasticsearch将索引中的文档分割为群集中的多个节点 . 文档的每个拆分称为碎片 . 携带文档碎片的每个节点将仅具有文档的子集 . 假设你有100个产品和5个碎片,每个碎片将有20个产品 . 这种数据分片是使弹性搜索中的低延迟搜索成为可能的原因 . 搜索在多个节点上并行进行 . 结果汇总并返回 . 然而,碎片不提供容错 . 意味着如果包含该分片的任何节点已关闭,则群集运行状况将变为黄色 . 意味着某些数据不可用 .

    为了增加容错复制品,请进入图片 . 通过deault elastic search创建每个分片的单个副本 . 这些副本始终在主分片不在的其他节点上创建居住 . 因此,要使系统容错,您可能必须增加群集中的节点数量,并且还取决于索引的分片数量 . 计算基于副本和分片所需节点数的通用公式是“节点数=分片数*(副本数1)” . 标准做法是至少有一个副本用于容错 .

    Setting up the number of shards is a static operation, meaning you have to specify it when you are creating an index. Any change after that woulf require complete reindexing of data and will take time. But, setting up number of replicas is a dynamic operation and can be done at any time after index creation also.

    您可以使用以下命令设置索引的分片数和副本数 .

    curl -XPUT 'localhost:9200/sampleindex?pretty' -H 'Content-Type: application/json' -d ' { "settings":{ "number_of_shards":2, "number_of_replicas":1 } } '

相关问题