我是一名个人开发者
2024年7月中国数据库排行榜:PolarDB独领云风骚,达梦跨越新巅峰.
数据库社区“墨天轮”公布了2024年最新一期中国数据库流行度排行榜,阿里云瑶池旗下的自研云原生数据库PolarDB夺冠,并刷新榜单总分纪录。墨天轮评价称,因云而生的PolarDB数据库以客户需求为导向,并在业界开创性地落地“三层解耦”架构、多主多写、HTAP、Serverless、集中与分布式一体化等一系列业内领先的前沿技术,为用户提供了灵活、可靠的数据库服务,解决了众多业务问题。
据了解,目前PolarDB已被10000家企业级用户采用,广泛落地于政务、金融、电信、物流、互联网等领域的核心业务系统。
墨天轮是中国知名数据库技术社区,其发起的中国数据库流行度排行榜,依据搜索引擎数据、核心案例数、资质数量、专利数、论文数等标准,对290个最主流的国产数据库进行综合评比。该榜单反映的是数据库产品在市场中的活跃度,被誉为中国版的“DB-Engines排名榜”。
在2024年7月的排行榜中,PolarDB以812.78分刷新榜单记录,排名第一,OceanBase、TiDB、OpenGauss、人大金仓分列2~5名。
引言
自2017年诞生以来,PolarDB便以其独特的云原生设计和存储计算分离的技术创新,引领着中国数据库行业的发展。作为中国首款自研的云原生数据库,PolarDB不仅提供了高性能的数据处理能力,还以其卓越的性价比和安全性,赢得了市场的广泛认可。
PolarDB的“三层分离”新版本在2024年1月的首届PolarDB开发者大会上正式发布。这一新版本不仅实现了50%的数据库成本节省,更通过智能决策技术,实现了查询性能的10倍提升。这一创新不仅体现了PolarDB在数据库技术领域的深厚积累,也进一步巩固了其在云原生数据库市场的领先地位。
在过去的几年里,PolarDB以惊人的速度增长,3年增速超过400%。这一成绩的背后,是PolarDB在数据库领域的持续创新和对市场需求的精准把握。目前,PolarDB已经服务于自然人税收管理系统、全国60%的省级医保信息平台等重要机构,以及中国联通、友邦保险、海底捞、米哈游等知名企业。这些客户的认可,充分证明了PolarDB在数据库领域的实力和影响力。
除了在产品和市场方面的卓越表现,PolarDB还积极推动数据库开源社区的发展。作为数据库开源的重要推动者,PolarDB已经正式开源近3年,建立了15个SIG组,吸引了超过3万名开发者和社区用户参与。此外,还有韵达、网易数帆、龙蜥等60多家生态伙伴加入了PolarDB的开源生态系统。
为了进一步推动数据库开源教育和技术普及,PolarDB开源数据库工作室已经在10多所高校挂牌成立。通过与武汉大学、华东师范大学等知名学府的联合合作,PolarDB不仅开设了相关教学课程,还开展了智慧问答助手等多个项目。这些举措不仅有助于培养新一代的数据库人才,也为PolarDB的长远发展注入了源源不断的活力。
PolarDB 体验
今天,我们就来体验一次,国产数据发展至今的强大之处。首先先购买或者体验一个PolarDB 的实例。
压测准备
配置 | 参数 |
---|---|
CPU | 2核 |
内存 | 4G |
MySQL | 5.8 |
PolarDB 压测
概念了解
在开始压测之前,我们首先来了解几个和压测有关的关键字,通过了解这些指标的定义和计算方法,可以更好地评估和优化系统的性能:
QPS(Queries Per Second)指的是每秒查询率,是衡量系统处理查询请求能力的一个重要指标。它通常用于评估搜索引擎、数据库、API等系统的性能。
TPS(Transactions Per Second)即每秒事务处理率,是衡量系统在单位时间内处理事务数量的一个重要指标。它通常用于评估数据库系统、交易系统等需要处理复杂事务的系统的性能。
RT(95%)通常指的是95%的请求的延迟时间,单位为毫秒,它反映了系统处理请求的响应速度。
以下是详细介绍:
QPS(每秒查询率)
- 定义:系统每秒能够处理的查询请求数量。
- 应用场景:搜索引擎、数据库查询、Web服务器等。
- 计算方式:总查询数除以总时间(秒)。
- 重要性:反映了系统的查询处理能力和响应速度。
TPS(每秒事务处理率)
- 定义:系统每秒能处理的事务数量。
- 应用场景:数据库系统、金融交易系统、电商平台等。
- 计算方式:总事务数除以总时间(秒)。
- 重要性:反映了系统的处理能力和效率。
RT(95%)(95%的请求延迟)
- 定义:95%的请求的延迟时间,单位为毫秒。
- 应用场景:用于评估系统的响应速度。
- 计算方式:通常通过监控工具收集数据后计算得出。
- 重要性:反映了系统处理请求的实时性,较低的RT(95%)意味着更好的用户体验。
性能测试方法(OLTP)
测试工具
Sysbench是一个跨平台且支持多线程的模块化基准测试工具,用于评估系统在运行高负载的数据库时相关核心参数的性能表现。使用Sysbench是为了绕过复杂的数据库基准设置,甚至在没有安装数据库的前提下,快速了解数据库系统的性能。
测试场景
对不同独享规格的一主一只读节点集群的只读、只写、读写性能以及一主多只读节点集群的只读性能进行OLTP性能测试。
对不同通用规格的一主一只读节点集群的只读、只写、读写性能进行OLTP性能测试。
衡量指标
TPS(Transactions Per Second):即数据库每秒执行的事务数,以COMMIT成功次数为准。
QPS(Queries Per Second):即数据库每秒执行的SQL数(含INSERT、SELECT、UPDATE、DELETE等)。
安装Sysbench
在ECS中执行如下命令安装Sysbench。
yum install gcc gcc-c++ autoconf automake make libtool bzr mysql-devel git mysql
git clone https://github.com/akopytov/sysbench.git
##从Git中下载Sysbench
cd sysbench
##打开Sysbench目录
git checkout 1.0.18
##切换到Sysbench 1.0.18版本
./autogen.sh
##运行autogen.sh
./configure --prefix=/usr --mandir=/usr/share/man
make
##编译
make install
执行如下命令配置Sysbench client,使内核可以利用所有的CPU核数处理数据包(默认设置为2核),同时减少CPU核数之间的上下文切换。
sudo sh -c 'for x in /sys/class/net/eth0/queues/rx-*; do echo ffffffff>$x/rps_cpus; done'
说明:ffffffff表示使用32个核。请根据实际配置修改,例如ECS为8核,则输入ff。
sudo sh -c "echo 32768 > /proc/sys/net/core/rps_sock_flow_entries"
sudo sh -c "echo 4096 > /sys/class/net/eth0/queues/rx-0/rps_flow_cnt"
sudo sh -c "echo 4096 > /sys/class/net/eth0/queues/rx-1/rps_flow_cnt"
测试方法
在ECS上执行如下命令,以在PolarDB MySQL版集群中创建数据库testdb为例。
mysql -h XXX -P XXX -u XXX -p XXX -e 'create database testdb'
说明:请将本命令和后续步骤命令中的XXX替换为PolarDB MySQL版集群的集群地址、端口号、用户名和密码,具体参数说明如下。
-h PolarDB MySQL版集群的集群地址。
-P PolarDB MySQL版集群的端口号。
-u PolarDB MySQL版集群的用户名。
-p 上述用户名对应的密码。
使用Sysbench测试PolarDB MySQL版集群版一主一只读节点的只读性能,整个过程将持续10分钟。
sysbench --db-driver=mysql --mysql-host=XXX --mysql-port=XXX --mysql-user=XXX --mysql-password=XXX --mysql-db=sbtest --table_size=25000 --tables=250 --events=0 --time=600 oltp_read_only prepare
##准备数据
sysbench --db-driver=mysql --mysql-host=XXX --mysql-port=XXX --mysql-user=XXX --mysql-password=XXX --mysql-db=sbtest --table_size=25000 --tables=250 --events=0 --time=600 --threads=XXX --percentile=95 --range_selects=0 --skip-trx=1 --report-interval=1 oltp_read_only run
##运行workload
sysbench --db-driver=mysql --mysql-host=XXX --mysql-port=XXX --mysql-user=XXX --mysql-password=XXX --mysql-db=sbtest --table_size=25000 --tables=250 --events=0 --time=600 --threads=XXX --percentile=95 --range_selects=0 oltp_read_only cleanup
##清理
使用Sysbench测试PolarDB MySQL版集群版一主一只读节点的写入性能,整个过程将持续10分钟。
sysbench --db-driver=mysql --mysql-host=XXX --mysql-port=XXX --mysql-user=XXX --mysql-password=XXX --mysql-db=sbtest --table_size=25000 --tables=250 --events=0 --time=600 oltp_write_only prepare
##准备数据
sysbench --db-driver=mysql --mysql-host=XXX --mysql-port=XXX --mysql-user=XXX --mysql-password=XXX --mysql-db=sbtest --table_size=25000 --tables=250 --events=0 --time=600 --threads=XXX --percentile=95 --report-interval=1 oltp_write_only run
##运行workload
sysbench --db-driver=mysql --mysql-host=XXX --mysql-port=XXX --mysql-user=XXX --mysql-password=XXX --mysql-db=sbtest --table_size=25000 --tables=250 --events=0 --time=600 --threads=XXX --percentile=95 oltp_write_only cleanup
##清理
使用Sysbench测试PolarDB MySQL版集群版一主一只读节点的混合读写性能,整个过程将持续10分钟。
sysbench --db-driver=mysql --mysql-host=XXX --mysql-port=XXX --mysql-user=XXX --mysql-password=XXX --mysql-db=sbtest --table_size=250000 --tables=25 --events=0 --time=600 oltp_read_write prepare
##准备数据
sysbench --db-driver=mysql --mysql-host=XXX --mysql-port=XXX --mysql-user=XXX --mysql-password=XXX --mysql-db=sbtest --table_size=250000 --tables=25 --events=0 --time=600 --threads=XXX --percentile=95 --report-interval=1 oltp_read_write run
##运行workload
sysbench --db-driver=mysql --mysql-host=XXX --mysql-port=XXX --mysql-user=XXX --mysql-password=XXX --mysql-db=sbtest --table_size=250000 --tables=25 --events=0 --time=600 --threads=XXX --percentile=95 oltp_read_write cleanup
##清理
使用Sysbench测试PolarDB MySQL版集群版一主多只读节点的只读性能(对一主一只读节点到一主八只读节点的集群依次测试)。
sysbench --db-driver=mysql --mysql-host=XXX --mysql-port=XXX --mysql-user=XXX --mysql-password=XXX --mysql-db=sbtest --table_size=25000 --tables=250 --events=0 --time=600 oltp_read_only prepare
##准备数据
sysbench --db-driver=mysql --mysql-host=XXX --mysql-port=XXX --mysql-user=XXX --mysql-password=XXX --mysql-db=sbtest --table_size=25000 --tables=250 --events=0 --time=600 --threads=XXX --percentile=95 --report-interval=1 oltp_read_only --db-ps-mode=disable --skip-trx=1 run
##运行workload
sysbench --db-driver=mysql --mysql-host=XXX --mysql-port=XXX --mysql-user=XXX --mysql-password=XXX --mysql-db=sbtest --table_size=25000 --tables=250 --events=0 --time=600 --threads=XXX --percentile=95 oltp_read_only cleanup
##清理
OLAP性能
测试工具
TPC-H是业界常用的一套基准,由TPC委员会制定发布,用于评测数据库的分析型查询能力。TPC-H查询包含8张数据表、22条复杂的SQL查询,大多数查询包含若干表Join、子查询和Group By聚合等。
安装TPC-H
重要: 本文档中的命令只能由root权限的用户来执行。
在ECS实例上安装TPC-H的操作步骤如下:
注册并下载TPC-H,并将下载的TPCH-H压缩包上传至ECS实例。
执行以下命令,解压缩上传的TPC-H压缩包(以压缩包dbgen.zip为例)。
unzip dbgen.zip
进入解压后的目录(以dbgen目录为例)。
cd dbgen
复制makefile文件。
cp makefile.suite makefile
安装GCC。
sudo yum install gcc # CentOS系统
sudo apt install gcc # Ubuntu系统
修改makefile文件中的CC、DATABASE、MACHINE、WORKLOAD等参数定义。
vim makefile
修改如下:
CC= gcc
DATABASE= MYSQL
MACHINE = LINUX
WORKLOAD = TPCH
修改tpcd.h文件,并添加新的宏定义。
vim tpcd.h
添加如下内容:
#ifdef MYSQL
#define GEN_QUERY_PLAN "EXPLAIN PLAN"
#define START_TRAN "START TRANSACTION"
#define END_TRAN "COMMIT"
#define SET_OUTPUT ""
#define SET_ROWCOUNT "limit %d;\n"
#define SET_DBASE "use %s;\n"
#endif
对文件进行编译。
make
生成测试数据与查询
使用TPC-H生成测试数据。
./dbgen -s 100
生成查询(为了测试结果可重复,可以忽略生成查询的步骤,使用附件的22个查询进行测试)。
cp qgen queries
cp dists.dss queries
./qgen -d $i -s 100 > db"$i".sql
测试步骤
在ECS上连接PolarDB数据库。
创建数据库。
create database tpch100g;
创建表。
source ./dss.ddl
加载数据。
touch load.ddl
vim load.ddl
添加如下内容:
load data local INFILE 'customer.tbl' INTO TABLE customer FIELDS TERMINATED BY '|';
load data local INFILE 'region.tbl' INTO TABLE region FIELDS TERMINATED BY '|';
load data local INFILE 'nation.tbl' INTO TABLE nation FIELDS TERMINATED BY '|';
load data local INFILE 'supplier.tbl' INTO TABLE supplier FIELDS TERMINATED BY '|';
load data local INFILE 'part.tbl' INTO TABLE part FIELDS TERMINATED BY '|';
load data local INFILE 'partsupp.tbl' INTO TABLE partsupp FIELDS TERMINATED BY '|';
load data local INFILE 'orders.tbl' INTO TABLE orders FIELDS TERMINATED BY '|';
load data local INFILE 'lineitem.tbl' INTO TABLE lineitem FIELDS TERMINATED BY '|';
连接PolarDB数据库加载load.ddl文件数据。
source ./load.ddl
创建主外键。
source ./dss.ri
创建索引(可选)。
vim create_indexes.sh
添加如下内容:
#!/usr/bin/bash
host=$1
port=$2
user=$3
password=$4
db=$5
sqls=("create index i_s_nationkey on supplier (s_nationkey);"
"create index i_ps_partkey on partsupp (ps_partkey);"
"create index i_ps_suppkey on partsupp (ps_suppkey);"
"create index i_c_nationkey on customer (c_nationkey);"
"create index i_o_custkey on orders (o_custkey);"
"create index i_o_orderdate on orders (o_orderdate);"
"create index i_l_orderkey on lineitem (l_orderkey);"
"create index i_l_partkey on lineitem (l_partkey);"
"create index i_l_suppkey on lineitem (l_suppkey);"
"create index i_l_partkey_suppkey on lineitem (l_partkey, l_suppkey);"
"create index i_l_shipdate on lineitem (l_shipdate);"
"create index i_l_commitdate on lineitem (l_commitdate);"
"create index i_l_receiptdate on lineitem (l_receiptdate);"
"create index i_n_regionkey on nation (n_regionkey);"
"analyze table supplier"
"analyze table part"
"analyze table partsupp"
"analyze table customer"
"analyze table orders"
"analyze table lineitem"
"analyze table nation"
"analyze table region")
for sql in "${sqls[@]}"
do
mysql -h$host -P$port -u$user -p$password -D$db -e "$sql"
done
预载索引数据到内存池中(可选)。
vim preload_indexes.sh
添加如下内容:
#!/bin/bash
host=$1
port=$2
user=$3
password=$4
dbname=$5
MYSQL="mysql -h$host -P$port -u$user -p$password -D$dbname"
if [ -z ${dbname} ]; then
echo "dbname not defined."
exit 1
fi
table_indexes=(
"supplier PRIMARY"
"supplier i_s_nationkey"
"part PRIMARY"
"partsupp PRIMARY"
"partsupp i_ps_partkey"
"partsupp i_ps_suppkey"
"customer PRIMARY"
"customer i_c_nationkey"
"orders PRIMARY"
"orders i_o_custkey"
"orders i_o_orderdate"
"lineitem PRIMARY"
"lineitem i_l_orderkey"
"lineitem i_l_partkey"
"lineitem i_l_suppkey"
"lineitem i_l_partkey_suppkey"
"lineitem i_l_shipdate"
"lineitem i_l_commitdate"
"lineitem i_l_receiptdate"
"nation i_n_regionkey"
"nation PRIMARY"
"region PRIMARY"
)
for table_index in "${table_indexes[@]}"
do
ti=($table_index)
table=${ti[0]}
index=${ti[1]}
SQL="select count(*) from ${table} force index(${index})"
echo "$MYSQL -e '$SQL'"
$MYSQL -e "$SQL"
done
运行查询
创建运行查询的脚本。
vim run_queries.sh
添加如下内容:
#!/usr/bin/env bash
host=$1
port=$2
user=$3
password=$4
database=$5
dir=$6
function run_query()
{
id=$1
query_file=$2
time_file=$3
host=$4
port=$5
user=$6
password=$7
database=$8
if [[ ! -f ${query_file} ]];then
echo "Query file[${query_file}] does not exist, return."
return 1
fi
for i in {
1..1}
do
echo "Execute $id :${query_file}"
echo "USE ${database}; SET profiling = 1;SET profiling_history_size = 10;source ${query_file};show profiles;show profile for query 1;"| mysql -h${host} -P${port} -u${user} -p${password} -D${database} >> ${time_file} 2>&1
done
return 0
}
i=1
for query_file in `find $dir -name '*.sql'|sort -V`
do
echo "run query: $query_file"
run_query $i $query_file $dir/q${i}_run.log $host $port $user $password $database
((i=i+1))
done
运行脚本执行所有查询。
chmod +x run_queries.sh
./run_queries.sh <数据库地址> <数据库端口> <数据库用户> <数据库密码> <数据库名称> ./queries
说明: 运行完成后,会在queries目录中生成各查询的log文件,查询执行结果与执行时间均保存在log文件中。
性能调优
- 确认实例是否在调优模式。
- 适当调整参数,如innodb_buffer_pool_size、innodb_io_capacity等,确保数据库可以处理大数据量。
- 确保系统不会出现OOM(Out Of Memory)情况。
- 对慢查询进行分析与优化。
通过上述步骤,评估并调优PolarDB的性能,总体来说,对于2核4G的服务器,初期性能表现不错,服务器的性能和稳定性,确保在高负载下仍能保持较好的响应时间和一致性。
谈谈感受
国产数据库技术的发展历程,可以说是一部充满挑战与机遇的史诗。从最初的技术启蒙,到后来的引进、成长,再到如今的加速发展,国产数据库在不断地磨砺中逐渐崭露头角。
特别是在2010年至今的这段时间里,随着数字化转型的浪潮席卷全球,国产数据库如阿里云的Polar DB、腾讯云的TDSQL等犹如雨后春笋般蓬勃发展。它们凭借强大的技术实力和敏锐的市场洞察力,迅速在云计算时代占据了一席之地,并展现出了广阔的发展前景。
其中,OceanBase在TPC-C基准测试中打破Oracle的世界记录,更是成为了国产数据库发展史上的一个标志性事件。这一成绩不仅证明了国产数据库在云计算时代的技术实力,更标志着国产数据库在国际竞争中的崛起。OceanBase的成功,无疑为中国数据库技术的发展注入了强大的信心和动力。
国产数据库技术的崛起,离不开国家政策的扶持、企业加大研发投入以及人才储备等多方面因素的共同作用。此外,国内数据库厂商在技术创新、产品升级、市场拓展等方面的持续努力也是关键因素之一。
在国际市场上,国产数据库技术的认可度正在逐渐提升。越来越多的海外企业和机构开始关注并尝试使用国产数据库产品,这无疑为国产数据库的进一步发展提供了广阔的市场空间和机遇。
展望未来,随着技术的不断进步和市场需求的不断变化,国产数据库技术有望在全球范围内发挥更加重要的作用。无论是在云计算、大数据还是人工智能等领域,国产数据库都有望成为引领者,为全球数字化进程贡献中国智慧和力量。
在这之前,未有国产数据库涉足核心业务系统;在这之后,国产数据库企业无需再向用户证明国产能不能打。