段复制
段复制涉及在分片之间复制段文件,而不是在每个分片副本上索引文档。这种方法提高了索引吞吐量并减少了资源利用,但增加了网络利用率。段复制是旨在解耦读写以降低计算成本的一系列功能中的第一个。
当主分片在刷新时向副本分片发送检查点时,副本分片上会触发新的段复制事件。这发生在:
- 当集群中添加新的副本分片时。
- 当主分片刷新时段文件发生更改时。
- 在对等恢复期间,例如副本分片恢复和分片重定位(使用
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
。有关更多信息,请参阅集群设置。
为获得最佳性能,建议您启用以下设置:
- 分段复制背压
- 平衡主分片分配,使用以下命令:
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"
}
}
}
注意事项
使用段复制时,请考虑以下事项:
- 为现有索引启用段复制需要重新索引。
- 跨集群复制目前不使用段复制在集群之间进行复制。
- 段复制导致使用节点到节点复制的主分片网络拥塞增加,因为副本分片从主分片获取更新。使用远程备份存储时,主分片可以将段上传到远程备份存储,副本可以从远程备份存储获取更新。这有助于将主分片的职责分担到远程备份存储。
- 读写一致性保证:段复制目前不支持将刷新策略设置为
wait_for
或true
。如果您将refresh
查询参数设置为wait_for
或true
然后摄入文档,您只会在主节点刷新并使这些文档可搜索后才获得响应。副本分片只会在写入其本地事务日志后才响应。如果需要实时读取,请考虑使用get
或mget
API 操作。 - 从 OpenSearch 2.10 开始,系统索引支持段复制。
- Get、MultiGet、TermVector 和 MultiTermVector 请求通过将请求路由到主分片来提供强一致性读取。与在主分片和副本分片之间分配请求相比,将更多请求路由到主分片可能会降低性能。为了提高读密集型集群的性能,我们建议将这些请求中的
realtime
参数设置为false
。更多信息请参见问题 #8700。
基准测试
在初始基准测试中,段复制用户报告在相同的集群设置下,其吞吐量比使用文档复制时高出 40%。
以下基准测试是使用 OpenSearch-benchmark 并利用 stackoverflow
和 nyc_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 和内存增益抵消了错误率。
后续步骤
- 跟踪段复制的未来增强功能。
- 阅读这篇关于段复制的博客文章。