Link Search Menu Expand Document Documentation Menu

段复制

段复制涉及在分片之间复制段文件,而不是在每个分片副本上索引文档。这种方法提高了索引吞吐量并减少了资源利用,但增加了网络利用率。段复制是旨在解耦读写以降低计算成本的一系列功能中的第一个。

当主分片在刷新时向副本分片发送检查点时,副本分片上会触发新的段复制事件。这发生在:

  • 当集群中添加新的副本分片时。
  • 当主分片刷新时段文件发生更改时。
  • 在对等恢复期间,例如副本分片恢复和分片重定位(使用 move 分配命令进行显式分配或自动分片重新平衡)。

用例

段复制可应用于各种场景,包括:

  • 高写入负载但搜索要求不高且刷新时间较长的情况。
  • 当遇到极高负载时,您想添加新节点但不想立即索引所有数据的情况。
  • 副本计数较低的 OpenSearch 集群部署,例如用于日志分析的部署。

远程备份存储

从 OpenSearch 2.10 开始,您可以使用两种段复制方法:

  • 远程备份存储,一种持久存储解决方案:主分片将段文件发送到远程备份存储,副本分片从同一存储中获取副本。有关使用远程备份存储的更多信息,请参阅远程备份存储
  • 节点到节点通信:主分片使用节点到节点通信将段文件直接发送到副本分片。

段复制配置

设置集群的默认复制类型会影响所有新创建的索引。但是,您可以在创建索引时指定不同的复制类型。索引级设置会覆盖集群级设置。

创建带段复制的索引

要将段复制用作索引的复制策略,请在创建索引时将 replication.type 参数设置为 SEGMENT,如下所示:

PUT /my-index1
{
  "settings": {
    "index": {
      "replication.type": "SEGMENT" 
    }
  }
}

如果您正在使用远程备份存储,请将 remote_store 属性添加到索引请求正文。

当使用节点到节点复制时,主分片会消耗更多的网络带宽,因为它将段文件推送到所有副本分片。因此,将主分片均匀地分布在节点之间是有益的。为确保主分片分布均衡,请将动态设置 cluster.routing.allocation.balance.prefer_primary 设置为 true。有关更多信息,请参阅集群设置

为获得最佳性能,建议您启用以下设置:

  1. 分段复制背压
  2. 平衡主分片分配,使用以下命令:
PUT /_cluster/settings
{
  "persistent": {
    "cluster.routing.allocation.balance.prefer_primary": true,
    "segrep.pressure.enabled": true
  }
}

设置集群的复制类型

您可以在 opensearch.yml 文件中设置新创建的集群索引的默认复制类型,如下所示:

cluster.indices.replication.strategy: 'SEGMENT'

强制执行集群级复制类型

如果启用,cluster.index.restrict.replication.type 设置要求新创建的索引必须在 cluster.indices.replication.strategy 集群设置中指定复制类型。指定不同复制类型的请求将被拒绝。如果 cluster.index restrict.replication.type 被禁用,您可以根据每个索引选择复制类型,通过在 index.replication.type 设置中指定它。

您可以在 opensearch.yml 文件中定义 cluster.index.restrict.replication.type 设置,如下所示:

cluster.index.restrict.replication.type: true

创建带有文档复制的索引

即使默认复制类型设置为段复制,您也可以通过将 replication.type 设置为 DOCUMENT 来创建使用文档复制的索引,如下所示:

PUT /my-index1
{
  "settings": {
    "index": {
      "replication.type": "DOCUMENT" 
    }
  }
}

注意事项

使用段复制时,请考虑以下事项:

  1. 为现有索引启用段复制需要重新索引
  2. 跨集群复制目前不使用段复制在集群之间进行复制。
  3. 段复制导致使用节点到节点复制的主分片网络拥塞增加,因为副本分片从主分片获取更新。使用远程备份存储时,主分片可以将段上传到远程备份存储,副本可以从远程备份存储获取更新。这有助于将主分片的职责分担到远程备份存储。
  4. 读写一致性保证:段复制目前不支持将刷新策略设置为 wait_fortrue。如果您将 refresh 查询参数设置为 wait_fortrue 然后摄入文档,您只会在主节点刷新并使这些文档可搜索后才获得响应。副本分片只会在写入其本地事务日志后才响应。如果需要实时读取,请考虑使用 getmget API 操作。
  5. 从 OpenSearch 2.10 开始,系统索引支持段复制。
  6. Get、MultiGet、TermVector 和 MultiTermVector 请求通过将请求路由到主分片来提供强一致性读取。与在主分片和副本分片之间分配请求相比,将更多请求路由到主分片可能会降低性能。为了提高读密集型集群的性能,我们建议将这些请求中的 realtime 参数设置为 false。更多信息请参见问题 #8700

