分离索引和搜索工作负载
在启用了远程存储且启用了段复制的集群中,您可以通过使用专门的 search
节点角色并配置索引中相应的搜索副本,将索引和搜索工作负载隔离到不同的硬件上。
OpenSearch 使用两种类型的副本:
- 写入副本:充当主分片的冗余副本。如果主分片发生故障(例如,由于节点宕机或硬件问题),写入副本可以被提升为新的主分片,以确保写入操作的高可用性。
- 搜索副本:专门用于处理搜索查询。搜索副本不能被提升为主分片。
分离工作负载的好处
分离索引和搜索工作负载提供了以下好处:
- 并行和隔离处理:并行处理索引和搜索工作负载并相互隔离,以提高整体系统吞吐量并确保可预测的性能。
- 独立可伸缩性:通过添加更多数据节点(用于写入副本)或搜索节点(用于搜索副本),独立扩展索引和搜索。
- 故障弹性:防止索引或搜索中的故障相互影响,以提高整体系统可用性。
- 成本效益和性能:使用专用硬件(例如,用于索引的计算优化实例和用于搜索的内存优化实例)来降低成本并提高性能。
- 调优灵活性:分别为索引和搜索工作负载独立优化性能设置,例如缓冲区和缓存。
设置工作负载分离
要分离索引和搜索工作负载,您需要配置搜索节点、启用远程存储并为索引添加搜索副本。请按照以下步骤在您的集群中设置工作负载分离。
步骤 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 没有元数据引用,因此索引变得不可恢复。