最近在CSDN看到腾讯云的 TDSQL-C ServerLess Mysql 数据库体验活动,作为云原生的Serverless数据库,还是很有兴趣的,看文档中TDSQL-C Serverless Mysql提供了集群高可用的功能,我们通过实际测试来验证一下它的可靠性,具体如何测试,请看下文!
大家都知道,随着互联网技术的发展,应用架构模式也在不断演进。Serverless作为一种新的架构模式,正在风靡IT界。
Serverless的核心思想就是:开发者不再需要购买和管理服务器实例,也不需要根据流量变化来进行弹性扩容缩容。而是通过代码触发事件驱动计算,系统会自动弹性伸缩基于使用量付费的计算资源。
比如,开发者只需编写业务代码,将代码部署上云,然后就可以访应用了。应用启动和关闭,计算资源的调度,都是由底层平台完全来完成。开发者完全摆脱了对硬件和基础架构的管理。
这跟传统的有服务器架构形成鲜明对比。传统架构要求开发者购买服务器,部署软件,开启和关闭实例,手动进行弹性扩缩容等运维工作。耗费大量时间成本。
而Serverless做到"无服务器",开发效率得到大幅提升。且只为真实产生的请求计费,可以显著节省IT项目成本。这也是它为什么这么火。
下面是 Serverless 的一些应用场景:
随着Serverless技术的不断成熟, TDSQL-C Serverless Mysql 就是一款完全Serverless的数据库,它可以根据业务自行扩缩容,设计理念就是「无服务器」,由于他是Serverless架构,所以它也继承了 Serverless的所有优点
TDSQL-C ServerLess Mysql 的整个产品架构如下所示:
因为 TDSQL-C Serverless Mysql 数据库拥有Serverless的众多特性,所以在很多领域都可以使用,类似于我们的自动伸缩业务,经常做活动,不希望晚上资源浪费等,以下常见常见都可以采用 TDSQL
我们采用3节点的TDSQL-C集群,然后使用压测工具对写入节点进行高并发读写操作,期间会对只读节点进行移除和增加,也同时会对CCU的自动扩缩进行观察。本来是希望把节点部署到多个可用区域的,但是发现 Serverless 集群不支持多个可用区部署,也就是集群节点都在同一个区域,这个有可能是因为所有的节点都共享同一份数据的缘故。
环境说明:
直接购买下一步即可完成集群的搭建,非常方便,不需要我们像传统集群搭建,需要自己去配置网络以及协议等
进入集群详情页即可看到我们的集群情况,这里我们需要把读写实例和读写组的公网访问开启一下
写实例的开启的逻辑很简单,因为作为数据的唯一写入入口,必须得暴露出来给上层使用,为什么读节点只需要开只读组呢?只读组会将只读节点全部统一成一个入口,也就是查询只需走只读组的入口,不需要我们再去应用层设置负载均衡,TDSQL-C Serverless Mysql 会自动进行转发,读数据使用读写组即可进行数据访问,中间的负载器会自动进行性能负载
通过 DMC 进行数据库创建,DMC 是腾讯云为开发者提供的 Web 在线数据库管理平台,非常方便好用!
这里我们主要以 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(联机事务处理)的读写基准测试。解释如下:
我们执行后将使用500个线程在10个表上执行写入操作,每个表的大小为50000行数据,持续时间为300秒(5分钟)。测试结果将包括第95百分位的响应时间,并每10秒输出一次报告。
但是在开始执行的时候发现了一个错误,这里主要是最大连接数量太小了,我们去TDSQL参数那里配置一下即可:
这里要注意,因为我们是3个节点,所以每个节点的最大连接数都需要修改,不能只修改读写节点的,修改完这个参数后,我们执行预测试命令
通过 DMC 我们可以看到它帮我们建立10个表,每个表中5w条数据
然后我们要进行集群可用性测试了,我们的流程是这样,两台安装了 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 run
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:
两个节点同时运行测试:
这里因为只读节点还没使用超过 0.5 的CCU,所以没有在进行自动扩缩,不过可以看出读写节点已经开始扩缩了
可以看出,集群在读方面的分流是比较均衡的,每个只读节点承受的压力都差不多
因为没有办法直接销毁节点,所以这里我选择直接 重启,重启会断开这个实例的所有链接,我们就观察断开的那瞬间流量是否有j进行重新负载
这里因为没有销毁,所以我一直在重启,看的效果不是特别明显,但还是能看出大概
其中整个读测试 err 都是 0,整个服务没有受到一点影响
最终根据测试结果显示,三个节点的CPU和内存利用率都进入安全的可控范围内,性能的增加 CCU 也随之扩容,也体系了自动扩缩特点,当节点异常下线时,系统会自动切换到其他节点,读写依然持续正常;当节点增加时,系统也会自动将读节点进行负载,使得整个系统性能达到平衡。因为整个集群共享同一份数据,所以也未发生数据不一致情况。
希望TDSQL-C Serverless Mysql 可以考虑让用户自己去选择增删只读节点,控制性更强,不过整体体验还是非常高效的!
通过本次测试,我们可以看到TDSQL-C Serverless集群在高并发下的出色表现,即使节点发生故障也能保证服务高可用。它完全实现了无需DBA的理想状态。此外,在使用 TDSQL-C Serverless Mysql 的过程中,我发现它除了高可用很牛逼外,还有很多其它的优点,例如:
总而言之,它可以完全释放了DBA的管理成本,是业务系统一个很好的数据库选择方案,大家可以根据自己的业务情况酌情挑选。如大家对文章有疑问请随时指出,我将尽量解答。也欢迎大家一起来讨论 TDSQL-C Serverless Mysql 数据库。