一、为什么选TDSQL-C
1、性能达到每分钟8.14亿笔交易
国产数据库傲立世界之巅!腾讯云数据库TDSQL-C性能刷新世界记录。
由TPC发起的TPC-C是针对在线事务处理(OLTP)的基准测试模型,是全球数据库厂商公认的性能评价标准,被誉为数据库领域的“奥林匹克”。它通过模拟一个超大型高并发的交易场景,对数据库服务的稳定性、性能、容灾等能力进行测试,对数据库的技术要求极高。
过去,TPC-C可以说是微软、甲骨文、IBM等海外传统数据库厂商竞技的舞台。此次腾讯云数据库TDSQL获第一、破纪录,也意味着国产数据库正在实现科技自立自强,并用不断夯实的技术实力,对海外传统数据库厂商进行了漂亮的反超回击。
从TPC官网公布的测试结果可以看到,为了通过TPC-C测试,腾讯云在性能、稳定性和容灾能力等方面都做到极致升级。比如,其内存性能做到了单节点支持180万QPS (Queries PerSecond,每秒查询率)。
2、云数据库VS云原生数据库
简而言之传统数据库既有的问题其实中云上是没有得到解决的
第一云数据库的出现是为了解决线下到线上的痛点。就是说首先在云计算出现之前,用户需要资源的时候,他需要去申请实例的时候,他首先要准备服务器,然后服务器上架之后,要安装部署操作系统,数据库软件,然后才能交付。那么云计算时代到来之后呢?云厂商提供给客户云的数据库服务。作为云厂商啊,我们可以把传统的数据库搬到云上来。给客户以租用的这种方式提供服务,实现一个资源的这个快速按需购买。
那么第二个呢,就是说我们的这个业务啊,根据自身的一个对性能可靠性啊,或者可用性的一些考虑,那选择不同的方式复制啊,在不同的一个容灾级别,比如说跨交换机,跨机房,跨可用区,跨我们的区域啊,这些呢,在云上啊,我们都是基于这种他的可靠性,可用性。
第三个呢,在云上啊,会提供各种比较丰富的一些监控能力。当我们的业务,比如出现问题的时候呢,那他可以快速的协助帮助定位问题。但是往往都是事中或者事后分析的。所以当我们发现传统数据库在云上有很多的问题。那这些问题呢,是传统数据库既有的问题,就是传统数据库本身有的问题,你迁到云上去还是有这样的问题。所以在云上并没有得到解决。也不适应云在扩展性、可靠性和规模性的的一些优势。那这个时候呢,我们迫切呢,需要用云厂商来考虑如何将我们传统的这种数据库和云计算做一个融合。
这个就是云原生。那云原生这个概念出现了。那我们把它简单的可以认为是相当于对之前的云数据库的一个全面的一个升级啊,这是技术发展到一定程度之后的一个必然结果。我们发现用户啊,申请的时候希望快速交付而且呢,我在使用过程当中啊。比如说我们在做一些618的活动啊,双11等等一些这个促销活动啊。要增加资源的时候能快速的扩容。而对传统的那种单机冗余架构来讲我们做这种弹性伸缩的话需要一个数据搬迁然后会十分的耗时。
3、成本低
TDSQL-C支持计算和存储分离,例如扩容的时候咱们需要多少存储就购买多少。不会存在只需要存储不需要计算的情况下还浪费了计算资源的情况。
TDSQL-C云原生还实现了人员的降本增效,实现自动化运维之后可以减少人工干预的可能性。简而言之就是之前搬到云上的服务已经可以通过AI进行管理,人员成本就降低了。
我身边实打实的例子就是某些公司花高价请运维工程师从0开始搭建k8s架构,3个月时间搞定之后让人家把文档留下找个借口说试用期没过。然后在公司内部给员工画饼年底加薪,让员工通过文档快速上手使用。哪怕员工提出以后出问题不好维护的疑问,人家云淡风轻地说大不了再花钱找一个解决之后留下文档让他走人。
二、TDSQL-C产品体验
2.1、体验思路
使用 Python 向 TDSQL-C 添加读取数据 实现词云图
本次我们使用python
语言 进行TDSQL Serverless MySQL
进行体验, 实现思路如下:
- 读取多个本地的
excel
文件 ,并将读取的数据存储到TDSQL
中 - 从
TDSQL
读取存储的数据 - 将读取的数据生成词云图,并展示
2.2、体验步骤
1. 选购TDSQL资源
打开浏览器输入腾讯云官网地址:http://cloud.tencent.com
或者点击链接直接进入腾讯云 产业智变·云启未来 - 腾讯 (tencent.com)https://cloud.tencent.com/
免费注册登录之后在搜索框中输入TDSQL-C MYSQL,点击立即选购
2、数据库配置
注意必须选择本次体验的实例Serverless
算力配置中的自动暂停功能就相当于从前家家户户喝水都要打井,然后现在变成了自来水,水龙头可以自由调度水资源。
计费模式也特别划算,按量计费适用于夜间用户量骤降时可以节约成本
针对流量起伏小的服务性价比很高
3、创建集群
创建集群时注意记住管理员密码和集群名
这里可以发现TDSQL支持一键配置数据库端口号、安全组、表名大小写敏感、指定项目等
真的是解放双手的利器,避免了重复做那些基础操作而费时费力。
这里需要注意的是将外部读写地址开启,最后点击授权并创建之后记住主机名和端口号即可。
这样做的目的就是方便我们使用数据库管理工具进行外部的连接及使用。
4、外部连接数据库
使用数据库管理工具Navicat连接腾讯云的TDSQL
5、创建对应的库
可以直接在Navicat中创建,就是使用和管理数据库实例不太方便。
也可以登录TDSQL-C的数据库管理(DMC)进行创建。(这就是TDSQL强大的地方,可以更加便捷、规范地管理多种数据库实例)
数据库管理(DMC)是一个高效、可靠的一站式数据库管理平台,为用户提供库表级操作、实时监控、实例会话管理、SQL窗口、数据管理为一体的数据库管理服务,帮您更加便捷、规范地管理多种数据库实例。
有比较实用的功能,比如,查看一些非法连接,会活等信息,体验了一下,基
本上满足实际开发的需求。
提供了参数模板,可以自定义的设置符合自己业务需求的参数模板,如果下次再有需要购买数据库实例,可以直接使用新建好的模板。
6、项目目录结构
Excel文件地址如下 : 词频.ziphttps://tdsql-c-1253910586.cos.ap-nanjing.myqcloud.com/%E8%AF%8D%E9%A2%91.zip
背景图地址: background.PNG.ziphttps://tdsql-c-1253910586.cos.ap-nanjing.myqcloud.com/background.PNG.zip
字体文件(可选): PingFangBold.ttfhttps://tdsql-c-1253910586.cos.ap-nanjing.myqcloud.com/PingFangBold.ttf
- 在
pycharm
工具中创建项目目录 - 将下载的文件放到工程目录中
- 在工程目录中创建一个空文件夹,命名词云图
7、创建读取excel文件的函数
def excelTomysql():
path = '词频' # 文件所在文件夹
files = [path + "/" + i for i in os.listdir(path)] # 获取文件夹下的文件名,并拼接完整路径
for file_path in files:
print(file_path)
filename = os.path.basename(file_path)
table_name = os.path.splitext(filename)[0] # 使用文件名作为表名,去除文件扩展名
# 使用pandas库读取Excel文件
data = pd.read_excel(file_path, engine="openpyxl", header=0) # 假设第一行是列名
columns = {col: "VARCHAR(255)" for col in data.columns} # 动态生成列名和数据类型
create_table(table_name, columns) # 创建表
save_to_mysql(data, table_name) # 将数据保存到MySQL数据库中,并使用文件名作为表名
print(filename + ' uploaded and saved to MySQL successfully')
8、根据excel文件名创建数据库表名
def create_table(table_name, columns):
# 建立MySQL数据库连接
conn = pymysql.connect(**db_config)
cursor = conn.cursor()
# 组装创建表的 SQL 查询语句
query = f"CREATE TABLE IF NOT EXISTS {table_name} ("
for col_name, col_type in columns.items():
query += f"{col_name} {col_type}, "
query = query.rstrip(", ") # 去除最后一个逗号和空格
query += ")"
# 执行创建表的操作
cursor.execute(query)
# 提交事务并关闭连接
conn.commit()
cursor.close()
conn.close()
9、将读取的excel 数据保存到数据库对应的表中
def save_to_mysql(data, table_name):
# 建立MySQL数据库连接
conn = pymysql.connect(**db_config)
cursor = conn.cursor()
# 将数据写入MySQL表中(假设数据只有一个Sheet)
for index, row in data.iterrows():
query = f"INSERT INTO {table_name} ("
for col_name in data.columns:
query += f"{col_name}, "
query = query.rstrip(", ") # 去除最后一个逗号和空格
query += ") VALUES ("
values = tuple(row)
query += ("%s, " * len(values)).rstrip(", ") # 动态生成值的占位符
query += ")"
cursor.execute(query, values)
# 提交事务并关闭连接
conn.commit()
cursor.close()
conn.close()
10、读取数据库中存入的数据
def query_data():
# 建立MySQL数据库连接
conn = pymysql.connect(**db_config)
cursor = conn.cursor()
# 查询所有表名
cursor.execute("SHOW TABLES")
tables = cursor.fetchall()
data = []
dic_list = []
table_name_list = []
for table in tables:
# for table in [tables[-1]]:
table_name = table[0]
table_name_list.append(table_name)
query = f"SELECT * FROM {table_name}"
# # 执行查询并获取结果
cursor.execute(query)
result = cursor.fetchall()
if len(result) > 0:
columns = [desc[0] for desc in cursor.description]
table_data = [{columns[i]: row[i] for i in range(len(columns))} for row in result]
data.extend(table_data)
dic = {}
for i in data:
dic[i['word']] = float(i['count'])
dic_list.append(dic)
conn.commit()
cursor.close()
conn.close()
return dic_list, table_name_list
11、执行函数,并生成词云图
if __name__ == '__main__':
##excelTomysql()方法将excel写入到mysql
excelTomysql()
print("excel写入到mysql成功!")
# query_data()方法将mysql中的数据查询出来,每张表是一个dic,然后绘制词云
result_list, table_name_list = query_data()
print("从mysql获取数据成功!")
for i in range(len(result_list)):
maskImage = np.array(Image.open('background.PNG')) # 定义词频背景图
# 定义词云样式
wc = wordcloud.WordCloud(
font_path='PingFangBold.ttf', # 设置字体
mask=maskImage, # 设置背景图
max_words=500, # 最多显示词数
max_font_size=100) # 字号最大值
# 生成词云图
wc.generate_from_frequencies(result_list[i]) # 从字典生成词云
# 保存图片到指定文件夹
wc.to_file("词云图/{}.png".format(table_name_list[i]))
print("生成的词云图【{}】已经保存成功!".format(table_name_list[i] + '.png'))
# 在notebook中显示词云图
plt.imshow(wc) # 显示词云
plt.axis('off') # 关闭坐标轴
plt.show() # 显示图像
12、词云图效果展示
13、运行结果展示
14、完整代码
import pymysql
import pandas as pd
import os
import wordcloud
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
# MySQL数据库连接配置
db_config = {
'host': "gz-xxxxxxysql-grp-kb212sal.sql.tencentcdb.com", # 主机名
'port': 25648, # 端口
'user': "root", # 账户
'password': "TDSQL-C@!@Rgpk14.", # 密码
'database': 'db0',
}
def create_table(table_name, columns):
# 建立MySQL数据库连接
conn = pymysql.connect(**db_config)
cursor = conn.cursor()
# 组装创建表的 SQL 查询语句
query = f"CREATE TABLE IF NOT EXISTS {table_name} ("
for col_name, col_type in columns.items():
query += f"{col_name} {col_type}, "
query = query.rstrip(", ") # 去除最后一个逗号和空格
query += ")"
# 执行创建表的操作
cursor.execute(query)
# 提交事务并关闭连接
conn.commit()
cursor.close()
conn.close()
def excelTomysql():
path = '词频' # 文件所在文件夹
files = [path + "/" + i for i in os.listdir(path)] # 获取文件夹下的文件名,并拼接完整路径
for file_path in files:
print(file_path)
filename = os.path.basename(file_path)
table_name = os.path.splitext(filename)[0] # 使用文件名作为表名,去除文件扩展名
# 使用pandas库读取Excel文件
data = pd.read_excel(file_path, engine="openpyxl", header=0) # 假设第一行是列名
columns = {col: "VARCHAR(255)" for col in data.columns} # 动态生成列名和数据类型
create_table(table_name, columns) # 创建表
save_to_mysql(data, table_name) # 将数据保存到MySQL数据库中,并使用文件名作为表名
print(filename + ' uploaded and saved to MySQL successfully')
def save_to_mysql(data, table_name):
# 建立MySQL数据库连接
conn = pymysql.connect(**db_config)
cursor = conn.cursor()
# 将数据写入MySQL表中(假设数据只有一个Sheet)
for index, row in data.iterrows():
query = f"INSERT INTO {table_name} ("
for col_name in data.columns:
query += f"{col_name}, "
query = query.rstrip(", ") # 去除最后一个逗号和空格
query += ") VALUES ("
values = tuple(row)
query += ("%s, " * len(values)).rstrip(", ") # 动态生成值的占位符
query += ")"
cursor.execute(query, values)
# 提交事务并关闭连接
conn.commit()
cursor.close()
conn.close()
def query_data():
# 建立MySQL数据库连接
conn = pymysql.connect(**db_config)
cursor = conn.cursor()
# 查询所有表名
cursor.execute("SHOW TABLES")
tables = cursor.fetchall()
data = []
dic_list = []
table_name_list = []
for table in tables:
# for table in [tables[-1]]:
table_name = table[0]
table_name_list.append(table_name)
query = f"SELECT * FROM {table_name}"
# # 执行查询并获取结果
cursor.execute(query)
result = cursor.fetchall()
if len(result) > 0:
columns = [desc[0] for desc in cursor.description]
table_data = [{columns[i]: row[i] for i in range(len(columns))} for row in result]
data.extend(table_data)
dic = {}
for i in data:
dic[i['word']] = float(i['count'])
dic_list.append(dic)
conn.commit()
cursor.close()
conn.close()
return dic_list, table_name_list
if __name__ == '__main__':
##excelTomysql()方法将excel写入到mysql
excelTomysql()
print("excel写入到mysql成功!")
# query_data()方法将mysql中的数据查询出来,每张表是一个dic,然后绘制词云
result_list, table_name_list = query_data()
print("从mysql获取数据成功!")
for i in range(len(result_list)):
maskImage = np.array(Image.open('background.PNG')) # 定义词频背景图
# 定义词云样式
wc = wordcloud.WordCloud(
font_path='PingFangBold.ttf', # 设置字体
mask=maskImage, # 设置背景图
max_words=500, # 最多显示词数
max_font_size=100) # 字号最大值
# 生成词云图
wc.generate_from_frequencies(result_list[i]) # 从字典生成词云
# 保存图片到指定文件夹
wc.to_file("词云图/{}.png".format(table_name_list[i]))
print("生成的词云图【{}】已经保存成功!".format(table_name_list[i] + '.png'))
# 在notebook中显示词云图
plt.imshow(wc) # 显示词云
plt.axis('off') # 关闭坐标轴
plt.show() # 显示图像
直接复制粘贴然后把项目文件导入之后即可运行,如有问题评论区见
三、TDSQL-C的体验感受
1、TDSQL -C MySQL的分类
把数据库类型按照关系型和非关系型来分的话,TDSQL-C for MySQL Serverless版的类型会归到NewSQL的类型中。
2、TDSQL -C MySQL Serverless的架构
NewSQL从传统数据库到云原生数据库的进化,也是数据库在架构上不断随着业务和技术的迭代创新的过程。TDSQL-C MySQL Serverless整体架构其实是把计算层和存储层进行了完全分离,实现了计算节点无状态方式,100%兼容MySQL协议。
3、与MySQL的对比
不同用户在不同规格和业务情况下,它们的参数是否都能适应好自己数据库所运行的最大状态。TDSQL -C MySQL Serverless通过深度学习算法对于业务进行优先分析,来给用户推荐当前数据库应该将哪些参数调整至什么样的值,能够获得多少的性能提升,给用户提出智能调优方案。
TDSQL -C MySQL Serverless在灵活性、成本上提供了更多的选择、更灵活的配置、更低成本架构,如支持单节点,在性能不需要这么强的情况下,写日志历史库或者合并库,另外的场景,如需要很大容量,并不需要很高的性能,都可以通过这个方式来解决问题。
四、应用场景
1、游戏应用
- 敏捷灵活的弹性扩展,无需预先购买存储,可根据业务需要快速升降级,快速扩容,轻松应对业务峰值。
- 最高支持 PB 级海量存储,按存储量计费,自动扩容,免去合区合服的繁琐操作,实现资源和成本的最优配置。
- 秒级的快照备份和快速回档能力,在多副本的基础上对用户的数据进行连续保护,是游戏行业的最佳选择。
2、电商/直播/教育
- 支持分钟级的升配,最多可扩展至15个节点,快速弹升 IOPS 的能力。解决传统数据库的升配时间会随着存储量的大小、宿主机资源的情况而不断上升的问题。
- 通过引擎的优化 IOPS 能力的提升,提供高并发状态下优秀的数据写入能力,轻松应对业务峰值。
- 主节点和读节点之间采用物理复制的方式,读节点与主节点延迟大大降低,满足电商场景中买家卖家数据一致性读取需求。
3、金融/保险
- 多可用区架构,在多个可用区内都有数据备份,为数据库提供容灾和备份。通过全球数据库网络功能实现数据的异地灾备,跨地域实例可同时读写,且业务无需修改代码,即可直接从同城部署扩展到异地部署。
- 采用白名单、VPC 网络等全方位的手段,对数据库数据访问、存储、管理等各个环节提供安全保障。
- 采用共享分布式存储的设计,彻底解决了主从异步复制所带来的备库数据非强一致性的问题。
4、互联网/移动APP
- 商用数据库级别的高性能、高可靠, 较低成本使得 TDSQL-C MySQL 版成为互联网关键业务的最佳选择。定制开发的多项内核优化以及企业级特性保障业务平稳高效的运行,让研发人员专注于业务逻辑的开发,无后顾之忧。
- 解决了传统主备架构弹性能力差,业务压力大时的同步效率低,主备切换时间不可控等问题,在提供高性能同时保证了系统的高可用性和业务的连续性。极大的减轻了运营和运维人员的工作量。
- 全面兼容开源数据库 MySQL,原有业务应用几乎不用更改即可接入 TDSQL-C MySQL 版,助力企业平滑上云。