ElasticSearch中副本和分片如何优化?

文摘   2024-10-04 08:14   辽宁  
关注下方公众号,获取更多热点资讯

ElasticSearch中副本和分片如何优化?

目录

  1. 1. ElasticSearch 分片(Shard)的概念与计算

  • • 分片的配置与计算

  • 2. ElasticSearch 副本(Replica)的概念与配置

    • • 副本的配置

  • 3. 分片、副本与节点的关系

    • • 节点与分片的关系

    • • 副本的数量和节点

  • 4. 分片、副本配置的建议

  • 5. 常见问题:分片数和副本数是否能够在创建索引后添加

    • • 分片数(Shards)在创建索引后是否能修改

    • • 副本数(Replicas)在创建索引后是否能修改

  • 6. 如何设置分片数和副本数

    • • 设置分片数

    • • 设置副本数

    • • 副本数的限制

  • 7. 总结

  • ElasticSearch 的分片(Shard)和副本(Replica)的数量与服务器节点(Node)密切相关,因为它们直接影响到数据的分布、查询性能和系统的高可用性。为了深入理解这个过程,我们需要分别了解分片、副本的概念,以及它们在集群中的运作方式,最后再讨论如何根据服务器节点的数量来合理地配置分片和副本。

    1. ElasticSearch 分片(Shard)的概念与计算

    ElasticSearch 中的分片是数据存储的基本单位。一个索引可以被分成多个分片,分片中的数据会被分布到不同的节点上。ElasticSearch 分片的概念可以类比为关系型数据库中的数据分区,通过将大数据集分片,可以提高数据存储的分布性和查询的并行性。

    分片的配置与计算

    在创建索引时,ElasticSearch 会默认配置分片的数量。每个分片的数量在索引创建时就必须设定,并且一旦创建索引,分片数量无法更改。一般来说,分片的数量取决于以下几个因素:

    • • 数据量:预计存储的数据大小决定了分片的数量。ElasticSearch 推荐每个分片的大小在 10-50GB 之间。超过此范围可能会导致性能下降或不稳定。

    • • 查询并发量:更多的分片能够分散查询压力,提升并发查询的性能。然而,分片过多也会导致集群维护开销过高。

    • • 节点数量:分片在集群中的各个节点上分布,因此分片数量与节点数相关。如果有较多节点,那么可以考虑更多的分片,以便更好地平衡节点负载。

    举个例子:如果预计索引中有 500GB 的数据,并且每个分片设定大小为 25GB,那么合适的分片数量为 500/25 = 20 个分片。

    2. ElasticSearch 副本(Replica)的概念与配置

    副本(Replica)是分片的副本,用于实现数据的冗余和高可用性。每个主分片(Primary Shard)都可以有一个或多个副本分片(Replica Shard),这些副本分片在集群中存放在不同的节点上,从而在主分片不可用的情况下,副本可以自动切换为主分片,保证数据的可用性。

    副本的配置

    ElasticSearch 默认每个主分片有 1 个副本分片。副本数量与主分片的比例是 1:1,这意味着每个主分片会有 1 个对应的副本。你可以根据需要调整副本数量,但注意副本不能与对应的主分片放在同一个节点上。

    副本的主要作用:

    • • 提高查询性能:副本分片可以分担查询的负载,特别是在读操作繁重的场景下,每个副本分片都可以响应读请求。

    • • 高可用性:如果某个节点宕机,ElasticSearch 会将该节点上的主分片的副本提升为主分片,继续对外提供服务,避免数据丢失。

    3. 分片、副本与节点的关系

    ElasticSearch 的集群是由多个节点组成的,每个节点在集群中可能会存储多个分片。分片和副本的数量与节点的数量直接相关,因为它们会影响集群的负载均衡和容错能力。

    节点与分片的关系

    • • 主分片与节点:主分片会均匀地分布在集群中的各个节点上。理论上,如果集群中有 N 个节点,索引有 S 个主分片,那么每个节点上会分配 S/N 个分片。

    • • 副本与节点:副本分片不会和主分片放在同一个节点上。如果某个节点上存储了某个主分片,那么它的副本分片会存储在集群中的其他节点上,以保证数据的冗余和高可用性。

    例如,在一个 5 个节点的集群中,如果索引有 10 个主分片和 1 个副本,那么集群中的 5 个节点将被分配总共 20 个分片(10 个主分片 + 10 个副本分片)。ElasticSearch 会尽量将分片和副本均匀分布在不同的节点上。

    副本的数量和节点

    • • 如果你有 1 个副本分片,那么你至少需要 2 个节点来存储主分片和副本分片。如果只有 1 个节点,副本分片将无法分配。

    • • 如果你想要更高的容错能力,可以增加副本的数量。例如,如果你有 3 个节点并为每个分片设置 2 个副本,那么 ElasticSearch 可以在每个节点上分布主分片和副本分片。

    4. 分片、副本配置的建议

    在实际应用中,分片和副本的数量通常取决于集群的规模和业务需求。以下是一些建议:

    • • 分片数量

      • • 如果数据量较大或查询较多,可以增加分片数量以提高并发查询的能力。

      • • 如果分片过多,可能会导致集群管理和维护的负担增大,推荐根据实际数据量来设定分片大小。

    • • 副本数量

      • • 如果读操作较多,可以考虑增加副本数量,以便更多的分片可以响应读请求。

      • • 如果集群的高可用性要求较高,可以增加副本数量来确保即使多个节点故障,数据也不会丢失。

    例如,假设你有一个集群由 5 个节点组成,并且你预计会存储 100GB 的数据。你决定每个分片的大小约为 20GB,因此你需要 5 个主分片。如果你希望有 1 个副本,那么集群中总共需要存储 10 个分片(5 个主分片 + 5 个副本分片),每个节点将分配 2 个分片。

    常见问题:分片数和副本数是否能够在创建索引后添加

    分片数(Shards)在创建索引后是否能修改

    分片数在创建索引时是固定的,无法在索引创建后直接修改。这是 ElasticSearch 的设计限制之一,因为主分片的分布和数据存储是静态的,一旦数据写入主分片,分片数的更改会引发复杂的底层数据迁移问题,因此在创建索引之后,ElasticSearch 不允许直接改变主分片的数量

    如果在创建索引时设定的分片数不够,导致集群负载分布不均或者查询性能不佳,那么只能通过以下两种方案进行调整:

    • • 重建索引:最常见的方式是通过重新索引(Reindexing)。可以创建一个新的索引,并且在新索引中配置合适的分片数量,然后将数据从旧索引迁移到新索引。这种方法虽然麻烦,但是确保了数据的正确分布。

      • • 示例:

        PUT /new-index
        {
          "settings": {
            "number_of_shards": 10,
            "number_of_replicas": 1
          }
        }

        然后使用 ElasticSearch 的 Reindex API:

        POST _reindex
        {
          "source": {
            "index": "old-index"
          },
          "dest": {
            "index": "new-index"
          }
        }
    • • 使用索引别名(Alias):可以为新的索引创建别名,这样应用程序可以无缝切换到新的索引,而无需修改查询代码。别名允许对多个索引进行查询,这是一种灵活的索引管理方法。

    副本数(Replicas)在创建索引后是否能修改

    与主分片不同,副本数是可以动态调整的,即可以在索引创建之后增加或减少副本分片的数量。这是因为副本是主分片的副本,ElasticSearch 能够在不影响主分片数据的情况下增加或删除副本,从而实现动态扩展和调整高可用性。

    通过简单的 API 调用,可以在索引创建后随时调整副本数量:

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

    这个操作会触发 ElasticSearch 在集群中的其他节点上重新分配副本分片,以保证副本分布的均匀性。

    副本数的调整不会影响主分片的数据存储结构,但副本分片的分布仍然会受集群中可用节点的数量限制。需要注意的是,副本分片不能与其对应的主分片存储在同一节点上,因此在增加副本数时,必须确保集群中有足够多的节点来存放这些副本。


    2. 如何设置分片数和副本数

    设置分片数

    分片数的设置在创建索引时通过配置参数 number_of_shards 来指定。ElasticSearch 默认每个索引有 5 个分片,但这一数量可以根据需求调整。

    设置分片数的步骤:

    1. 1. 确定数据规模:估算你存储的数据总量,参考每个分片的最佳大小(通常在 10GB 到 50GB 之间)。

    2. 2. 决定并发量和负载分布:考虑查询的并发性,更多的分片可以分散查询负载。

    3. 3. 设置分片数:在创建索引时,使用 number_of_shards 参数指定分片数量。

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

    上面的例子创建了一个有 3 个主分片和 1 个副本的索引。

    设置副本数

    副本数的设置同样在创建索引时通过 number_of_replicas 参数来指定,默认值为 1。副本数的调整比主分片灵活,可以在任何时候通过 API 调整。

    设置副本数的步骤:

    1. 1. 确定高可用性需求:如果希望容忍多个节点故障,可以增加副本数。

    2. 2. 考虑读操作性能:增加副本也可以提升查询性能,因为每个副本分片都能处理读请求。

    3. 3. 动态调整副本数:可以通过 _settings API 动态增加或减少副本。

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

    通过上面的 API,将副本数调整为 2,这意味着每个主分片将有 2 个副本分片,系统可以容忍最多 2 个节点的故障。

    副本数的限制

    副本数的设置受集群中的节点数量限制。ElasticSearch 要求副本分片和对应的主分片存储在不同的节点上。因此:

    • • 如果你有 3 个节点的集群,并设置了 2 个副本数,那么 ElasticSearch 会将每个主分片和它的两个副本分布在不同的节点上。

    • • 如果集群中的节点数量不足,ElasticSearch 会将副本分片标记为未分配(Unassigned),直到集群中的节点数足够。

    总结

    ElasticSearch 中的分片和副本的配置确实与节点的数量密切相关。分片的数量决定了数据的分布和查询性能,而副本的数量则影响数据的冗余性和系统的高可用性。节点的数量决定了分片和副本可以分布的范围,因此,合理的分片和副本配置应该综合考虑节点数量、数据量、查询需求和高可用性要求。


    欢迎关注我的公众号“编程与架构”,原创技术文章第一时间推送。



    编程与架构
    专注于Java、大数据、AI以及开发运维技术的深入探索与分享。作为一名开源爱好者,致力于分享实战经验和前沿技术动态,帮助更多技术人提升技能。
     最新文章