链式复制对实例性能影响测试

更新时间:2025-03-26 07:35:09

本文通过ECS访问云数据库MongoDB,测试并分析了云数据库MongoDB副本集实例中链式复制对实例性能的影响,为MongoDB实例性能优化提供参考。

链式复制

什么是链式复制

MongoDB支持链式复制。当副本集中的某个从节点(Secondary节点)从另一个从节点同步数据时,就发生了链式复制。链式复制可以降低主节点(Primary节点)的负载,但可能会在不同的网络拓扑中导致更长的主从延迟。更多信息,请参见Self-Managed Chained Replication

链式复制并不意味着所有节点必须形成单一的链条结构,而是Secondary 节点可根据网络往返时延(Round-Trip Time,RTT)等信息,选取Primary以外的节点作为同步源。以5节点副本集拓扑结构为例,下图中展示的网络拓扑结构均属于链式复制。

image

配置链式复制

您可以在控制台的参数设置页面调整settings.chainingAllowed 参数,以启用或禁用链式复制。如何调整参数,请参见设置数据库参数

在某些情况下,链式复制可能会导致主从同步延迟,您可以禁用链式复制以优化同步性能。

说明

出于安全性考虑,您并没有对阿里云MongoDB实例执行replSetReconfig命令的相关权限,请通过控制台调整相关参数。

实例性能影响测试

测试环境

创建ECS实例和云数据库 MongoDB 版副本集实例。如何创建,请参见创建副本集实例通过控制台使用ECS实例(快捷版)

  • 云数据库 MongoDB 版实例架构:标准副本集拓扑结构(三节点,包含一个主节点、一个从节点和一个隐藏节点),并通过添加从节点和只读节点扩展副本集节点数。

  • ECS实例和MongoDB实例间的网络往返时延:测试实例在同一地域及可用区下,RTT(Round-Trip Time)平均值为0.103ms。

本次测试的实例配置如下:

配置项

ECS实例

云数据库MongoDB云盘架构实例

配置项

ECS实例

云数据库MongoDB云盘架构实例

地域及可用区

华北2(北京)可用区H

华北2(北京)可用区H

网络类型

专有网络VPC

专有网络VPC

实例规格族

计算型c6

独享型

实例规格

ecs.c6.xlarge(4c8g)

ecs.c7.xlarge(4c8g)

存储类型

ESSD PL0

ESSD PL1

实例或镜像版本

Alibaba Cloud Linux 3.2104 LTS 64

4.19.91-26.al7.x86_64

MongoDB内核版本

不涉及

大版本:5.0

小版本基准版本:5.0.30

测试工具

本次压力测试将采用开源社区的YCSB 0.17.0压测工具。

说明

YCSB是一款用Java编写的支持多种数据库的性能测试工具,具体安装和使用方法请参见YCSB

测试方法

  1. 添加白名单。登录ECS控制台,在实例详情页面的网络信息区域查看ECS实例的主私网IP,将ECS实例的主私网IP添加到云数据库MongoDB实例的白名单中。

  2. 连接ECS实例

  3. 使用YCSB工具进行加载数据测试。

    ./bin/ycsb.sh load mongodb -s -p workload=site.ycsb.workloads.CoreWorkload -p recordcount=5000000 -p mongodb.url="mongodb://test:****@dds-bp13e84d11****.mongodb.rds.aliyuncs.com:3717/admin" -p table=test -threads 8

    参数说明:

    • recordcount:加载至云数据库 MongoDB 版实例的数据总数。

    • mongodb.url:云数据库 MongoDB 版实例的连接地址。本文使用的数据库账号为test,所属数据库为admin。您可以登录云数据库MongoDB控制台,在数据库连接页面的私网连接 - 专有网络区域查看连接地址。

    • threads:客户端的并发线程数。

  4. 查看ycsb的测试结果以及测试实例的监控信息。在监控信息页面的节点监控页签下,选择本次测试对应的时间段,查看实例主节点的CPU使用率操作QPS数、平均响应时间指标。具体操作请参见节点监控(原基本监控)

测试结果

参数说明

Write Concern:数据持久化保证级别,决定了写操作需要满足哪些条件后才被认为成功完成。测试结果中相关取值介绍如下。

  • {w:"majority"}:默认配置,表示大多数(majority),等待写操作被复制到副本集中大多数节点上后才确认完成。

  • {w: 1}:表示只需要Primary节点确认完成。

测试结果详情

3节点
7节点
15节点

副本集拓扑结构:1个主节点、1个从节点、1个隐藏节点。