基准测试

在初始基准测试中,段复制用户报告在相同的集群设置下,其吞吐量比使用文档复制时高出 40%。

以下基准测试是使用 OpenSearch-benchmark 并利用 stackoverflownyc_taxi 数据集收集的。

基准测试展示了以下配置对段复制的影响:

您的结果可能会因集群拓扑、使用的硬件、分片数量和合并设置而异。

增加工作负载大小

下表列出了 nyc_taxi 数据集在以下配置下的基准测试结果:

  • 10 个 m5.xlarge 数据节点
  • 40 个主分片,每个 1 个副本(共 80 个分片)
  • 每个节点 4 个主分片和 4 个副本分片
40 GB 主分片,总计 80 GB 240 GB 主分片,总计 480 GB
文档复制 段复制 百分比差异 文档复制 段复制 百分比差异
存储大小 85.2781 91.2268 不适用 515.726 558.039 不适用
索引吞吐量(每秒请求数) 最小值 148,134 185,092 24.95% 100,140 168,335 68.10%
中位数 160,110 189,799 18.54% 106,642 170,573 59.95%
最大值 175,196 190,757 8.88% 108,583 172,507 58.87%
错误率 0.00% 0.00% 0.00% 0.00% 0.00% 0.00%

随着工作负载大小的增加,段复制的优势得到放大,因为副本不需要索引更大的数据集。总的来说,在所有集群配置中,段复制在资源成本较低的情况下能带来更高的吞吐量,这尚未考虑复制延迟。

增加主分片数量

下表列出了 nyc_taxi 数据集在 40 个和 100 个主分片情况下的基准测试结果。

40 个主分片,1 个副本 100 个主分片,1 个副本
文档复制 段复制 百分比差异 文档复制 段复制 百分比差异
索引吞吐量(每秒请求数) 最小值 148,134 185,092 24.95% 151,404 167,391 9.55%
中位数 160,110 189,799 18.54% 154,796 172,995 10.52%
最大值 175,196 190,757 8.88% 166,173 174,655 4.86%
错误率 0.00% 0.00% 0.00% 0.00% 0.00% 0.00%

随着主分片数量的增加,段复制相对于文档复制的优势会减小。尽管段复制在主分片数量较多时仍然有益,但性能差异变得不那么明显,因为每个节点有更多的主分片需要跨集群复制段文件。

增加副本数量

下表列出了 stackoverflow 数据集在 1 个和 9 个副本情况下的基准测试结果。

10 个主分片,1 个副本 10 个主分片,9 个副本
文档复制 段复制 百分比差异 文档复制 段复制 百分比差异
索引吞吐量(每秒请求数) 中位数 72,598.10 90,776.10 25.04% 16,537.00 14,429.80 −12.74%
最大值 86,130.80 96,471.00 12.01% 21,472.40 38,235.00 78.07%
CPU 使用率 (%) p50 17 18.857 10.92% 69.857 8.833 −87.36%
p90 76 82.133 8.07% 99 86.4 −12.73%
p99 100 100 0% 100 100 0%
p100 100 100 0% 100 100 0%
内存使用率 (%) p50 35 23 −34.29% 42 40 −4.76%
p90 59 57 −3.39% 59 63 6.78%
p99 69 61 −11.59% 66 70 6.06%
p100 72 62 −13.89% 69 72 4.35%
错误率 0.00% 0.00% 0.00% 0.00% 2.30% 2.30%

随着副本数量的增加,主分片保持副本最新所需的时间(称为复制延迟)也会增加。这是因为段复制直接从主分片复制段文件到副本。

基准测试结果显示,随着副本数量的增加,错误率非零。错误率表明当副本无法跟上主分片时,段复制反压机制被触发。然而,段复制所带来的显著 CPU 和内存增益抵消了错误率。

后续步骤

  1. 跟踪段复制的未来增强功能
  2. 阅读这篇关于段复制的博客文章

相关文章