“腾讯云 TDSQL-C 产品测评活动”是由腾讯云联合 CSDN 推出的针对数据库产品测评及产品体验活动,本次活动主要面向 TDSQL-C Serverless版。
本次参与活动可以涵盖不同技术层面的用户,可以针对TDSQL-C产品的自动弹性能力、自动启停能力、兼容性、安全、并发、可靠性等多方面进行产品的体验和测评,参与活动的同时既可以收获相关技术领域的实战经验同时也可获得丰厚的活动激励。
一、前言:
本人接触并从事互联网开发工作有近7年了,从最开始的PHP和Swoole,到后面逐渐接触到的语言,如java、go、python、Node等,一直是与数据库(如:Mysql、MariaDB、PostgreSQL)进行打交道,从事的行业最多的是与电商项目系统开发。
如上是公司从0到1电商系统的迭代演进过程,在考量自身的业务特性,以及所拥有或可调配的资源。只有明确了这些之后才能适度设计合适的架构,以确保可以为应用提供稳定的服务。从单机架构、动静分离架构、应用与数据分离架构、数据库主从架构、负载均衡架构都会大量使用到MySQL,无论是多复杂的架构,基本都会用到MySQL。
在一定程序上,SQL相关的知识储备和运用、优化,是衡量一个后端开发人员的重要指标。如果您现在还只是停留在CURD,只是觉得往数据库存点数据,修改、更新、删除一些数据。那可能需要更多学习一下SQL相关的知识、多接触一下更大、更广的场景。当然,这也是相对于某个阶段来讲,当然,本人也是在不断的保持学习,从而不断的总结与提升中。
最近通过CSDN的活动接触腾讯云的很多好用的产品,之前在工作中,一直是使用自搭数据库体系或者使用云数据库(如阿里云)进行系统开发,现在让我们来了解并动手实践腾讯云的TDSQL-C MySQL Serverless版本数据库。
二、TDSQL-C 简介:
因篇幅与精力有限,本文只对TDSQL-C MySQL Serverless版本数据库进行评测。
2.1 TDSQL-C 简介:
TDSQL是腾讯云企业级分布式数据库,旗下涵盖金融级分布式、云原生、分析型等多引擎融合的完整数据库产品体系,提供业界领先的金融级高可用、计算存储分离、数据仓库、企业级安全等能力,同时具备智能运维平台、Serverless版本等完善的产品服务体系。
云原生数据库 TDSQL-C(Cloud Native Database TDSQL-C)简称 TDSQL-C。TDSQL-C 是腾讯云自研的新一代高性能高可用的企业级分布式云数据库。融合了传统数据库、云计算与新硬件技术的优势,100%兼容 MySQL 和 PostgreSQL,实现超百万级QPS的高吞吐,128TB海量分布式智能存储,保障数据安全可靠。
TDSQL-C MySQL Serverless版(TDSQL-C for MySQL)是腾讯打造的一款分布式数据库产品,具备强一致高可用、全球部署架构、分布式水平扩展、高性能、企业级安全等特性,同时提供智能 DBA、自动化运营、监控告警等配套设施,为客户提供完整的分布式数据库解决方案。
上述,对TDSQL-C MySQL从大到小的层面进行了一些介绍,下面来做一个简单的总结,先对TDSQL-C MySQL有一个大致的了解。
三、参加评测活动:
有幸有机会进行了数据库评测活动,活动的要求是各种手段消耗数据库的性能、存储等。
3.1 采购TDSQL-C MySQL数据库:
打开(TDSQL-C)[ https://cloud.tencent.com/product/cynosdb]产品链接,在“实例形态”一定要选择Serverless的版本,非常关键,“算力配置”选择的范围是32-64。
购买完数据库实例后,需要够买“存储资源包”,选择10TB的存储量。
在TDSQL-C MySQL Serverless数据库实例中的选项卡“资源包”中,进行刚刚购买的“存储资源包”即可。
3.2 使用mysql2扩展 + PM2进行Node服务多个进程写入数据:
const mysql = require('mysql2/promise');
// 初始化数据库连接
let connection = null
async function initDb () {
connection = await mysql.createConnection({
host: 'gz-xxxxx.sql.tencentcdb.com', // TDSQL外网网址
user: 'root', // 数据库用户名
password: 'Mysql123..', // 数据库密码
database: 'test_db', // 数据库名称
port: 22395, // 数据库端口
});
}
async function Run () {
await initDb()
for (let i = 0; i < 99999; i++) {
let sql = "INSERT INTO `use` (name, age) VALUES (?, ?)";
connection.execute(sql, ['11111', 22]).then(result => {
console.log("插入数据成功,插入ID值为", result[0].insertId)
})
}
}
Run()
在服务器上运行脚本进行检测,以下为脚本插入数据成功的提示。
使用PM2开启5个进程使用Node服务异步插入10w条数据,先尝试一下效果。
从费用明细来看,效果不明显,存储也只写了50M左右的数据,要达到消耗的目的,明显远远不够。
修改脚本插入100w数据,脚本直接断掉,而且PM2开启多个进程经常会掉线。
3.3. 使用Gin + Gorm V2协程进行写入数据:
CREATE TABLE `use` (
`id` bigint(1) NOT NULL AUTO_INCREMENT,
`name` longtext,
`age` int,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
dns := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=%s&parseTime=True&loc=Local", "root", "Ddb123..", "gz-xxxxxxxxx.com:22395", "test_db", "utf8")
db, _ := gorm.Open(mysql.Open(dns), &gorm.Config{
Logger: logger.Default.LogMode(logger.Silent), # 关闭Sql在控制台显示日志
})
func insertDB(db *gorm.DB, text string) {
var users = []DataScores {
{ Name: "xxxx", Score: "11", },
{ Name: "xxxx", Score: "11", },
}
db.Create(&users)
}
上图,可以分析到,近40G的存储空间,存储的费用还是比较低,而且插入的数据还是较慢,但是多出一个CCU的结算清单,是一个算力相关的消耗参数。
首先分析一下,使用的表插入语句中,name我用了一个大段文本,这样的话,我插入的数据量就会比较大,否则在进行MySQL连接、网络传输中也会浪费掉一些性能。其中,也发现服务器的带宽流量也比较高,因为开的也是弹性带宽,也是需要费用的。
尝试再提升插入的效率方案,通过发现Gorm Create批量函数添加,还是存在效率问题,换成Exec方法,直接执行原生的SQL,发现效率增长了不少。
CREATE TABLE `tests` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`name1` longtext,
`name2` longtext,
`name3` longtext,
`name4` longtext,
`name5` longtext,
`name6` longtext,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4
func selectDb(db *gorm.DB) {
for {
result := db.Exec("INSERT INTO `tests` (`name1`, `name2`, `name3`, `name4`, `name5`, `name6`) VALUES ('大段文本', '大段文本', '大段文本', '大段文本', '大段文本', '大段文本')")
fmt.Println("插入name表成功", result.RowsAffected)
}
}
在TDSQL-C自带的DMC数据库管理控制台中,执行以下语句,模拟CPU消耗,看到等待超时,猜测可能的原因是连接进程数在等待,导致超时。
马上查看TDSQL-C实例中,在“参数设置”中,找到“max_connections”修改为100000。这里也比较方便,不用在mysql.conf或mysql.ini配置文件中去修改,再重启,都是支持热重载,不用停机重启,防止对生产上造成影响,同时,配置化也大大的简化专业运维能力,降低了门槛。
并且,我们通过设置Gorm DB的数据库的最大连接数,来提高插入脚本的效果。
dns := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=%s&parseTime=True&loc=Local", "root", "Ddb123..", "gz-cynosdbmysql-grp-3awgm0zf.sql.tencentcdb.com:22395", "test_db", "utf8")
db, _ := gorm.Open(mysql.Open(dns), &gorm.Config{
Logger: logger.Default.LogMode(logger.Silent),
})
# 设置数据库的最大连接数
sqlDB, _ := db.DB()
// SetMaxIdleConns sets the maximum number of connections in the idle connection pool.
sqlDB.SetMaxIdleConns(1000)
// SetMaxOpenConns sets the maximum number of open connections to the database.
sqlDB.SetMaxOpenConns(10000)
同时,也在脚本中执行上面查询的语句,可以看到CPU由之前的0逐渐提升到9左右。SQL语句,主要是通过自己查自己,产生一些临时表的聚合,因为也没有对字段进行加索引,基本上是全表扫描,同时,like也破坏了左原则查询策略,导致需要在很多的数据中进行查询,CPU就会逐渐的提高,此时,对应的CCU也完全提升上来了。
再回过头来看,费用明细也起来了。
这里有一个注意点,一定要去关联存储资源包,关联后,存储就不会去按量计费了,直接走流量包计费了。
其中,带宽流量实在抗不住,切换到朋友的公司测试环境,3天左右时间,服务器消耗了近108G带宽。
3.4 测试服务器配置相关参数信息:
主要的服务器为2核4G,弹性带宽为5Mbps峰值,CPU消耗的很少,主要是带宽跟不上。
3.5 总结:
到此,对TDSQL-C MySQL Serverless从0到1体验初步体验就完成了,在没有任何的学习的基础上,就能很快使用TDSQL-C MySQL Serverless进行开发,100%兼容MySQL的基本用法。
以前也只是对接口进行过压测,对数据库并没有实际的压测经验,也让我进一步巩固了数据库相关的知识体系。写的Go程序在服务器使用top命令查看CPU和内存也比较小,TDSQL-C MySQL Serverless也支持大数量的业务场景,以前是MySQL是项目中的瓶颈,现在变成了带宽是瓶颈。
3.6 测试的注意点:
因为计费是有一定的延迟的,并非实时的,所以,在费用消耗比较低的时候,因为使用了朋友的服务器,大晚上也不好叫他起来停止服务,所以,采用了以下几个自认为的方式来停止数据库,都还是产生了费用,最后把数据库实例进行销毁才没有继续产生费用了。
3.7 延伸 - 后续可以研究一下如何进行内网通信?
因为测试产生的带宽比较大,所以,购买了一台腾讯云服务器,看看能不能进行内网连接,但是没测试成功,服务器的内网IP段是10,而数据库实例的内网IP段是172的。
四、TDSQL -C MySQL 的优势:
(DB-Engines Ranking)[https://db-engines.com/en/ranking] 会根据受欢迎程度对数据库管理系统进行排名。
这份榜单分析旨在为数据库相关从业人员提供一个技术方向的参考,其中涉及到的排名情况并非基于产品的技术先进程度或市场占有率等因素。可以看出MySQL在使用中还是非常受欢迎的,不过,无论排名先后,选择适合与企业业务需求相比配的技术才是最重要的。
面对这么版本的MySQL,那么TDSQL -C MySQL 具备什么样的优势呢?
云数据库TDSQL -C MySQL Serverless是腾讯云PaaS产品线核心产品,在企业级内核、企业级扩展性、企业级高可用、高可靠、数据安全、智能运维上进行发力,将它打造为一个具备企业级能力的数据库,而不仅仅是开源的MySQL。
4.1 优点:
-(1)支持SQL语法,100%兼容,易于使用;
-(2)支持批量数据操作,提高了数据处理效率;
-(3)支持分布式架构,可方便地进行扩展(在第五节理论讲解)。
4.2 SQL语法支持:
使用某个项目的SQL语句,包括建表语句、插入语句,都能完全执行,在程序上操作输出了日志,也是可以的,暂时没有发现问题。
通过对项目的运行与实操,也没有发现有问题SQL运行报错的问题,如下为打印的日志:
4.3 对标一下批量数据操作效果:
使用上面的建表语句,用Gin协程插入大段文本1分钟,TDSQL-C MySQL插入了1095条记录,而自建的MySQL 5.7是701记录,TDSQL-C MySQL的效率是自建MySQL 5.7的1.57倍,效率比较高。
当然,这也只是一个简单的测试,并没有考虑带宽、服务器配置、数据库实例配置等所有参数严格的比较。
4.4 总结:
五、数据库管理工具:
5.1 第三方数据库连接工具:
在平时的工作开发中,连接和管理数据库是一个至关重要的任务。MySQL 是一种非常流行的开源关系型数据库,因此,也出现了许多用于连接和管理 MySQL 数据库,平时工作中用的最多的就是Navicat for MySQL。
- Host:为TDSQL-C MySQL Serverless上面开通的外网地址
- Port:需要注意一下并非是3306端口,具体需要看开通时给的端口
- Test Connection:点击测试是否能连接成功
但是我们在团队管理中,会存在一个比较大的问题,就是数据库权限的控制。
5.2 数据库管理(DMC):
数据库管理(DMC)是一个高效、可靠的一站式数据库管理平台,为用户提供库表级操作、实时监控、实例会话管理、SQL 窗口、数据管理为一体的数据库管理服务,帮您更加便捷、规范地管理多种数据库实例。
- 新建库表、视图、存储过程等
- 数据导入导出
- SQL 执行及安全审计
- 权限管控、数据变更审批
除了满足上面Navicat for MySQL常规的功能以外,还有其它比较实用的功能,比如,查看一些非法连接,会话等信息,体验了一下,基本上满足实际开发的需求。
提供了参数模板,可以自定义的设置符合自己业务需求的参数模板,如果下次再有需要购买数据库实例,可以直接使用新建好的模板。
5.3 数据库智能管理DBbrain:
数据库智能管家(TencentDB for DBbrain,DBbrain)是腾讯云推出的一款为用户提供数据库性能、安全、管理等功能的数据库自治云服务。DBbrain 利用机器学习、大数据手段、专家经验引擎快速复制资深数据库管理员的成熟经验,将大量传统人工的数据库运维工作智能化,服务于云上和云下企业,有效保障数据库服务的安全、稳定及高效运行。
目前体验比较好的功能是“诊断优化”,可以看到CPU、内存、存储、流量的情况,特别说明的是有“健康得分”,可以看看有没有异常。
性能趋势可以根据一些指标进行查看,可以随时关注一下项目的TPS、QPS,数据库的设计是否符合要求,哪些指标会有瓶颈的风险。
慢SQL分析是也是平时开发需要关注的指标之一,当执行时间超过设置的long_query_time时,就会被记录到慢SQL日志中,这样可以及时去关注项目有哪些语句不符合要求,是不是需要加索引?
SQL优化是一个很牛的功能,可以帮助开发人员进行SQL的优化,尤其是对于复杂的SQL查询,从语句来看,就是将EXPLAIN的结果进行了可视化分析,可以非常直观的看出问题,将之间英文的原回值,可以以中文的形式的展示,非常利于非DBA专业人士来快速分析与改进。
点击会出现比较详细的参数说明:
5.4 遇到的错误:
5.5 总结:
在日常使用和运维中,用户关心的可能就是数据库状态、网关状态、各个节点状态、Zookeeper、OSS状态等。但是之前的数据库产品中,这些信息很多是无法直接得到的,需要找运维或者更高权限的账号来获得相关信息。但在TDSQL 平台中,可以通过一些DMC和数据库智能管理DBbrain来直接获得。
DMC和数据库智能管理DBbrain可以帮助用户快速使用、管理、运维TDSQL集群。通过不同的角色设置,如平台管理员、实例管理员、租户管理员等,赋予不同的权限,帮助用户进行实例管理、集群管理、资源管理、监控管理、告警管理、日志管理、性能分析等全方位运维管理功能。
六、TDSQL -C MySQL的原理分析:
6.1 TDSQL -C MySQL的分类:
把数据库类型按照关系型和NoSQL来分的话,TDSQL-C for MySQL Serverless版的类型会归到NewSQL的类型中。
6.2 TDSQL -C MySQL Serverless的架构:
NewSQL从传统数据库到云原生数据库的演进,也是数据库在架构上不断随着业务和技术的迭代创新的过程。TDSQL-C MySQL Serverless整体架构其实是把计算层和存储层进行了完全分离,实现了计算节点无状态方式,100%兼容MySQL协议。
6.3 与MySQL的对比:
不同用户在不同规格和业务情况下,它们的参数是否都能适应好自己数据库所运行的最大状态。TDSQL -C MySQL Serverless通过深度学习算法对于业务进行优先分析,来给用户推荐当前数据库应该将哪些参数调整至什么样的值,能够获得多少的性能提升,给用户提出智能调优方案。
6.4 总结:
TDSQL -C MySQL Serverless在灵活性、成本上提供了更多的选择、更灵活的配置、更低成本架构,如支持单节点,在性能不需要这么强的情况下,写日志历史库或者合并库,另外的场景,如需要很大容量,并不需要很高的性能,都可以通过这个方式来解决问题。
七、适用场景:
TDSQL-C MySQL Serverless是腾讯研发的一款兼容MySQL协议的分布式数据库,适用于大并发、高性能、大容量的OLTP类场景。TDSQL分为集中式和分布式版本,分布式版可支持分布式事务,但性能不如单机事务,性能会有一定的损耗,如需使用,需要进行实际测试结果来决定是否使用。
-(1)工业互联网、IoT、安全监控等领域;
-(2)需要处理大量时序数据的场景;
-(3)需要高效处理实时数据采集的应用场景。
八、公司业务场景考量:
8.1 分库分表:
由于TDSQL-C MySQL Serverless在存储上,使用云原生存散分离架构优势比较大的,最大规格存储支持到TB、PB级别,对于海量存储业务来说,不用在频繁进行的分库分表拆分数据表,单库单表的容量也可以完全满足用户的业务需求。
8.2 存储容量:
同上,使用云原生存散分离架构,可以无限扩展,对容量没有限制,以往使用MySQL之前会进行一个数据量的预估容量,到了容量预警点后再进行扩容。但是,在TDSQL-C MySQL Serverless中,存储是按量计费,提供用户按使用多少算多少的方式。
8.3 性能:
上面体验中,也看到了TDSQL-C MySQL Serverless的不少有优势的方面,比如数据库实例停用,当有数据通信时,也会迅速启用。插入数据也比MySQL要快的多。
8.4添加列效率:
如果之前在MySQL一张大表中,增加一列,需要去掉索引,再添加列,再加索引的方式,否则操作几十T,几百T的数据,一旦遇到这种表需要增加一个列,DDL操作时间是不可控的,有可能存储空间就爆了。而TDSQL-C MySQL提供了一个Instant DDL的功能,能够解决用户快速加列的问题,加列时间基本上是秒级完成。
8.5 案例可用性分析:
TDSQL-C产品经过近几年的不断迭代,腾讯云TDSQL-C产品对外服务了微众银行、张家港农商行、富途证券,以及华夏银行等多家股份制银行,多家大型互联网创新保险公司等超过600家金融及政企客户。有这多领域的实际落地经验,足以应对公司的业务开发。
九、总结:
通过TDSQL-C for MySQL Serverless架构云数据库,可以体现云原生架构所带来的核心价值,如一些海量存储场景,存储数据、文件,并且性能也得到了很大的提升,如支持并行计算的能力,提升SQL性能,包括并行扫描,并行的多表连接、排序、分组、聚合等并行能力。
同时,在简单易用上面,也提供了很多参数模板,监控指标优化、备份和日志方面等可视化操作,极大降低了运维成本。
通过从0到1的了解与学习,TDSQL-C MySQL Serverless构建了一个产品全景能力图,并不仅仅是平时认知的数据库,通过控制台、客户端,通过凭证管理、审计能够进行一切监控,来给用户提供非常安全的访问环境。再通过参数的调优去辅助、协助用户更好的使用数据库,更优的使用数据库,让业务运行的更快,而不是将数据库不行的时候升配。再到整体架构,支持物理机、云服务器架构,支持异地的灾备,搭建符合公司企业级的业务需求,为公司带来降本提效。