Link Search Menu Expand Document Documentation Menu

分离索引和搜索工作负载

在启用了远程存储且启用了段复制的集群中,您可以通过使用专门的 search 节点角色并配置索引中相应的搜索副本,将索引和搜索工作负载隔离到不同的硬件上。

OpenSearch 使用两种类型的副本:

  • 写入副本:充当主分片的冗余副本。如果主分片发生故障(例如,由于节点宕机或硬件问题),写入副本可以被提升为新的主分片,以确保写入操作的高可用性。
  • 搜索副本:专门用于处理搜索查询。搜索副本不能被提升为主分片。

分离工作负载的好处

分离索引和搜索工作负载提供了以下好处:

  1. 并行和隔离处理:并行处理索引和搜索工作负载并相互隔离,以提高整体系统吞吐量并确保可预测的性能。
  2. 独立可伸缩性:通过添加更多数据节点(用于写入副本)或搜索节点(用于搜索副本),独立扩展索引和搜索。
  3. 故障弹性:防止索引或搜索中的故障相互影响,以提高整体系统可用性。
  4. 成本效益和性能:使用专用硬件(例如,用于索引的计算优化实例和用于搜索的内存优化实例)来降低成本并提高性能。
  5. 调优灵活性:分别为索引和搜索工作负载独立优化性能设置,例如缓冲区和缓存。

设置工作负载分离

要分离索引和搜索工作负载,您需要配置搜索节点、启用远程存储并为索引添加搜索副本。请按照以下步骤在您的集群中设置工作负载分离。

步骤 1:配置搜索节点

在分离工作负载之前,您需要指定用于搜索操作的特定节点。搜索节点专用于处理搜索请求,有助于优化集群的搜索性能。

以下请求在 opensearch.yml 中配置一个仅用于搜索工作负载的节点:

node.name: searcher-node1
node.roles: [ search ]

步骤 2:启用远程存储

远程存储为您的索引数据提供了一个集中存储位置。此配置对于段复制至关重要,并确保所有节点都可以访问相同的数据,无论其角色如何。远程存储在您希望将存储与计算资源分离的云环境中特别有用。

以下请求在 opensearch.yml 中设置远程存储库的配置(例如,Amazon Simple Storage Service [Amazon S3]):

node.attr.remote_store.segment.repository: "my-repository"
node.attr.remote_store.translog.repository: "my-repository"
node.attr.remote_store.state.repository: "my-repository"
node.attr.remote_store.repository.my-repository.type: s3
node.attr.remote_store.repository.my-repository.settings.bucket: <Bucket Name 1>
node.attr.remote_store.repository.my-repository.settings.base_path: <Bucket Base Path 1>
node.attr.remote_store.repository.my-repository.settings.region: <Region>

有关更多信息,请参阅远程支持存储

在分离索引和搜索工作负载时,请在初始设置期间将 cluster.remote_store.state.enabled 设置为 true。此设置可确保 OpenSearch 将索引元数据存储在远程存储中,从而在仅搜索模式下实现搜索副本的无缝恢复。有关更多信息,请参阅搜索副本恢复场景

步骤 3:为索引添加搜索副本

配置节点和远程存储后,您需要为索引设置搜索副本。搜索副本是索引的副本,专门用于处理搜索请求,使您能够独立于索引容量扩展搜索容量。

默认情况下,在启用了远程存储的集群中创建的索引使用段复制。有关更多信息,请参阅段复制

您可以通过以下方式之一使用 number_of_search_replicas 设置(默认为 0)添加索引的搜索副本。

选项 1:创建带有搜索副本的索引

当您创建新索引并希望在过程开始时配置搜索副本时,请使用此选项。此方法非常适合在索引数据之前规划您的工作负载分离策略。

以下请求创建一个带有一个主分片、一个副本和两个搜索副本的索引:

PUT /my-index
{
    "settings": {
        "index": {
            "number_of_shards": 1,
            "number_of_replicas": 1,
            "number_of_search_replicas": 2,
        }
  }
}

选项 2:更新现有索引的搜索副本计数

当您有现有索引并希望添加或修改搜索副本时,请使用此选项。当您需要根据不断变化的工作负载需求调整搜索容量时,这非常有用。

以下请求更新搜索副本计数:

PUT /my-index/_settings
{
  "settings": {
    "index": {
      "number_of_search_replicas": 1
    }
  }
}

选项 3:从带有搜索副本的快照中恢复索引

当您从快照恢复索引并希望在恢复过程中配置搜索副本时,请使用此选项。这对于灾难恢复场景或在集群之间迁移索引时特别有用。

以下请求从带有搜索副本的快照中恢复索引:

POST /_snapshot/my-repository/my-snapshot/_restore
{ 
    "indices": "my-index", 
    "index_settings": { 
        "index.number_of_search_replicas": 2,
        "index.replication.type": "SEGMENT"
     } 
}'

附加配置

设置基本工作负载分离后,您可以微调配置以优化性能和资源利用率。以下设置允许您控制搜索路由、自动扩展副本并根据您的特定需求管理写入工作负载。

强制执行集群级搜索请求路由

当启用搜索副本时,所有搜索流量默认路由到它们。以下请求强制或放松此路由行为:

PUT /_cluster/settings
{ 
    "persistent": {
        "cluster.routing.search_replica.strict": "true"
    }
}

cluster.routing.search_replica.strict 设置支持以下选项:

  • true(默认):仅路由到搜索副本。
  • false:允许在需要时回退到主/写入副本。

自动扩展搜索副本

使用 auto_expand_search_replicas 索引设置可根据集群中可用搜索节点的数量自动扩展搜索副本。有关更多信息,请参阅索引设置

使用仅搜索模式关闭写入工作负载

当您不需要写入索引时,可以使用 _scale API 关闭主分片和写入副本。此方法适用于日志分析等一次写入、多次读取的场景,您可以通过仅保持搜索副本活动来减少资源使用。

以下请求通过停用写入副本开启仅搜索模式:

POST my_index/_scale 
{
   "search_only": true
}

以下请求通过激活写入副本关闭仅搜索模式:

POST my_index/_scale 
{
   "search_only": false
}

搜索副本恢复场景

OpenSearch 根据配置的不同,以不同的方式处理仅搜索模式下的搜索副本恢复。

场景 1:持久数据目录且远程存储状态已禁用

当您使用持久数据目录并将 cluster.remote_store.state.enabled 设置为 false 时,搜索副本在节点重启后会自动恢复。

场景 2:远程存储状态已启用但无持久数据目录

cluster.remote_store.state.enabled 设置为 true 且没有持久数据目录时,OpenSearch 会恢复搜索副本,而无需主分片或写入副本。由于远程存储状态已启用,OpenSearch 在重启后会保留索引元数据。分配逻辑会跳过搜索副本的活动主分片检查,允许它们被分配,以便搜索查询保持功能。

场景 3:远程存储状态已启用且有持久数据目录

此配置提供无缝恢复。在仅搜索模式下,如果同时存在持久数据目录且 cluster.remote_store.state.enabled 设置为 true,OpenSearch 将仅启动搜索副本(不包括主分片和写入副本),确保索引在重启后可以查询。

场景 4:无持久数据目录且远程存储状态已禁用

当持久数据目录丢失且 cluster.remote_store.state.enabled 设置为 false 时,所有本地状态都会在重启时丢失。OpenSearch 没有元数据引用,因此索引变得不可恢复。