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

本文通过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云盘架构实例

地域及可用区

华北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节点

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

writeConcern{w:"majority"}

对比项

启用链式复制

禁用链式复制

吞吐量throughput(ops)

5277

5241

CPU使用率

65%

65%

操作QPS数(个)

image.png

image.png

平均响应时间RT(微秒)

image.png

image.png

writeConcern{w:1}

对比项

启用链式复制

禁用链式复制

吞吐量throughput(ops)

15075

14785

CPU使用率

93%

93%

操作QPS数(个)

image.png

image.png

平均响应时间RT(微秒)

image.png

image.png

7节点

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

writeConcern{w:"majority"}

对比项

启用链式复制

禁用链式复制

吞吐量throughput(ops)

3005

4312

CPU使用率

56%

85%

操作QPS数(个)

image.png

image.png

平均响应时间RT(微秒)

image.png

image.png

writeConcern{w:1}

对比项

启用链式复制

禁用链式复制

吞吐量throughput(ops)

14414

11492

CPU使用率

91%

93%

操作QPS数(个)

image.png

image.png

平均响应时间RT(微秒)

image.png

image.png

15节点

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

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

writeConcern{w:"majority"}

对比项

启用链式复制

禁用链式复制

吞吐量throughput(ops)

2932

3123

CPU使用率

58%

91%

操作QPS数(个)

image.png

image.png

平均响应时间RT(微秒)

image.png

image.png

writeConcern{w:1}

对比项

启用链式复制

禁用链式复制

吞吐量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}

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

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

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

    image.png

    writeConcern{w:"majority"}

    • 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使用率等)和实例性能之间做进一步的取舍。禁用链式复制有助于提升写入性能,但相应的主节点负载也会显著增加。