writeConcern为{w:"majority"}
writeConcern为{w:1}

对比项

启用链式复制

禁用链式复制

吞吐量throughput(ops)

5277

5241

CPU使用率

65%

65%

操作QPS数(个)

image.png

image.png

平均响应时间RT(微秒)

image.png

image.png

对比项

启用链式复制

禁用链式复制

吞吐量throughput(ops)

15075

14785

CPU使用率

93%

93%

操作QPS数(个)

image.png

image.png

平均响应时间RT(微秒)

image.png

image.png

副本集拓扑结构:1个主节点、5个从节点、1个隐藏节点。

writeConcern为{w:"majority"}
writeConcern为{w:1}

对比项

启用链式复制

禁用链式复制

吞吐量throughput(ops)

3005

4312

CPU使用率

56%

85%

操作QPS数(个)

image.png

image.png

平均响应时间RT(微秒)

image.png

image.png

对比项

启用链式复制

禁用链式复制

吞吐量throughput(ops)

14414

11492

CPU使用率

91%

93%

操作QPS数(个)

image.png

image.png

平均响应时间RT(微秒)

image.png

image.png

副本集拓扑结构:1个主节点、5个从节点、1个隐藏节点、8个只读节点。

包括7个投票节点和8个非投票节点(只读节点不参与投票)。

writeConcern为{w:"majority"}
writeConcern为{w:1}

对比项

启用链式复制

禁用链式复制

吞吐量throughput(ops)

2932

3123

CPU使用率

58%

91%

操作QPS数(个)

image.png

image.png

平均响应时间RT(微秒)

image.png

image.png

对比项

启用链式复制

禁用链式复制

吞吐量throughput(ops)

14093

7500

CPU使用率

90%

94%

操作QPS数(个)

image.png

image.png

平均响应时间RT(微秒)

image.png

image.png

性能对比及总结

性能对比图中以“true_majority”为例,代表启用链式复制,且writeConcern配置为{w:"majority"}

  • 相同的节点数配置下,禁用链式复制是否会导致写入性能下降,取决于writeConcern的配置。

    writeConcern为{w:1}
    writeConcern为{w:"majority"}
    • 3节点实例,禁用链式复制带来的性能退化基本可以忽略不计。

    • 7节点实例,禁用链式复制带来的性能退化约为20.3%

    • 15节点实例,禁用链式复制带来的性能退化达到了46.8%,而且可以明显观察到禁用链式复制后主节点上CPU利用率的提升

    image.png

    • 3节点实例,禁用链式复制带来的性能退化基本可以忽略不计。

    • 7节点和15节点实例,禁用链式复制反而可以带来大约6.5%~43.5%的性能提升。

      性能提升原因:禁用链式复制后,副本集内所有节点整体同步链路缩短,导致majority的条件更容易被满足,单次写入的延迟有所缩短。

      非投票节点数的影响:随着非投票节点的数量增加(投票节点固定7个),禁用链式复制带来的性能提升会越来越不明显,这是由于主节点上承载的主从同步负载太高导致的。

    image.png

  • 相同的chainingAllowed以及writeConcern配置下,写入性能随着节点数增加而下降。而且禁用链式复制后,写入性能随着节点数增加下降趋势更加显著。

    • 默认配置下(chainingAllowed:true+writeConcern:{w:"majority"}),由于副本集只能包含不超过7个投票节点,满足majority的条件并没有变化,因此将节点数从7个扩展到15个时,写入性能退化并不明显。

    • 无论是否禁用链式复制,writeConcern:{w:1}性能都要明显优于writeConcern:{w:"majority"},符合writeConcern设计。

    • writeConcern配置固定时,随着节点数增加,禁用链式复制相比启用链式复制会显著提高主节点的CPU利用率。

    按配置分组
    按节点数分组

    image.png

    image.png

最佳实践

  • 节点数少时,您可以按需启用或禁用链式复制。实例整体性能基本不会受到影响,CPU利用率差异不大。

  • 节点数多时:

    • writeConcern{w:1},建议启用链式复制。

    • writeConcern{w: "majority" },需要在主节点负载(CPU利用率等)和实例性能之间做进一步的取舍。禁用链式复制有助于提升写入性能,但相应的主节点负载也会显著增加。

  • 本页导读 (1)
  • 链式复制
  • 什么是链式复制
  • 配置链式复制
  • 实例性能影响测试
  • 测试环境
  • 测试工具
  • 测试方法
  • 测试结果
  • 最佳实践