【腾讯云 TDSQL-C Serverless 产品测评】Serverless集群高可用测评
@TOC
一、前言
最近在CSDN
看到腾讯云的 TDSQL-C ServerLess Mysql
数据库体验活动,作为云原生的Serverless
数据库,还是很有兴趣的,看文档中TDSQL-C Serverless Mysql
提供了集群高可用的功能,我们通过实际测试来验证一下它的可靠性,具体如何测试,请看下文!
二、Serverless介绍
大家都知道,随着互联网技术的发展,应用架构模式也在不断演进。Serverless
作为一种新的架构模式,正在风靡IT界。
Serverless
的核心思想就是:开发者不再需要购买和管理服务器实例,也不需要根据流量变化来进行弹性扩容缩容。而是通过代码触发事件驱动计算,系统会自动弹性伸缩基于使用量付费的计算资源。
比如,开发者只需编写业务代码,将代码部署上云,然后就可以访应用了。应用启动和关闭,计算资源的调度,都是由底层平台完全来完成。开发者完全摆脱了对硬件和基础架构的管理。
这跟传统的有服务器架构形成鲜明对比。传统架构要求开发者购买服务器,部署软件,开启和关闭实例,手动进行弹性扩缩容等运维工作。耗费大量时间成本。
而Serverless
做到"无服务器",开发效率得到大幅提升。且只为真实产生的请求计费,可以显著节省IT项目成本。这也是它为什么这么火。
下面是 Serverless
的一些应用场景:
三、TDSQL-C Serverless Mysql介绍
随着Serverless
技术的不断成熟, TDSQL-C Serverless Mysql
就是一款完全Serverless
的数据库,它可以根据业务自行扩缩容,设计理念就是「无服务器」,由于他是Serverless
架构,所以它也继承了 Serverless
的所有优点
- 计算资源可以由系统自动弹性伸缩,开发者无需管理服务器;
- 数据存储使用分布式机制,自动进行数据分片与扩容;
- 集群高可用,即使节点异常也能保证读写通过快速切换
- ...等等
TDSQL-C ServerLess Mysql
的整个产品架构如下所示:
因为 TDSQL-C Serverless Mysql
数据库拥有Serverless
的众多特性,所以在很多领域都可以使用,类似于我们的自动伸缩业务,经常做活动,不希望晚上资源浪费等,以下常见常见都可以采用 TDSQL
四、集群可用性测试
我们采用3节点的TDSQL-C
集群,然后使用压测工具对写入节点进行高并发读写操作,期间会对只读节点进行移除和增加,也同时会对CCU的自动扩缩进行观察。本来是希望把节点部署到多个可用区域的,但是发现 Serverless
集群不支持多个可用区部署,也就是集群节点都在同一个区域,这个有可能是因为所有的节点都共享同一份数据的缘故。
4.1、集群搭建
环境说明:
- mysql8.0
- 3节点 1写2读
- serverless架构 集群版
直接购买下一步即可完成集群的搭建,非常方便,不需要我们像传统集群搭建,需要自己去配置网络以及协议等
进入集群详情页即可看到我们的集群情况,这里我们需要把读写实例和读写组的公网访问开启一下
写实例的开启的逻辑很简单,因为作为数据的唯一写入入口,必须得暴露出来给上层使用,为什么读节点只需要开只读组呢?只读组会将只读节点全部统一成一个入口,也就是查询只需走只读组的入口,不需要我们再去应用层设置负载均衡,TDSQL-C Serverless Mysql
会自动进行转发,读数据使用读写组即可进行数据访问,中间的负载器会自动进行性能负载
- 创建测试数据库
通过 DMC
进行数据库创建,DMC
是腾讯云为开发者提供的 Web
在线数据库管理平台,非常方便好用!
4.2、测试环境准备
这里我们主要以 Sysbench
为出发点,对节点异常测试,作为一款广泛使用的开源模块化的、跨平台、多线程基准测试工具,sysbench
主要用于评估计算机系统在不同负载条件下的性能表现。
- 安装
curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.deb.sh | sudo bash
sudo apt -y install sysbench
- 进行基础测试
sysbench --db-driver=mysql --mysql-host=gz-cynosdbmysql-grp-r3i3tnbl.sql.tencentcdb.com --mysql-port=25742 --mysql-user=root --mysql-password='a.' --mysql-db=abc --events=0 --table-size=50000 --tables=10 --threads=500 --time=300 --percentile=95 --report-interval=1 oltp_write_only prepare
这个命令是使用sysbench
工具执行OLTP(联机事务处理)的读写基准测试。解释如下:
--db-driver=mysql
: 指定使用MySQL数据库驱动程序。--mysql-host
: 指定MySQL数据库的主机名或IP地址。--mysql-port
: 指定MySQL数据库的端口号。--mysql-user
: 指定连接MySQL数据库所使用的用户名。--mysql-password
: 指定连接MySQL数据库所使用的密码。请将password
替换为实际的密码。--mysql-db=abc
: 指定要在MySQL数据库中使用的数据库名称。--table-size=50000
: 指定每个表的数据量大小,这里设置为50000。--tables=10
: 指定要创建的表的数量,这里设置为10。--threads=500
: 指定并发线程数,这里设置为500,表示将使用500个并发线程执行测试。--events=0
: 指定要执行的事件数量,这里设置为0,表示不限制事件数量。--time=300
: 指定测试运行的持续时间,这里设置为300秒(5分钟)。--percentile=95
: 指定报告中的百分位数,这里设置为95,表示将计算并报告第95百分位的响应时间。--report-interval=10
: 指定报告输出的时间间隔,这里设置为10秒,表示每秒输出一次测试结果。
我们执行后将使用500个线程在10个表上执行写入操作,每个表的大小为50000行数据,持续时间为300秒(5分钟)。测试结果将包括第95百分位的响应时间,并每10秒输出一次报告。
但是在开始执行的时候发现了一个错误,这里主要是最大连接数量太小了,我们去TDSQL
参数那里配置一下即可:
这里要注意,因为我们是3个节点,所以每个节点的最大连接数都需要修改,不能只修改读写节点的,修改完这个参数后,我们执行预测试命令
通过 DMC 我们可以看到它帮我们建立10个表,每个表中5w条数据
然后我们要进行集群可用性测试了,我们的流程是这样,两台安装了 sysbench 的服务器,一台进行写测试,一台进行读测试,然后我们将手动关闭掉一台读节点,观察集群稳定性,再次期间我们还会重新把移除的节点重新加入集群中,看看是否能正常负载
4.3、可用性监测
- 第一台 sysbench 服务器执行(要注意这个是可写的host)
sysbench --db-driver=mysql --mysql-host=gz-cynosdbmysql-grp-r3i3tnbl.sql.tencentcdb.com --mysql-port=25742 --mysql-user=root --mysql-password='a.' --mysql-db=abc --events=0 --table-size=50000 --tables=10 --threads=500 --time=300 --percentile=95 --report-interval=1 oltp_write_only run
- 第二台 sysbench 服务器执行(要注意这个是只读组的host和port)
sysbench --db-driver=mysql --mysql-host=gz-cynosdbmysql-grp-ne3hquxn.sql.tencentcdb.com --mysql-port=25741 --mysql-user=root --mysql-password='a.' --mysql-db=abc --events=0 --table-size=50000 --tables=10 --threads=500 --time=300 --percentile=95 --report-interval=1 oltp_read_only run
run 的时候可能还会出现这个错误:
我们也将可预编语句最大值修改一下 max_prepared_stmt_count
:
两个节点同时运行测试:
- 写测试
在这里插入图片描述
- 读测试
4.4、观察集群CCU扩缩情况
这里因为只读节点还没使用超过 0.5 的CCU,所以没有在进行自动扩缩,不过可以看出读写节点已经开始扩缩了
4.5、观察集群性能的负载均衡情况
- CPU:
- 内存
读方面的分流是比较均衡的,每个只读节点承受的压力都差不多4.6、观察移除1个只读节点负载情况在这里插入图片描述
因为没有办法直接销毁节点,所以这里我选择直接 重启,重启会断开这个实例的所有链接,我们就观察断开的那瞬间流量是否有j进行重新负载
这里因为没有销毁,所以我一直在重启,看的效果不是特别明显,但还是能看出大概
其中整个读测试 err
都是 0,整个服务没有受到一点影响
测试总结
最终根据测试结果显示,三个节点的CPU
和内存利用率都进入安全的可控范围内,性能的增加 CCU
也随之扩容,也体系了自动扩缩特点,当节点异常下线时,系统会自动切换到其他节点,读写依然持续正常;当节点增加时,系统也会自动将读节点进行负载,使得整个系统性能达到平衡。因为整个集群共享同一份数据,所以也未发生数据不一致情况。
总结
希望TDSQL-C Serverless Mysql
可以考虑让用户自己去选择增删只读节点,控制性更强,不过整体体验还是非常高效的!
通过本次测试,我们可以看到TDSQL-C Serverless
集群在高并发下的出色表现,即使节点发生故障也能保证服务高可用。它完全实现了无需DBA
的理想状态。此外,在使用 TDSQL-C Serverless Mysql
的过程中,我发现它除了高可用很牛逼外,还有很多其它的优点,例如:
- 性能出色,单节点支持数百万级
QPS
- 存储超大,支持
PB
级PB
海量数据量 - 功能兼容
MySQL
,无需修改源代码就可以轻松迁移 - 安全可靠
- 成本低,按实际使用流量收费,不消费不付费
总而言之,它可以完全释放了DBA
的管理成本,是业务系统一个很好的数据库选择方案,大家可以根据自己的业务情况酌情挑选。如大家对文章有疑问请随时指出,我将尽量解答。也欢迎大家一起来讨论 TDSQL-C Serverless Mysql
数据库。