本文通过ECS访问云数据库MongoDB,测试并分析了云数据库MongoDB副本集实例中链式复制对实例性能的影响,为MongoDB实例性能优化提供参考。
链式复制
什么是链式复制
MongoDB支持链式复制。当副本集中的某个从节点(Secondary节点)从另一个从节点同步数据时,就发生了链式复制。链式复制可以降低主节点(Primary节点)的负载,但可能会在不同的网络拓扑中导致更长的主从延迟。更多信息,请参见Self-Managed Chained Replication。
链式复制并不意味着所有节点必须形成单一的链条结构,而是Secondary 节点可根据网络往返时延(Round-Trip Time,RTT)等信息,选取Primary以外的节点作为同步源。以5节点副本集拓扑结构为例,下图中展示的网络拓扑结构均属于链式复制。
配置链式复制
您可以在控制台的参数设置页面调整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。
测试方法
添加白名单。登录ECS控制台,在实例详情页面的网络信息区域查看ECS实例的主私网IP,将ECS实例的主私网IP添加到云数据库MongoDB实例的白名单中。
使用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
:客户端的并发线程数。
查看ycsb的测试结果以及测试实例的监控信息。在监控信息页面的节点监控页签下,选择本次测试对应的时间段,查看实例主节点的CPU使用率、操作QPS数、平均响应时间指标。具体操作请参见节点监控(原基本监控)。
测试结果
参数说明
Write Concern:数据持久化保证级别,决定了写操作需要满足哪些条件后才被认为成功完成。测试结果中相关取值介绍如下。
{w:"majority"}
:默认配置,表示大多数(majority),等待写操作被复制到副本集中大多数节点上后才确认完成。{w: 1}
:表示只需要Primary节点确认完成。
测试结果详情
副本集拓扑结构:1个主节点、1个从节点、1个隐藏节点。
对比项 | 启用链式复制 | 禁用链式复制 |
吞吐量throughput(ops) | 5277 | 5241 |
CPU使用率 | 65% | 65% |
操作QPS数(个) | ||
平均响应时间RT(微秒) |
对比项 | 启用链式复制 | 禁用链式复制 |
吞吐量throughput(ops) | 15075 | 14785 |
CPU使用率 | 93% | 93% |
操作QPS数(个) | ||
平均响应时间RT(微秒) |
副本集拓扑结构:1个主节点、5个从节点、1个隐藏节点。
对比项 | 启用链式复制 | 禁用链式复制 |
吞吐量throughput(ops) | 3005 | 4312 |
CPU使用率 | 56% | 85% |
操作QPS数(个) | ||
平均响应时间RT(微秒) |
对比项 | 启用链式复制 | 禁用链式复制 |
吞吐量throughput(ops) | 14414 | 11492 |
CPU使用率 | 91% | 93% |
操作QPS数(个) | ||
平均响应时间RT(微秒) |
副本集拓扑结构:1个主节点、5个从节点、1个隐藏节点、8个只读节点。
包括7个投票节点和8个非投票节点(只读节点不参与投票)。
对比项 | 启用链式复制 | 禁用链式复制 |
吞吐量throughput(ops) | 2932 | 3123 |
CPU使用率 | 58% | 91% |
操作QPS数(个) | ||
平均响应时间RT(微秒) |
对比项 | 启用链式复制 | 禁用链式复制 |
吞吐量throughput(ops) | 14093 | 7500 |
CPU使用率 | 90% | 94% |
操作QPS数(个) | ||
平均响应时间RT(微秒) |
性能对比及总结
性能对比图中以“true_majority”为例,代表启用链式复制,且writeConcern配置为{w:"majority"}
。
相同的节点数配置下,禁用链式复制是否会导致写入性能下降,取决于writeConcern的配置。
writeConcern为{w:1}writeConcern为{w:"majority"}3节点实例,禁用链式复制带来的性能退化基本可以忽略不计。
7节点实例,禁用链式复制带来的性能退化约为20.3%。
15节点实例,禁用链式复制带来的性能退化达到了46.8%,而且可以明显观察到禁用链式复制后主节点上CPU利用率的提升。
3节点实例,禁用链式复制带来的性能退化基本可以忽略不计。
7节点和15节点实例,禁用链式复制反而可以带来大约6.5%~43.5%的性能提升。
性能提升原因:禁用链式复制后,副本集内所有节点整体同步链路缩短,导致majority的条件更容易被满足,单次写入的延迟有所缩短。
非投票节点数的影响:随着非投票节点的数量增加(投票节点固定7个),禁用链式复制带来的性能提升会越来越不明显,这是由于主节点上承载的主从同步负载太高导致的。
相同的chainingAllowed以及writeConcern配置下,写入性能随着节点数增加而下降。而且禁用链式复制后,写入性能随着节点数增加下降趋势更加显著。
默认配置下(
chainingAllowed:true+writeConcern:{w:"majority"}
),由于副本集只能包含不超过7个投票节点,满足majority的条件并没有变化,因此将节点数从7个扩展到15个时,写入性能退化并不明显。无论是否禁用链式复制,
writeConcern:{w:1}
性能都要明显优于writeConcern:{w:"majority"}
,符合writeConcern设计。writeConcern配置固定时,随着节点数增加,禁用链式复制相比启用链式复制会显著提高主节点的CPU利用率。
按配置分组按节点数分组
最佳实践
节点数少时,您可以按需启用或禁用链式复制。实例整体性能基本不会受到影响,CPU利用率差异不大。
节点数多时:
writeConcern为
{w:1}
,建议启用链式复制。writeConcern为
{w: "majority" }
,需要在主节点负载(CPU利用率等)和实例性能之间做进一步的取舍。禁用链式复制有助于提升写入性能,但相应的主节点负载也会显著增加。
- 本页导读 (1)
- 链式复制
- 什么是链式复制
- 配置链式复制
- 实例性能影响测试
- 测试环境
- 测试工具
- 测试方法
- 测试结果
- 最佳实践