一直都在非常深度调研、关注和使用云数据库,其中性能是关注的重点之一。一方面性能是最终成本的重要影响因素,更好的性能,通常意味着使用更少的资源支撑更高的业务量,从而降低整体成本。另外,性能还意味着在极端场景下,数据库的上限支撑能力。
所以,近期对各个云数据库厂商做了一个较为系统的性能对比,供开发者和企业在云数据库选型时的参考。
在进行大量测试之后,对主要的云厂商分别选择了一个“企业级规格”(适合生产环境配置的)进行了对比。先看性能对比如下图:
可以看到:
下图是对应的平均延迟趋势图:
“企业级规格”的定义
为了方便跨云对比,笔者根据常见的企业核心数据库配置,在每朵云的RDS的中选择了一个适合的规格作为对比代表,并将该规格称之为“企业级规格”。在众多配置选项中,“企业级规格”需满足如下条件:
华为云的规格选择与配置都很简洁。主要支持通用型、鲲鹏增强型、独享型实例。我们看看这三种规格的性能情况。
在前面,“企业级规格”对比中,选择了企业级用更为常用的“独享型”。该规格也在全部“企业级规格”的对比中,表现出了最强的性能。在高并发的情况下,性能高出了其他云数据库厂商约30%~100%。
华为云通用规格通过更多的资源共享,可以获得更好的性能,但是也因为共享的原因,性能会有时候不稳定。在这里的测试中,如果使用通用型规格,在高并发时,用户又可以获得约15%~20%的性能。
鲲鹏增强型,使用的是华为自研的鲲鹏芯片(基于ARM)。该芯片的自主化率是非常高的,在国产化芯片中,属于佼佼者。但,也因为复杂的环境和技术的差异,相比Intel的x86有着约20%~30%的性能退化。考虑到鲲鹏芯片在国产芯片中的地位,在国产化场景中,采用该规格是非常不错的选择。
在前面的整体对比中看到,百度智能云RDS的“企业级规格”在中高并发时,表现出了非常强的性能,位居榜眼。百度云RDS的选项也比较简单,性能相关主要是“异步/半同步复制”、“高性能/默认参数模板”。其中,“异步/半同步复制”与阿里云、腾讯云等类似,这里不再赘述。
“高性能/默认参数模板”的配置各个云厂商略有一些不同,在笔者测试时,百度云RDS对应的部分参数如下:
在实际测试中,我们也看到,不同参数模板对于性能有一些影响,但是并不明显。具体性能如下:
再来单独对比一下“默认参数模板”和“高性能参数模板”的性能情况。从如下两幅对比图中,则可以更加清晰的看到,无论是半同步还是异步模式下,这两类参数模板都并没有表现出太大的性能差别。
腾讯云在购买时,与阿里云类似,也提供了比较丰富的选项供用户选择。用户可以在数据库可靠性与性能、性能稳定性与性能峰值之间进行平衡的选择。这些选项分别是“通用/独享”、“异步/半同步复制”、“高性能/高稳定性参数模板”。其中“通用/独享”选项与阿里云相同,这里不再赘述。
“异步/半同步复制”配置的是主备复制时的同步策略,异步则意味着主备可能存在一定的延迟,不过根据经验来看这个延迟一般是毫秒级别的,有时候甚至更低。“半同步”同步复制下,主库需要再备库接受完日志后,才完成日志的提交,数据可靠性有更好的保障。
“高性能/高稳定性参数模板”的区别在于MySQL / InnoDB的一些与日志相关的参数的配置。其中“高稳定”在数据可靠性上,有着更严格的配置,例如sync_binlog=1
、innodb_flush_log_at_trx_commit=1
。而“高性能”参数模板,以上两个参数分别为1000和2,是在数据的可靠性上做了适当的让步,以换取更好的性能。
以上,三组选择的组合,一共有如下八个类型的实例,测试的性能表现如下:
可以看到:
首先,通用型实例因为能够获得额外的共享的CPU资源,表现出了普遍的更高的性能,在较高的并发压力之下,高出约100~200%。异步与半同步复制的实例的性能相差也非常明显,有更强可靠性的“半同步复制”性能要低20%~35%之间。
在这一次的测试中,腾讯云的独享实例,也表现出了一些异常情况。高稳定和高性能这两个参数模板之间,在独享实例测试组中,这两组模板的性能表现与其名称表现得并不同。在独享实例的测试中,高稳定的参数模板在高并发的时候,都表现出了更高的性能。即“独享-异步-高稳定” > “独享-异步-高性能” 以及 “独享-半同步-高稳定” > “独享-半同步-高性能”。这一点与预期得是非常不同的。
阿里云RDS提供了非常丰富的选项,给了开发者更大的选择空间,让开发者可以在性能的稳定性、数据可靠性、性能高低之间做更多的平衡与选择。另外,新推出的“经济型”(之前的ARM规格)实例又给了开发者更高性价比的RDS方案。但,另一方面,也让容易让开发者非常困惑,难以选择。
这里我们来看看这些规格、选项对性能的影响情况:(注:各种类型的架构与区别可以参考之前的文章:一张图读懂阿里云数据库RDS架构与选型)
阿里云提供了通用/独享、经济/标准、高性能/默认参数模板等选项,一共有八种如上的组合。“通用/独享”代表了资源的共享程度;经济/标准则代表不同的CPU类型(ARM vs x86);高性能/默认参数模板则是代表数据可靠性的严格程度。更多详细说明可以参考:一张图读懂阿里云数据库RDS架构与选型。
整体上,通用规格,凭借其更多的CPU资源共享,整体表现出了更强劲的性能。一般的,通用规格性能比独享规格的性能的要高50%~150%。所以,当使用通用规格遇到了性能波动的问题的时候,如果升级到独享规格,则需要注意,即使是看似同样大小的规格的实例,性能可能会相差很多。这就是需要获得更稳定性能的代价,下图可以更加清晰的诠释这一点:
阿里云的数据库选项中,还可以选择标准型、经济型。关于经济版是如何“经济的”,目前阿里云并没有太多阐述。不过,比较确定的是,经济版并不是简单仅包含ARM实例(参考)。经济版本,尝试通过更低的价格提供更强的计算能力,付出的代价是什么,并没有太多详细的阐述,可能会包括更激烈的资源竞争等。关于标准版和经济版的详细的对比可以参考:阿里云RDS标准版(x86) vs 经济版(ARM)性能对比。
在阿里云实例的购买过程中,还有一个参数模板的选项。共有三组:“默认参数模板”、“异步参数模板”、“高性能参数模板”(参考)。向用户提供了可靠性与性能的平衡选择。数据可靠性上:“默认参数模板” > “异步参数模板” > “高性能参数模板”,性能则是反过来的:
Amazon RDS提供了m6i(第三代Intel Xeon/Ice Lake实例)、m5(Xeon® Platinum 8175M or 8259CL)、Graviton 2(即m6g)、Graviton 3(即m7g)这四种架构选择,在性能上也有着较为直接的对应关系。
整体上,中、低并发时,m6g实例(Graviton2,第二代自研ARM芯片实例)性能略微差一些。其他三个规格性能较为接近。在高并发,尤其是超高并发时,m7g实例(Graviton3,第三代自研ARM芯片实例)表现出了更强大扩展性,性能相比于m6g高出约45%左右。
非常明显的,无论是x86还是ARM(Graviton),新一代的实例总是有着更好的性能表现,并且通常新、旧实例价格是差不多的,有时候新一代价格还会更加便宜。所以,选择新一代实例总是可以获得更好的性价比。即m7g几乎全面优于m6g,x6i全面优于m5。虽然这似乎是一个“平凡”的结论,但这里依旧通过benchmark的方式确定了这一点。
此外,从当前的测试来看,在RDS的场景下,依旧是x86规格(对比Graviton/ARM)更加合适。无论是性能还是折算后的性价比,Intel x86规格都是更好的选择,对应的,也就是db.m6i
规格是当前Amazon RDS最具性价比的规格。
另外,也注意到,Amazon RDS在前面的“企业级规格”性能对比中,表现的并不算好。尤其是在低并发时,几乎是性能垫底的,这与其在是云计算老大的地位似乎是不符合的。这背后的原因,后续还将再做更多解析。
谷歌云提供的RDS(在Google云叫Cloud SQL)选项比较简单,主要的选项中,仅有“Enterprise”版和“Enterprise Plus”版,这两个版本最主要的区别是“Plus”版提供了额外的“Data Cache能力”,该能力通过本地的SSD可以加速数据库更多的“冷”数据访问,关于这两个版本的详细说明可以参考之前的文章:Google Cloud SQL for MySQL的”Enterprise”和”Enterprise Plus”版本。根据这篇文章的对比,也注意到Plus的价格也要高出30%左右。这里,我们来看看他们的性能差别。
需要特别提到的是,Enterprise的测试使用的4vCPU16GB的规格,与其他云的测试规格是一致的。但,因为“Enterprise Plus”没有该规格的,于是使用了最为接近的4vCPU32GB规格替代。因为这里的测试,主要瓶颈在于CPU和IO,内存增加的对于性能的影响是有限的。
详细的性能对比参考下图。
可以看到,在低并发时,普通的Enterprise版本性能反而更好。只有在中、高并发时(并发高于24),Enterprise Plus版本才表现更好的性能,最后,在64并发以上的时候,Enterprise Plus性能相比与Enterprise版本,要高出约75%以上。
微软的MySQL托管服务完整名称叫:“Azure Database for MySQL flexible server”,至于为什么叫“Flexible Server”,可以以参考:Azure数据库的Flexible Server。
微软的Azure云发展要略微晚一些,不过势头是非常猛的,算是后来居上。在最新的Gartner云魔力象限中,凭借其在AI领域的投资与布局,大有全面赶超AWS的趋势。这次,我们也一起来看看Azure托管MySQL的性能如何。
Azure云上购买托管MySQL的选项(与数据库有关的)应该是比较简单的。主要的选型包括,是否需要可用区容灾、IOPS类型选择、Intel还是AMD平台。在本次测试中,选择了US East地区,选择了跨可用区的容灾(Zone redundant),使用预留的IOPS,预留值为3000,使用的Intel的CPU,实例规格为4vCPU16GB内存。规格代码为D4ds_v4
。详细的测试性能趋势图如下:
注意到,不同的云厂商性能差异是非常大的。例如,在最前面的性能对比图中可以看到,华为云的“企业级规格”性能相当于阿里云或谷歌云的两倍。那么,当考虑数据库在华为云和阿里云之间迁移的时候,则需要结合数据库的业务支撑能力与成本进行综合评估,再开始做迁移规划。
在考虑迁移到阿里云时,除了考虑“企业级规格”的性能外,阿里云还提供了非常丰富的实例类型选择。开发者和企业可以根据不同的业务类型,可以考虑在数据可靠性上做极其轻微的让步,以获得数倍的性能提升。
每个云数据库厂商都有着不同的版本和定制参数,对于企业来说,比较常用的规格类型包含如下共同点:
当然,不同云厂商使用的系统架构、数据库版本、安装参数等各有不同,并没有一个统一的标准。这里挑选的规格类型与参数也是较多企业的选择的版本,所以,这个测试依旧有着非常强的参加价值。
这里使用了sysbench的读写混合模型(oltp_read_write)进行测试,单表大小为100万,共十个表,单次测试时长为300秒,分别测试了如下的并发度的性能表现:2、4、8、16、24、32、48、64、96、128。
sysbench oltp_read_write --threads=$conthread --time=$run_time \
--report-interval=3 --percentile=95 --histogram=on \
--table_size=$table_size --tables=$tables run
本节对在测试过程中的一些限制进行补充说明,供参考。
虽然,有这些限制,但是笔者依旧认为,非常明显的,这些测试的数据依旧可以给与开发者/企业在做数据库选型时以非常重要的参考。如果有更多建议,可以在本文后留下你的建议,以供后续参考与改进。
参考文档: