Starrocks基准测试和性能测试
五、基准测试和性能测试
5.1 TPC-H基准测试
TPC-H是美国交易处理效能委员会TPC(Transaction Processing Performance Council)组织制定的用来模拟决策支持类应用的测试集。它包括一整套面向业务的ad-hoc查询和并发数据修改。
TPC-H根据真实的生产运行环境来建模,模拟了一套销售系统的数据仓库。该测试共包含8张表,数据量可设定从1 GB~3TB不等。其基准测试共包含了22个查询,主要评价指标为各个查询的响应时间,即从提交查询到结果返回所需时间。
5.1.1 生成测试数据
测试表
表名 行数 表容量 说明
lineitem 6亿 59GB 商品订单表
customer 1500万 客户表
part 2000万 零部件表
partsupp 8000万
region 5
supplier 100万 供应商表
nation 25
orders 1.5亿
下载测试包并上传服务器解压缩
下载URL:https://starrocks-public.oss-cn-zhangjiakou.aliyuncs.com/tpch-poc-1.0.zip
cd /usr/local/apps
unzip tpch-poc-1.0
生成数据
cd /usr/local/apps/tpch-poc-1.0
sh bin/gen_data/gen-tpch.sh 100 data_100
说明:生成实际数据在83.5GB左右,region、part、partsupp、supplier这4个数据文件未生成。
排查:服务器本地系统盘只有100GB,之前操作ssb占用了部分容量;
解决:把导入到tpc-h表之后的本地数据文件删除,再修改生成数据的脚本配置,重新生成以上4个数据文件。
修改生成数据脚本
cd /usr/local/apps/tpch-poc-1.0/bin/gen_data
vim gen-tpch.sh
重新执行生成数据命令
sh bin/gen_data/gen-tpch.sh 100 data_100
说明:重新生成数据文件成功,后面再重新执行导入数据操作即可。
5.1.2 创建表结构
修改配置文件conf/starrocks.conf,指定脚本操作的集群地址,重点关注mysql_host和 mysql_port,然后执行建表操作。
修改conf配置文件
cd /usr/local/apps/tpch-poc-1.0/conf
执行建表命令
cd /usr/local/apps/tpch-poc-1.0
sh bin/create_db_table.sh ddl_100
查看库表是否创建成功
5.1.3 导入数据
cd /usr/local/apps/tpch-poc-1.0
sh bin/stream_load.sh data_100
stream load error. table: orders, path: /usr/local/apps/tpch-poc-1.0/data_100/orders.tbl.2, msg: "Message": "too many filtered rows"
查看报错log:
http://172.21.235.224:8040/api/_load_error_log?file=error_log_1245a7e891e7dc94_75bd2d3a7251d084
说明:有一个执行脚本报错,错误原因:值计数与列计数不匹配。本以为是10个,结果是9个。
查询导入数据表数量
select 'customer',count(*) from tpch.customer union all
select 'lineitem',count(*) from tpch.lineitem union all
select 'nation',count(*) from tpch.nation union all
select 'orders',count(*) from tpch.orders union all
select 'part',count(*) from tpch.part union all
select 'partsupp',count(*) from tpch.partsupp union all
select 'region',count(*) from tpch.region union all
select 'supplier',count(*) from tpch.supplier ;
提示:可以看到,有4张表没数据,orders表数据只有部分,另一部分数据文件导入失败。
解决办法:重新执行导入数据操作。
重新执行导入数据操作
/usr/local/apps/tpch-poc-1.0
sh bin/stream_load.sh data_100
提示:orders第二个数据文件导入还是失败,报错:"Message": "too many filtered rows"
看日志信息,错误:值计数与列计数不匹配。本以为是10个,结果是9个。
其它4张表数据导入正常。
排查orders.tbl.2数据文件表
根据报错信息,查找196554305行数据,发现这行数据的末尾处没有加分隔符:|
解决办法:在这行数据末尾处加上|分隔符,保存退出编辑,重新执行导数命令。
#导orders数据文件到表
sh bin/stream_load.sh data_100
提示:导入orders.tbl.2数据文件到orders表成功。
提示:orders表数据已增加,数据导入完成。
5.1.4 查询测试
cd /usr/local/apps/tpch-poc-1.0
sh bin/benchmark.sh
测试结论:执行22条SQL查询,有3个SQL查询耗时3秒,19个SQL查询耗时基本在1秒左右完成。
集群BE CPU使用率17%;集群FE内存使用率占比4.86%;
5.2 TPC-DS性能测试
TPC-DS是美国交易处理效能委员会TPC(Transaction Processing Performance Council)组织制定的用来模拟决策支持系统的测试集。与TPC-H相比,TPC-DS是一个更加复杂和全面的基准测试集。
TPC-DS是一套决策支持系统的基准测试,它对决策支持系统的几个通用方面进行建模,包括查询和数据维护,用于衡量大数据产品的分析性能。TPC-DS模拟了零售企业三种销售渠道(实体店、互联网、目录)的销售和退货业务,除了建立相关销售和退货模型的表格,它还包括一个简单的库存系统和一个促销系统。该测试共包含24张表,数据量可设定从1 GB 到3 TB不等。基准测试共包含99个复杂查询,主要的评价指标为各个查询的响应时间,即从提交查询到结果返回所需时间。
5.2.1 生成测试数据
测试表
call_center 30
catalog_page 20400
catalog_returns 14404374
catalog_sales 143997065
customer_address 1000000
customer_demographics 1920800
customer 2000000
date_dim 73049
household_demographics 7200
income_band 20
inventory 399330000
item 204000
promotion 1000
reason 55
ship_mode 20
store 402
store_returns 28795080
store_sales 287997024
time_dim 86400
warehouse 15
web_page 2040
web_returns 7197670
web_sales 72001237
web_site 24
首先下载ssb-poc工具包并编译
下载url:https://starrocks-public.oss-cn-zhangjiakou.aliyuncs.com/ssb-poc-1.0.zip
#上传工具包到服务器并解压缩
cd /usr/local/apps
unzip tpcds-poc-1.0.zip
生成数据
cd /usr/local/apps/tpcds-poc-1.0
sh bin/gen_data/gen-tpcds.sh 100 data_100
5.2.2 创建表结构
修改配置文件conf/starrocks.conf,指定脚本操作的集群地址,重点关注mysql_host和 mysql_port,然后执行建表操作。
#执行建表命令
/usr/local/apps/tpcds-poc-1.0
sh bin/create_db_table.sh ddl_100
#查看库表是否创建成功
mysql -h172.21.235.202 -uroot -P9030
show databases;
show tables;
5.2.3 导入数据
cd /usr/local/apps/tpcds-poc-1.0/
sh bin/stream_load.sh data_100
提示:导入文件catalog_sales_90_100.dat的时候报错中断,看日子错误明细:值计数与列计数不匹配。预期是27,结果是23;
导入文件catalog_returns_90_100.dat的时候报错中断,看日子错误明细:值计数与列计数不匹配。预期是34,结果是26。
排查:查看catalog_returns_90_100.dat数据文件报错那行列数,只有23列,与表字段27列不符合,所以报错;
查看catalog_sales_90_100.dat数据文件报错那行列数,只有26列,与表字段34列不符合,所以报错。
解决办法:补齐列数
#重新导入以上修复的2个文件
在执行导入命令之前,先删除已经导入过的数据文件。
5.2.4 查询测试
cd /usr/local/apps/tpcds-poc-1.0
sh bin/benchmark.sh -p -d tpcds
测试结论:执行99条查询SQL,查询耗时1s内的有69个,查询耗时1-2s的有19个,
耗时2-3s的3个,耗时3-4s的4个,耗时5s的1个,耗时9s的1个,耗时11s的1个,耗时16s的1个,查询总耗时2.25分钟。
StarRocks集群BE CPU空闲率67.9%,使用率32%。
StarRocks集群BE 内存使用10.6GB。(初始状态占用内存8.8GB)
StarRocks集群FE JVM堆内存使用情况:470-480MB
StarRocks集群BE的数据行扫描速率
5.3 SSB Flat Table性能测试
Star Schema Benchmark(以下简称 SSB)是学术界和工业界广泛使用的一个星型模型测试集,通过这个测试集合可以方便的对比各种OLAP产品的基础性能指标。ClickHouse通过改写 SSB,将星型模型打平转化成宽表(flat table),改造成了一个单表测试benchmark。
表名 行数 说明
lineorder 6亿 SSB商品订单表
customer 300 万 SSB客户表
part 140万 SSB零部件表
supplier 20万 SSB供应商表
dates 2556 日期表
lineorder_flat 6亿 SSB打平后的宽表
5.3.1 下载编译ssb-poc包并生成测试数据
下载ssb-poc工具包
下载url:https://starrocks-public.oss-cn-zhangjiakou.aliyuncs.com/ssb-poc-1.0.zip
将工具包上传至服务器目录并解压缩
cd /usr/local/apps
unzip ssb-poc-1.0.zip
编译ssb
cd ssb-poc-1.0/
make && make install
提示:编译完成后,所有相关工具都安装在output目录下,后续所有操作都在output目下进行。
生成SSB标准测试集scale factor=100的数据
cd output/
#运行生成数据的脚本
sh bin/gen-ssb.sh 100 data_dir
5.3.2 生成数据
修改配置文件conf/starrocks.conf,指定脚本操作的集群地址,重点关注mysql_host和mysql_port,然后执行建表操作。
#编辑conf文件
cd /usr/local/apps/ssb-poc-1.0/output/conf
vim starrocks.conf
mysql_host: 172.21.228.85
#运行建表脚本
sh bin/create_db_table.sh ddl_100
报错:没有找到python3命令
#查看linux python版本
python3 --version
只默认安装了python2.7.5,执行创建表结构需要python3环境,安装python3。
#安装好python3后,第二次执行建表命令。
sh bin/create_db_table.sh ddl_100
报错:导入pymysql为_mysql,没有名为'pymysql'的模块。
解决办法:离线安装pymysql模块,可跳转到5.2.2.3目录查看。
#安装好pymysql模块后,第三次执行创建表命令。
sh bin/create_db_table.sh ddl_100
#mysql客户端查看生成的库表
mysql -h172.21.228.85 -uroot -P9030
库表创建成功。
5.3.2.1 Python3安装
下载python3.7.0版本
在linux上执行:wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tgz
若是无法访问外网,则在本地桌面下载好上传至服务器目录/usr/local/apps。
解压编译源码
先安装一下依赖的环境(非常重要,要不然后面会报错):
yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel gcc libffi-devel
1> 为了方便管理,首先在/usr/local/下面创建一个文件,作为安装Python的目标文件,这里取名为Python3。在Linux中一般习惯把用户安装的软件安装在/usr/local/XXX/下。
创建目录:mkdir -p /usr/local/python3
2> 解压下载好的Python安装压缩包
tar -zxvf Python-3.7.0.tgz
3> 解压完成后,进入生成的目录。
cd Python-3.7.0/
4> 接着执行命令,设置Python的安装目录为/usr/local/Python3。
./configure --prefix=/usr/local/Python3
5> 配置完成上一步之后开始编译源码
执行命令:make
6> 安装python3
编译完成后,编译安装,执行命令:make install。
7> 调整系统默认Python指向
安装完成后,在终端输入python或python3命令,如果出现的版本依然是原来的默认版本,那么就需要创建链接。
第一种做法:在终端中输入以下命令删除原有对Python 2的软链接
rm /usr/bin/python
再创建新的链接:
ln -s /usr/local/Python3/bin/python3 /usr/bin/python
ln -s /usr/local/Python3/bin/pip3 /usr/bin/pip
第二种做法(推荐):在不删除原指向python2软链接的情况下,新增一个指向python3的软链接,然后修改配置,更改为python3地址。
#将/usr/local/python3/bin加入PATH
vim ~/.bash_profile
PATH=$PATH:$HOME/bin:/usr/local/Python3/bin
export PATH
保存退出:wq,使修改立即生效:source ~/.bash_profile
5.3.2.2 检查Python3及pip3是否正常可用
python3 -V
pip3 -V
5.3.2.3 安装pymysql模块
下载pymysql模块1.1.0版本
https://pypi.org/project/pymysql/1.1.0/#files
#上传到linux任意目录中,先上传到/tmp目录下。
cd /tmp
移动文件:mv PyMySQL-1.1.0-py3-none-any.whl /usr/local/apps/
执行安装命令即可
python3 -m pip install /usr/local/apps/PyMySQL-1.1.0-py3-none-any.whl
Pymysql模块安装成功。
提示:下载.tar.gz格式文件也可以安装,未尝试。
5.3.3 导入数据
5.3.3.1 使用Stream Load导入多表数据
#运行导入数据命令
.bin/stream_load.sh data_dir
报错:没有权限
解决办法:给stream_load.sh文件赋予读写执行权限sudo chmod 777 bin/stream_load.sh
#第二次运行导入数据命令
Error:导入数据到lineorder表失败。
#查找导入数据到lineorder表失败原因
cd /data/starrocks/be/log
cat be.WARNING.log.20230630-111904
fe.warning.log文件中打印的每条信息都有对应的label,然后根据label去对应的be.info.log文件中检索。
编辑:vim be.INFO.log.20230630-111903
检索label,输入label号:/13224
检索出label对应的信息,显示报错内容:fail to write into socket,但这根本看不出来写入失败的真正原因是什么,找不到更清晰明确的报错信息。
后面在starrocks官网查看有关导入数据相关信息,官方确实有导入数据模块的介绍。
访问地址:https://docs.starrocks.io/zh-cn/latest/loading/StreamLoad
#查看集群BE的参数配置项,确认导入单个文件的大小上限。
访问BE,查看动态参数项:http://172.21.228.85:8045/varz
Streaming_load_max_mb默认值102400MB(60GB),满足导入文件需求,此次导入的这个数据文件大小是59GB,所以无需调整此参数,排除单个文件大小限制原因。
#查看集群FE的参数配置项,确认导入作业超时时间。
访问FE集群,查看动态参数项:http://172.21.228.85:8030/variable
stream_load_default_timeout_second=600,导入超时默认值为10分钟。
验证:两次测试导入数据,观察发现从导入开始时间到导入中断截止,整耗时10分钟,与超时参数值一致,因此推断是由于导入数据时间超出默认值,导致导入中断。
解决办法:修改FE参数配置,将导入超时时间调大,修改为10800(3小时)。
ADMIN SET FRONTEND CONFIG ("stream_load_default_timeout_second" = "10800");
刷新页面,查看参数已更新。
#重新运行导入数据脚本命令
cd /usr/local/apps/ssb-poc-1.0/output
sh ./bin/stream_load.sh data_dir
数据导入lineorder表成功,耗时22分钟。
注意:FE Web UI页面分两部分,一部分是Configure Info(fe的参数),一部分是Variable Info(系统变量)。
系统变量可在mysql查看:show variables like "%%";
BE动态参数项也可在linux上查看:curl http://172.21.228.85:8045/varz
5.3.3.2 生成ssb单表数据
#使用INSERT INTO将多表打平成单表
sh ./bin/flat_insert.sh data_dir
#导入前后查询lineorder_flat表
mysql -h172.21.228.85 -P9030 -uroot
use ssb;
select * from lineorder_flat limit 5;
数据写表成功。
5.3.3.3 查询表数据量
mysql -h172.21.228.85 -P9030 -uroot
use ssb;
select 'customer',count(1) from customer union all
select 'dates',count(1) from dates union all
select 'part',count(1) from part union all
select 'supplier',count(1) from supplier union all
select 'lineorder',count(1) from lineorder union all
select 'lineorder_flat',count(1) from lineorder_flat;
5.3.4 查询测试
5.3.4.1 测试ssb多表查询
SQL参见/usr/local/apps/ssb-poc-1.0/output/share/ssb_test/sql/ssb/
SQL文件:/usr/local/apps/ssb-poc-1.0/output/share/ssb_test/sql/query/single-file-ssb.sql
运行测试脚本
执行多表测试脚本,会执行多表测试的13个SQL,SQL复杂度递增,从两个表join到5个表join,最后返回每个SQL的查询时长(单位为毫秒)。
cd /usr/local/apps/ssb-poc-1.0/output/bin
sh ./benchmark.sh ssb
测试结论:13条SQL查询,查询耗时全在1秒以内完成。集群CPU使用率30%,集群各节点内存使用率占比4%
5.3.4.2 测试ssb单表查询(大宽表)
SQL参见/usr/local/apps/ssb-poc-1.0/output/share/ssb_test/sql/ssb/
SQL文件:/usr/local/apps/ssb-poc-1.0/output/share/ssb_test/sql/query/single-file-ssb-flat.sql
运行测试脚本
执行单表测试脚本,会执行单表测试的13个SQL,用到的表是前面的lineorder_flat。脚本会返回每个SQL的查询时长,时间单位为毫秒。
cd /usr/local/apps/ssb-poc-1.0/output/bin
sh ./benchmark.sh ssb-flat
测试结论:单表(大宽表)SQL查询,查询耗时全在1秒以内完成,集群CPU最大使用率16%,集群内存使用率25%,大宽表查询速度比多表查询耗时更短,消耗资源更少。
六、功能验证测试
6.1 数据导入测试
6.1.1 Kafka Topic数据导入StarRocks
6.1.1.1 Routine Load方式
先要在kafka集群创建topic造数据
6.1.1.1.1 创建Kafka Topic
在evoc-slave4节点kafka集群上操作
cd /opt/cloudera/parcels/CDH-6.3.1-1.cdh6.3.1.p0.1470567/bin
#查询现有topic列表
./kafka-topics --zookeeper evoc-slave1:2181/kafka --list
创建新Topic
./kafka-topics --zookeeper evoc-slave1:2181/kafka --create -replication-factor 1 --partitions 1 --topic StarrocksTopic
通过代码往StarrocksTopic写数据
写5条数据
写完成后消费topic数据
./kafka-console-consumer --bootstrap-server evoc-slave4:9092 --topic StarrocksTopic --from-beginning
提示:kafka生产消费正常
#嵌套json
启动生产者
./kafka-console-producer --broker-list evoc-slave4:9092 --topic StarrocksTopic2
{"data": [{"commodity_id": 26,"country": "中国","customer_name": "测试","pay_time": "2024-03-18","price": 1000.8}],"database": "yx_statistic","es": 1710493967000,"id": 2,"isDdl": false,"mysqlType": {"id": "int"},"old": null,"pkNames": null,"sql": "","sqlType": {"id": 4},"table": "a","ts": 1710493968471,"type": "INSERT"}
{"data": [{"commodity_id": 26,"country": "中国","customer_name": "测试","pay_time": "2024-03-18","price": 1000.8}],"database": "yx_statistic","es": 1710493967000,"id": 2,"isDdl": false,"mysqlType": {"id": "int"},"old": null,"pkNames": null,"sql": "","sqlType": {"id": 4},"table": "a","ts": 1710493968471,"type": "INSERT"}
#启动消费者
./kafka-console-consumer --bootstrap-server evoc-slave4:9092 --topic StarrocksTopic2 --from-beginning
6.1.1.1.2 创建目标表
https://docs.starrocks.io/zh/docs/3.1/loading/RoutineLoad/#%E4%BF%AE%E6%94%B9%E5%AF%BC%E5%85%A5%E4%BD%9C%E4%B8%9A
在StarRocks集群的目标数据库test中创建表example_tbl3,并且列名与JSON数据中需要导入的Key一致。
CREATE TABLE example_table (
`commodity_id` varchar(26) NULL COMMENT "品类ID",
`country` varchar(26) NULL COMMENT "顾客国籍",
`customer_name` varchar(26) NULL COMMENT "顾客姓名",
`pay_time` varchar (50) NULL COMMENT "支付时间",
`price` double SUM NULL COMMENT "支付金额"
)
AGGREGATE KEY(`commodity_id`,`country`,`customer_name`,`pay_time`)
DISTRIBUTED BY HASH(`commodity_id`);
6.1.1.1.3 导入作业
简单模式(实测)
提交导入作业时使用简单模式,即无需使用jsonpaths和COLUMNS参数,就可以将Kafka 集群的Topic中的JSON数据导入至目标表example_table中。
CREATE ROUTINE LOAD example_table_load ON example_table
PROPERTIES
(
"desired_concurrent_number"="1",
"format" = "json"
)
FROM KAFKA
(
"kafka_broker_list" = "172.21.228.85:9092,172.21.228.86:9092,172.21.228.87:9092",
"kafka_topic" = "StarrocksTopic",
"kafka_partitions" = "0",
"kafka_offsets" = "OFFSET_BEGINNING",
"property.group.id" = "kafka_to_starrocks"
);
精确模式
CREATE ROUTINE LOAD example_db.test1 ON example_tbl
COLUMNS(category, author, price, timestamp, dt=from_unixtime(timestamp, '%Y%m%d'))
PROPERTIES
(
"desired_concurrent_number"="3",
"max_batch_interval" = "20",
"max_batch_rows" = "300000",
"max_batch_size" = "209715200",
"strict_mode" = "false",
"format" = "json",
"jsonpaths" = "[\"$.category\",\"$.author\",\"$.price\",\"$.timestamp\"]",
"strip_outer_array" = "true"
)
FROM KAFKA
(
"kafka_broker_list" = "broker1:9092,broker2:9092,broker3:9092",
"kafka_topic" = "my_topic",
"kafka_partitions" = "0,1,2",
"kafka_offsets" = "0,0,0"
);
CREATE ROUTINE LOAD example_table_load2 ON example_table2
COLUMNS(commodity_id, country, customer_name, pay_time, price)
PROPERTIES
(
"desired_concurrent_number" = "1",
"format" = "json",
"strip_outer_array" = "true",
"json_root" = "$.data",
-- "jsonpaths" = "[\"$.data.commodity_id\",\"$.data.country\",\"$.data.customer_name\",\"$.data.pay_time\",\"$.data.price\"]"
"jsonpaths" = "[\"$.commodity_id\",\"$.country\",\"$.customer_name\",\"$.pay_time\",\"$.price\"]"
)
FROM KAFKA
(
"kafka_broker_list" = "172.21.228.85:9092,172.21.228.86:9092,172.21.228.87:9092",
"kafka_topic" = "StarrocksTopic3",
"kafka_partitions" = "0",
"kafka_offsets" = "OFFSET_BEGINNING",
"property.group.id" = "kafka_to_starrocks3"
);
#查看导入任务运行情况
在Dbeaver上查看导入任务
show routine load;
在节点上mysql连接查看
报错:ErrorReason{errCode = 4, msg='Job failed to fetch all current partition with error [failed to send proxy request to TNetworkAddress(hostname:172.21.235.224, port:8060) err failed to send proxy request to TNetworkAddress(hostname:172.21.235.224, port:8060) err [failed to get partition meta: Local: Broker transport failure]]'}
看不出来啥,查询be节点日志。
查看172.21.35.224节点日志
/starrocks-data/starrocks/be/log
编辑,输入/kafka
报错提示:获取kafka分区失败,问题定位不够清晰。
退出编辑状态,回到log目录下,输入命令:grep consumer.h be.INFO
报错提示:无法识别kafka集群地址
解决:在Starrocks集群BE节点,编辑/etc/hosts文件,添加kafka集群域名映射:
#重新执行导入语句并查询结果表
CREATE ROUTINE LOAD example_table_load ON example_table
PROPERTIES
(
"desired_concurrent_number"="1",
"format" = "json"
)
FROM KAFKA
(
"kafka_broker_list" = "172.21.228.85:9092,172.21.228.86:9092,172.21.228.87:9092",
"kafka_topic" = "StarrocksTopic",
"kafka_partitions" = "0",
"kafka_offsets" = "OFFSET_BEGINNING",
"property.group.id" = "kafka_to_starrocks"
);
查看任务(支持mysql客户端都可以执行)
show routine load task where JobName="example_table_load";
Message:there is no new data in kafka/pulsar, wait for 10 seconds to schedule again(默认10s调度一次)
select * from example_table limit 100;
说明:验证kafka数据导入聚合表example_table操作正常,验证已自动实现聚合操作。
6.1.1.1.4 查看任务情况
Routine Load任务创建后常驻后台,我们可以使用SHOW语句查看任务情况:
SHOW ROUTINE LOAD FOR example_table_load\G
可以查看当前数据库中所有正在进行的Routine Load任务,已结束的任务无法查看(暂停状态的可以)。
主要强调三个指标:
1. State:为RUNNING即表示任务正常进行中,在任务出现问题时,状态为变为PAUSED。
2. ErrorLogUrls:当任务出现错误时,可以根据这里的信息排查错误原因。
3. Progress:对于Kafka数据源,显示该主题下当前任务在每个分区的消费进度,并将该进度推给Kafka作为当前消费者组的offset。如 {"0":"34"} 表示Kafka分区0已消费数据位移为34。
6.1.1.1.5 查看当前数据库所有正在进行的routine load任务
查看当前数据库中所有例行导入任务,包括已停止或取消的任务。
SHOW ALL ROUTINE LOAD;
StarRocks中没有删除Routine Load任务的命令,在执行stop语句停止任务后,该任务还能通过SHOW ALL ROUTINE LOAD语句查看。这些已经终止的任务默认会保留三天(fe.conf中的label_keep_max_second参数),然后被定时任务清理掉。
6.1.1.1.6 查看任务及子任务运行状态
show proc "/routine_loads/example_table_load/12463"\G
show routine load task where jobname = "example_table_load";
提示:12463为使用楼上的语句查看到的Routine Load任务的Id。
6.1.1.1.7 暂停/恢复/终止任务
暂停Routine Load任务(任务可以被重新执行)
mysql> PAUSE ROUTINE LOAD FOR example_table_load;
提示:执行后任务状态为State: PAUSED
恢复暂停状态的Routine Load任务
mysql> RESUME ROUTINE LOAD FOR example_table_load;
终止Routine Load任务(任务无法恢复)
mysql> STOP ROUTINE LOAD FOR example_table_load;
提示:执行后任务状态为State: STOPPED,该任务无法被恢复,会等待定时任务将其清理。
6.1.1.1.8 数据导入参数
在文档开头部分,我们已经介绍了几个时间的参数。当同时进行的Routine Load任务较多时,我们主要留意调整这两个参数:fe.conf的max_routine_load_task_num_per_be和be.conf中的routine_load_thread_pool_size。
这两个参数,可以粗估所有Routine Load任务总共拆分为了多少task,然后平均分到每个be上,设置一个值,例如都设为50。
Routine Load作为业务中使用度非常高的导入方式,这里将涉及的主要参数也集中整理了一下,同时也包括了几个导入任务通用的参数,如下表:
角色 配置项 默认值 说明
FE max_routine_load_task_num_per_be 16 FE配置项,每个BE最大并发执行的Routine Load task数,需要小于等于BE的配置routine_load_thread_pool_size。
FE max_routine_load_task_concurrent_num 5 每个Routine Load作业最大并发执行的task数
FE max_routine_load_batch_size 4294967296 FE配置项,每个routine load task导入的最大数据量,默认4GB。
FE routine_load_task_consume_second 15 每个routine load task消费数据的最大时间,默认为15s。
FE routine_load_task_timeout_second 60 FE配置项,每个routine load task超时时间,默认60s。
FE period_of_auto_resume_min 5 默认是5分钟。StarRocks重新调度,只会在5分钟这个周期内,最多尝试3次。
如果3次都失败则锁定当前任务,后续不在进行调度。但可通过人为干预,进行手动恢复。
FE max_running_txn_num_per_db 1000 每个数据库并发导入的任务数,一般不建议调大。
FE routine_load_kafka_timeout_second 12
FE routine_load_pulsar_timeout_second 12
FE routine_load_scheduler_interval_millisecond
10000
FE min_routine_load_lag_for_metrics 10000
FE enable_routine_load_lag_metrics= false
BE max_consumer_num_per_group 3 该参数表示一个子任务中最多生成几个consumer进行数据消费。对于Kafka数据源,一个consumer可能消费一个或多个kafka partition。
假设一个任务需要消费6个kafka partition,则会生成3个consumer,每个consumer消费2个partition。如果只有2个partition,则只会生成2个consumer,每个consumer消费1个partition。
BE inc_rowset_expired_sec 1800 过期版本回收时间。导入生效的数据,存储引擎保留的时间,用于增量克隆。当磁盘空间还剩余较大但却出现报错disk on backend 10003 exceed limit usage时,可以适当调小,比如调整为600,同时尽快给磁盘扩容,建议磁盘利用率控
制在50%以内。
BE routine_load_kafka_timeout_second 10
BE routine_load_pulsar_timeout_second 10
备注:上表中所有的FE配置项都可以在运行时修改。
详情见:https://blog.csdn.net/ult_me/article/details/122865142
6.1.2 从Mysql实时同步
将MySQL的数据实时(秒级)同步至StarRocks,支撑企业实时分析和处理海量数据的需求。
6.1.2.1 基本原理
实时同步MySQL至StarRocks分成同步库表结构、同步数据两个阶段进行。首先StarRocks Migration Tool(数据迁移工具,以下简称 SMT)将MySQL的库表结构转化成StarRocks的建库和建表语句。然后Flink集群运行Flink job,同步MySQL全量及增量数据至StarRocks。具体同步流程如下:
说明:MySQL实时同步至StarRocks能够保证端到端的exactly-once的语义一致性。
1. 同步库表结构
SMT根据其配置文件中源MySQL和目标StarRocks的信息,读取MySQL中待同步的库表结构,并生成 SQL 文件,用于在 StarRocks 内创建对应的目标库表。
2. 同步数据
Flink SQL客户端执行导入数据的SQL语句(INSERT INTO SELECT语句),向Flink集群提交一个或者多个长时间运行的Flink job。Flink集群运行Flink job ,Flink cdc connector先读取数据库的历史全量数据,然后无缝切换到增量读取,并且发给flink-starrocks-connector,最后 flink-starrocks-connector攒微批数据同步至StarRocks。
注意:仅支持同步DML,不支持同步DDL。
6.1.2.2 下载并安装同步工具
同步时需要使用SMT、Flink、Flink CDC connector、flink-starrocks-connector,下载和安装步骤如下。
1. 下载安装并启动Flink集群
省略……之前已经搭建部署过。
2. 下载Flink CDC connector
本示例的数据源为MySQL,因此下载flink-sql-connector-mysql-cdc-x.x.x.jar。并且版本需支持对应的Flink版本,两者版本支持度,请参见:
https://ververica.github.io/flink-cdc-connectors/release-2.2/content/about.html#supported-flink-versions。
这里使用 Flink 1.13.5,因此可以使用flink-sql-connector-mysql-cdc-2.1.1.jar。
3. 下载flink-connector-starrocks,并且其版本需要对应Flink的版本
flink-connector-starrocks的JAR包(x.x.x_flink-y.yy_z.zz.jar)会包含三个版本号:
第一个版本号x.x.x为flink-connector-starrocks的版本号。
第二个版本号y.yy为其支持的Flink版本号。
第三个版本号z.zz为Flink支持的Scala版本号。如果Flink为1.14.x以及之前版本,则需要下载带有Scala版本号的flink-connector-starrocks。
https://central.sonatype.com/artifact/com.starrocks/flink-connector-starrocks/1.1.13_flink-1.13/versions
下载文件:flink-connector-starrocks-1.1.13_flink-1.13.jar
4. 将Flink CDC connector、Flink-connector-starrocks的JAR包 :
flink-sql-connector-mysql-cdc-2.1.1.jar、flink-connector-starrocks-1.1.13_flink-1.13.jar移动至Flink的lib目录。
将下载好jar包上传到172.21.228.82节点并放置在Flink-1.13.5目录下
5. 下载并解压SMT,并将其放在flink-1.14.5目录下。您可以根据操作系统和CPU架构选择对应的SMT安装包。
6.1.2.3 开启mysql Binlog日志
需要确保已经开启MySQL Binlog日志,实时同步时需要读取MySQL Binlog日志数据,解析并同步至StarRocks。
1. 编辑MySQL配置文件my.cnf (默认路径为/etc/my.cnf),以开启MySQL Binlog。
# 设置 server_id
server_id = 1
# 设置 Binlog 模式为 ROW
binlog_format = ROW
# 设置 Binlog 的存储位置
log_bin = mysql-bin
2. 执行如下命令,重启 MySQL,生效修改后的配置文件。
# 使用service启动
systemctl restart mysqld
3. 连接 MySQL,执行如下语句确认是否已经开启Binlog
-- 连接 MySQL
mysql -h xxx.xx.xxx.xx -P 3306 -u root -pxxxxxx
-- 检查是否已经开启 MySQL Binlog,`ON`就表示已开启
mysql> SHOW VARIABLES LIKE 'log_bin';
6.1.2.4 同步库表结构
配置SMT配置文件。进入SMT的conf目录,编辑配置文件config_prod.conf。例如源MySQL连接信息、待同步库表的匹配规则,flink-starrocks-connector配置信息等。
6.1.2.4.1 在本地mysql创建测试表并造数
#创建员工表
CREATE TABLE `employee` (
`employee_no` int primary key auto_increment,
`employee_name` varchar(30) NOT NULL,
`sex` varchar(4) NOT NULL,
`address` varchar(50) NOT NULL,
`telephone` varchar(20) NOT NULL,
`create_date` datetime DEFAULT NULL,
`department` varchar(30) NOT NULL
PRIMARY KEY (`employee_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
#插入数据
INSERT INTO employee VALUES (1, '张三', '男', '南京市','13114725854','2024-01-23 16:25:00','电商一部');
INSERT INTO employee VALUES (2, '李四', '男', '武汉市','13114725855','2024-01-23 16:25:30','电商一部');
INSERT INTO employee VALUES (3, '王五', '男', '重庆市','13114725856','2024-01-23 16:25:40','电商一部');
INSERT INTO employee VALUES (4, '刘一手', '男', '上海市','13114725857','2024-01-23 16:25:50','电商一部');
INSERT INTO employee VALUES (5, '臻美丽', '女', '长沙市','13114725858','2024-01-23 16:25:55','电商一部');
6.1.2.4.2 修改smt配置文件
cd /usr/local/apps/flink-1.13.5/smt/conf
vim config_prod.conf
参数说明:
[db] 源数据库的连接信息
type:源数据库类型,本示例中源数据库为 mysql。
host :MySQL 所在服务器的 IP 地址。
port:MySQL 端口号,默认为3306。
user :用户名。
password:用户登录密码。
[table-rule.1] 库表匹配规则,以及对应的flink-connector-starrocks 配置。
如果需要为不同表匹配不同的 flink-connector-starrocks 配置,例如部分表更新频繁,需要提高导入速度,请参见以下链接补充说明。
如果需要将 MySQL 分库分表后的多张表导入至 StarRocks的一张表中,请参见补充说明:https://docs.starrocks.io/zh/docs/3.1/loading/Flink_cdc_load/#%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98。
database、table:MySQL 中同步对象的库表名,支持正则表达式。
flink.starrocks.*:flink-connector-starrocks 的配置信息,更多配置和说明,请参见:
https://docs.starrocks.io/zh/docs/3.1/loading/Flink-connector-starrocks/#%E5%8F%82%E6%95%B0%E8%AF%B4%E6%98%8E
[other] 其他信息
be_num:StarRocks 集群的BE节点数(后续生成的StarRocks建表SQL文件会参考该参数,设置合理的分桶数量)。
use_decimal_v3:是否开启decimalV3。开启后,MySQL 小数类型的数据同步至 StarRocks 时会转换为decimalV3。
output_dir:待生成的SQL文件的路径。SQL 文件会用于在StarRocks集群创建库表,向Flink集群提交Flink job。默认为./result,不建议修改。
6.1.2.4.3 生成sql文件
执行如下命令,SMT会读取MySQL中同步对象的库表结构,并且结合配置文件信息,在result目录生成SQL文件,用于StarRocks集群创建库表(starrocks-create.all.sql), 用于向Flink集群提交同步数据的flink job(flink-create.all.sql)。并且源表不同,则 starrocks-create.all.sql中建表语句默认创建的数据模型不同。
如果源表没有Primary Key、Unique Key,则默认创建明细模型。
如果源表有Primary Key、Unique Key,则区分以下几种情况:
1. 源表是Hive表、ClickHouse MergeTree表,则默认创建明细模型。
2. 源表是ClickHouse SummingMergeTree表,则默认创建聚合模型。
3. 源表为其他类型,则默认创建主键模型。
# 运行 SMT
cd /usr/local/apps/flink-1.13.5/smt
./starrocks-migrate-tool
提示:初始化数据库失败,得到错误1130:主机'172.21.228.82'不允许连接到这个MySQL服务器。
解决办法:如果我们想使用mysqluser账户和其对应的密码 mysqlpassword从任何主机连接到mysql服务器,就需要进行如下操作:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'Evoc@1993' WITH GRANT OPTION;
#再次在evoc-slave1节点Flink目录下运行SMT命令
说明:执行成功。
# 进入并查看 result 目录中的文件
cd result
# 查看sql文件内容
vim starrocks-create.all.sql
提示:生成建表文件,建表语句默认3副本1个桶。
6.1.2.4.4 创建目标库和表
执行如下命令,连接StarRocks,并执行SQL文件starrocks-create.all.sql,用于在StarRocks集群创建目标库和表。
推荐使用SQL文件中默认的建表语句,本示例中建表语句默认创建的数据模型为主键模型。
#执行命令、回车。
mysql -h 172.21.235.202 -P 9030 -u root -p < starrocks-create.all.sql
注意:
1. 您也可以根据业务需要,修改 SQL 文件中的建表语句,基于其他模型创建目标表。
2. 如果您选择基于非主键模型创建目标表,StarRocks 不支持将源表中 DELETE 操作同步至非主键模型的表,请谨慎使用。
StarRocks集群查询库表
说明:表创建成功,无数据。
6.1.2.5 同步数据
运行Flink集群,提交Flink job,启动流式作业,源源不断将MySQL数据库中的全量和增量数据同步到StarRocks中。
进入Flink目录,执行如下命令,在Flink SQL客户端运行SQL文件flink-create.all.sql。
该SQL文件定义了动态表source table、sink table,查询语句INSERT INTO SELECT,并且指定connector、源数据库和目标数据库。Flink SQL客户端执行该SQL文件后,向Flink集群提交一个Flink job,开启同步任务。
查看flink-create.all.sql文件
执行同步命令
cd /usr/local/apps/flink-1.13.5
./bin/sql-client.sh -f ./smt/result/flink-create.all.sql
查看Flink Web集群
说明:任务提交成功,但运行失败报错。
Cannot load user class: com.starrocks.connector.flink.table.sink.StarRocksDynamicSinkFunctionV2
ClassLoader info: URL ClassLoader:
找不到类:StarRocksDynamicSinkFunctionV2
提示:已解决,由于另外两台Flink集群节点忘记上传依赖包问题导致。
6.1.2.5.1 排查问题
排查Flink集群上的evoc-slave1节点lib目录下上传的依赖包flink-connector-starrocks中有没有这个类
使用JDGUI反编译工具编译依赖包:flink-connector-starrocks-1.2.9_flink-1.13_2.11.jar
说明:StarRocksDynamicSinkFunctionV2类在依赖包中存在,排除依赖包缺失该类问题。
排查mysql binlog是否正常
mysql -uroot -p
mysql> show master logs;
mysql> show master status;
show variables like 'log_%';
cd /var/lib/mysql/
说明:binlog生成正常,排除binlog原因。
创建无主键mysql表测试
在mysql创建一个无主键的users表,看下针对无主键类型表,执行同步数据到starrocks表,任务是否会报错。
修改smt配置文件,生成创建表文件
在Flink节点上操作
cd /usr/local/apps/flink-1.13.5/smt/conf
vim config_prod.conf
cd /usr/local/apps/flink-1.13.5/smt
./starrocks-migrate-tool
#执行建表命令
在result目录下
mysql -h 172.21.235.202 -P 9030 -u root -p < starrocks-create.all.sql
#执行同步数据命令
cd /usr/local/apps/flink-1.13.5
./bin/sql-client.sh -f ./smt/result/flink-create.all.sql
注意:在flink1.13版本支持根据mysql主键多并发读取数据功能,如果mysql没有设置主键,with里面要加'scan.incremental.snapshot.enabled' = 'false'否则会报错。
#修改flink执行脚本配置
cd /usr/local/apps/flink-1.13.5/smt/result
vim flink-create.all.sql
#重新执行同步数据命令
./bin/sql-client.sh -f ./smt/result/flink-create.all.sql
说明:任务提交成功,但运行报错,错误跟上面一个任务一样。
继续排查问题,发现在Flink HA集群上,我只在evoc-slave1这节点上传了flink-connector-starrocks-1.2.9_flink-1.13_2.11.jar包,其它evoc-slave2、evoc-slave3节点没有上传这个jar包。
提示:在另外两台Flink集群节点将jar包补齐,然后重启Flink集群,再重新执行同步数据命令即可。
重启Flink集群并且重跑同步数据任务
cd /usr/local/apps/flink-1.13.5/bin
#停止集群
./stop-cluster.sh
#启动集群
./start-cluster.sh
#重新执行同步数据命令
cd /usr/local/apps/flink-1.13.5
./bin/sql-client.sh -f ./smt/result/flink-create.all.sql
#查看Flink Web浏览器页面
#查看StarRocks集群库表
6.1.2.5.2 mysql users表新增/更新/删除数据测试
新增数据
INSERT INTO users VALUES (4, '老刘', 38, '男');
INSERT INTO users VALUES (5, '老王', 35, '男');
INSERT INTO users VALUES (6, '老张', 33, '男');
#查询Starrocks users表
说明:mysql新增数据实时同步到starrocks表
更新数据
update users set name='老刘_更新数据' WHERE id=4;
说明:更新无效,明细模型表只能追加数据,因为没有主键。
删除一条数据
delete from users where id=6;
说明:非主键模型表,不支持同步删除数据。
6.2 跨集群数据迁移测试
#测试对象
源端:佛山-测试环境-Starrocks集群(自测环境)
目的端:佛山-测试环境-Starrocks集群(跳蚤市场)
源端集群 目的端集群
172.21.235.202 172.21.251.231 (迁移工具)
172.21.235.213 172.21.251.234
172.21.235.227 172.21.251.246
172.21.235.212 172.21.251.172
172.21.235.217 172.21.251.190
172.21.235.224 172.21.251.196
跨集群数据迁移工具
StarRocks跨集群数据迁移工具是社区提供的StarRocks数据迁移工具。可以使用该工具将数据从源集群一键式迁移到目标集群。
备注:
1、StarRocks跨集群数据迁移工具仅支持从存算一体集群迁移数据到存算一体集群或者存算分离集群。
2、数据迁移的目标集群必须为v3.1.8或v3.2.3及以上版本。
6.2.1 安装工具
推荐在数据迁移目标集群所在的服务器上安装迁移工具
#下载工具安装包
wget https://releases.starrocks.io/starrocks/starrocks-cluster-sync.tar.gz
提示:可在光明云桌面环境提前下载。
#上传安装包到服务器目录并解压安装包
在跳蚤市场项目StarRocks集群上部署数据迁移工具
cd /usr/local/apps
tar -xvzf starrocks-cluster-sync.tar.gz
6.2.2 配置工具
#进入解压后的文件夹,并修改配置文件。
cd starrocks-cluster-sync
vim conf/sync.properties
文件内容如下:
# If true, all tables will be synchronized only once, and the program will exit automatically after completion.
one_time_run_mode=false
source_fe_host=172.21.235.202
source_fe_query_port=9030
source_cluster_user=root
source_cluster_password=evoc@1993
source_cluster_token=73dfa8e7-c98b-47c1-bc42-0fa02526dd63
target_fe_host=172.21.251.231
target_fe_query_port=9030
target_cluster_user=root
target_cluster_password=evoc@1993
target_cluster_storage_volume=
meta_job_interval_seconds=180
ddl_job_interval_seconds=15
ddl_job_batch_size=10
ddl_job_allow_drop_target_only=false
ddl_job_allow_drop_schema_change_table=true
ddl_job_allow_drop_inconsistent_partition=true
replication_job_interval_seconds=15
replication_job_batch_size=10
# Comma-separated list of database names or table names like <db_name> or <db_name.table_name>
# example: db1,db2.tbl2,db3
# Effective order: 1. include 2. exclude
include_data_list=test.example_table
exclude_data_list=
6.2.2.1 同步任务参数
参数名 描述
one_time_run_mode 是否开启一次性同步模式。开启一次性同步模式后,迁移工具只进行全量同步,不进行增量同步。
source_fe_host 源集群FE的IP地址或FQDN。
source_fe_query_port 源集群FE的查询端口(query_port)。
source_cluster_user 用于登录源集群的用户名。此用户需要有SYSTEM级OPERATE权限。
source_cluster_password 用于登录源集群的用户密码。
source_cluster_token 源集群的Token。关于如何获取集群Token,见以下获取集群Token部分。
target_fe_host 目标集群FE的IP地址或FQDN。
arget_fe_query_port 目标集群FE的查询端口(query_port)。
target_cluster_user 用于登录目标集群的用户名。此用户需要有SYSTEM级OPERATE权限。
target_cluster_password 用于登录目标集群的用户密码。
meta_job_interval_seconds 迁移工具获取源集群和目标集群元数据的周期,单位为秒。此项您可以使用默认值。
ddl_job_interval_seconds 迁移工具在目标集群执行DDL的周期,单位为秒。此项您可以使用默认值。
ddl_job_batch_size 迁移工具在目标集群执行DDL的批大小。此项您可以使用默认值。
ddl_job_allow_drop_target_only 迁移工具是否自动删除仅在目标集群存在而源集群不存在的数据库,表或分区。默认为false,即不删除。此项您可以使用默认值。
ddl_job_allow_drop_schema_change_table 迁移工具是否自动删除源集群和目标集群Schema不一致的表,默认为true,即删除。此项您可以使用默认值。迁移工具会在同步过程中自动同步删除的表。
ddl_job_allow_drop_inconsistent_partition 迁移工具是否自动删除源集群和目标集群数据分布方式不一致的分区,默认为true,即删除。此项您可以使用默认值。迁移工具会在同步过程中自动同步删除的分区。
replication_job_interval_seconds 迁移工具触发数据同步任务的周期,单位为秒。此项您可以使用默认值。
replication_job_batch_size 迁移工具触发数据同步任务的批大小。此项您可以使用默认值。
include_data_list 需要迁移的数据库和表,多个对象使用逗号(,)分隔。示例:db1,db2.tbl2,db3。此项优先于exclude_data_list生效。如果您需要迁移集群中所有数据库和表,则无须配置该项。
exclude_data_list 不需要迁移的数据库和表,多个对象使用逗号(,)分隔。示例:db1,db2.tbl2,db3。include_data_list优先于此项生效。如果您需要迁移集群中所有数据库和表,则无须配置该项。
6.2.2.2 获取集群Token
可以通过FE的HTTP端口获取,或通过FE节点的元数据获取集群Token。
#通过FE的HTTP端口获取集群Token (在目标或源集群上执行都可)
执行命令:curl -v http://172.21.235.202:8030/check
其中token字段即为当前集群的Token:73dfa8e7-c98b-47c1-bc42-0fa02526dd63
说明:fe_host:集群FE的IP地址或FQDN,fe_http_port:集群FE的HTTP端口。
#通过FE节点的元数据获取集群Token
登录源集群FE节点所在的服务器,执行以下命令:
cat /opt/starrocks/fe/meta/image/VERSION | grep token
6.2.3 启动迁移工具
#启动迁移工具开始数据迁移
./bin/start.sh
备注:
1. 请务必确保源集群与目标集群的 BE 节点已通过网络连通。
2. 运行期间,迁移工具会周期性地检查目标集群的数据是否落后于源集群,如果落后则会发起数据迁移任务。
3. 如果源集群持续有新数据导入,数据同步会一直进行,直至目标集群与源集群数据一致。
4. 您可以查询目标集群中处于迁移过程中的表,但请不要导入新数据(当前迁移工具未禁止导入),否则会导致目标集群数据与源集群不一致。
5. 请注意数据迁移不会自动结束。您需要手动检查确认迁移完成后停止迁移工具。
6.2.4 查看迁移进度
查看迁移工具日志
可以通过迁移工具日志log/sync.INFO.log查看迁移进度。
cd /usr/local/apps/starrocks-cluster-sync
tailf -n 50 sync.INFO.log
log同步信息:
数据库测试,源大小:18.204 KB,目标大小:0.000 B,差异:18.204 KB
数据库测试,源运行txn: 0,源完成txn: 0,目标运行txn: 0,目标完成txn: 0
总源大小:18.204 KB,总目标大小:0.000 B,总差:18.204 KB
总源运行txn: 0,总源完成txn: 0,总目标运行txn: 0,总目标完成txn: 0
同步进度:0.00%,total: 0, ddlPending: 0, ddlRunning: 0, jobPending: 0, sent: 0, jobRunning: 0, finished: 0, failed: 0, unknown: 0
24/03/25 11:32:12 INFO [sync-reporter] report(SyncJob.java:239): Sync progress: 0.00%, total: 1, ddlPending: 0, ddlRunning: 0, jobPending: 0, sent: 1, jobRunning: 0, finished: 0, failed: 0, unknown: 0
说明:表结构同步到目的端成功,数据没有同步成功,社区群反馈,说是功能有bug,等下个版本修复。
主要指标如下:
1. Sync progress:数据迁移进度。由于迁移工具会周期性地检查目标集群的数据是否落后于源集群,所以当进度为100%时,仅代表当前检查周期内数据同步完成。如果源集群持续有新数据导入,该进度可能在下次检查周期内变小。
2. total:本次迁移操作的各类Job总数。
3. ddlPending:所有待执行的DDL Job数量。
4. jobPending:所有待执行的数据同步Job数量。
5. sent:已从源集群发送但未开始运行的数据同步Job数量。理论上该值不会太大,若出现该值持续增加的情况,请联系研发人员。
6. running:正在执行的数据同步Job数量。
7. finished:执行成功的数据同步Job数量。
8. failed:执行失败的数据同步Job数量。失败的数据同步Job将会重新发送。因此,通常情况下您可以忽略该指标。若出现该值较大的情况,请联系研发人员。
9. unknown:未知状态Job的数量。理论上该值恒常为0。若出现该值不为0的情况,请联系研发人员。
查看迁移事务状态
迁移工具会为每张表开启一个事务,您可以通过查看该事务的状态了解该表迁移的状态。
语法:SHOW PROC "/transactions/<db_name>/running";
SHOW PROC "/transactions/test/running";
说明:其中<db_name>为该表所在数据库的名称。
查看分区数据版本
您可以对比源集群和目标集群中对应分区的数据版本了解该分区的迁移状态。
SHOW PARTITIONS FROM <table_name>;
说明:其中<table_name>为该分区所属表的名称。
查看数据量
您可以对比源集群和目标集群的数据量了解迁移的状态。
SHOW DATA;
查看表行数
您可以对比源集群和目标集群中表的行数了解各表迁移的状态。
SELECT
TABLE_NAME,
TABLE_ROWS
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
ORDER BY TABLE_NAME;
6.2.5 集群升级为3.2.6后再次测试跨集群同步
#前台启动同步任务
cd /usr/local/apps/starrocks-cluster-sync
./bin/start.sh
说明:前台启动,这种方式启动不太友好,若服务器会话超时或是关闭终端,那同步进程就结束了。
#后台启动同步任务(推荐)
1. nohup是no hang up的缩写,就是不挂断的意思
如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令。该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。
2. nohup和&的区别
nohup:不挂断的运行,注意并没有后台运行的功能,就是指,用nohup运行命令可以使命令永久的执行下去,和用户终端没有关系,例如我们断开SSH连接都不会影响他的运行,注意了nohup没有后台运行的意思;
&:让命令在后台运行,终端退出后命令仍旧执行。但当用户退出(挂起)的时候,命令自动也跟着退出结合起来使用nohup命令&,这样就能使命令永久的在后台执行。
启动同步命令:
nohup ./bin/start.sh > starrocks-cluster-sync.log 2>&1 &
命令解释:0–stdin(standard input),1–stdout(standard output),2–stderr(standard error) ;
2>&1是将标准错误(2)重定向到标准输出(&1),标准输出(&1)再被重定向输入到文件中。
说明:运行成功,通过jps命令可以查看到后台挂起的同步进程:32254 SyncJob。
输出文件忽略,自动生成nohup.out文件。验证新增一条数据,同步数据到目的端正常。
同步命令修改下:nohup ./bin/start.sh > nohup.out 2>&1 &
查看nohup.out内容:
#查看同步日志
cd /usr/local/apps/starrocks-cluster-sync/log
tailf -n 150 sync.INFO.log
说明:数据同步成功,初始化同步数据共30条。
#测试新增数据同步
先查询下初始化之前的表数据总数
mysql -h172.21.235.202 -uroot -P9030 -p
说明:example_table表总共30条数据。
往表里新增一条数据
INSERT INTO example_table(commodity_id, country, customer_name, pay_time, price) VALUES('10', '中国', 'huangguirong7', '2024-01-19', 1001);
#查看目的端表数据
说明:目的端跳蚤市场集群example_table表新插入一条数据,同步数据成功。
#查看同步日志
tailf -n 20 sync.INFO.log
说明:源端和目的端的表数据大小已从18.204kb变更为18.305kb,目标集群元数据同步已完成。
24/04/24 15:09:37 INFO [target-cluster-meta-collector]:
Target cluster metadata synchronization completed, elapsed: 0 minutes and 1 seconds.
24/04/24 15:10:05 INFO [sync-reporter] report::
DDL job queue size: 0
Replication job queue size: 0
Total estimated size of data pending synchronization: 0
Databases pending synchronization: []
Databases that only exist in the target cluster: []
Database test, source size: 18.305 KB, target size: 18.305 KB, diff: 0.000 B
Database test , source running txn: 0, source finished txn: 0, target running txn: 0, target finished txn: 2
Total source size: 18.305 KB, total target size: 18.305 KB, total diff: 0.000 B
Total source running txn: 0, total source finished txn: 0, total target running txn: 0, total target finished txn: 2
Sync progress: 100.00%, total: 1, ddlPending: 0, ddlRunning: 0, jobPending: 0, sent: 0, jobRunning: 0, finished: 1, failed: 0, unknown: 0
#查看同步状态
SHOW PROC "/transactions/test";
SHOW PROC "/transactions/test/running"; #运行中
#查看运行完成同步任务
SHOW PROC "/transactions/test/ finished ";
#查看分区数据版本
可以对比源集群和目标集群中对应分区的数据版本了解该分区的迁移状态。
SHOW PARTITIONS FROM example_table;
#查看数据量
show data;
#查看表行数
可以对比源集群和目标集群中表的行数了解各表迁移的状态
SELECT
TABLE_NAME,
TABLE_ROWS
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
ORDER BY TABLE_NAME;
6.3 CloudCanal同步工具(自测)
部署服务器:佛山测试环境StarRocks集群,IP:172.21.235.224 evoc-sr6节点上部署。
6.3.1 CloudCanal安装
#安装基础工具
sudo yum update
sudo yum install -y yum-utils
sudo yum install -y lsof
sudo yum install -y bc
sudo yum install -y p7zip p7zip-plugins
#下载并解压缩安装包
官网:https://www.clougence.com/
下载安装包:cloudcanal.7z 版本v3.4.0.0
执行解压缩:7z x cloudcanal.7z
#进入解压目录
官网安装文档:https://www.clougence.com/cc-doc/productOP/docker/install_linux_macos
cd /usr/local/apps/cloudcanal/install_on_docker
#运行环境准备
安装docker和docker-compose,可参考官方文档(版本 17.x.x 及以上),也可直接使用安装包提供的脚本。
# centos / rhel,进入install_on_docker目录
cd /usr/local/apps/cloudcanal/install_on_docker/support
sh ./install_centos_docker.sh
提示:Install centos docker SUCCESS。
#安装CloudCanal
# 执行安装脚本
cd /usr/local/apps/cloudcanal/install_on_docker
sh install.sh
说明:出现这个标志,说明安装成功。
#Docker查看运行的容器
#查看运行的容器
docker ps
#查看所有容器
docker ps -a
6.3.1.1 linux服务器关闭重启
#重启CloudCanal服务
cd /usr/local/apps/cloudcanal/install_on_docker
sh start.sh
说明:报错无法连接docker,docker关闭了,需要先启动docker。
#启动docker并查看服务状态
systemctl start docker
docker ps
systemctl status docker
说明:docker启动成功,检查没有容器运行。
#重启cloudcanal服务
sh restart.sh
#访问web界面
http://172.21.235.224:8111/#/data/job/list
说明:cloudcanal界面可以访问,任务没中断运行。
6.3.1.2 服务器扩容内存
#先将集群上的同步任务停止运行
#停止服务并查看集群状态
cd /usr/local/apps/cloudcanal/install_on_docker
sh stop.sh
docker ps -a
#重启集群
先启动docker
systemctl start docker
systemctl status docker
docker ps
再启动cloudcanal服务
cd /usr/local/apps/cloudcanal/install_on_docker
sh start.sh
查看服务是否启动
docker ps -a
#查看服务器内存和CPU
free -h
lscpu
#重启集群上的同步任务
说明:同步任务重启正常。
6.3.2 使用浏览器登陆控制台
http://172.21.235.224:8111
使用试用账号登陆
账号: test@clougence.com
密码: clougence2021
默认验证码: 777777
#修改密码(修改无用)
原密码:clougence2021
新密码:evoc@202403
6.3.2.1 申请免费许可证并激活
CloudCanal官网教程:https://www.clougence.com/cc-doc/license/license_use
#复制申请码
AxdCogLhIrLNrUH3uwBBU8WchwhSSymNlZOvOIZxVITgtEQhezdBDSCZhJWwLsN7+AcKVgPdVHkAvrfwy+Z9letQB6OuC6uev1DPscu56V75Vat/EA4zUc3XHRGo8lBrIY3RxfqwgeARrnMGoQjUt5tmuceWwLvRAEncrQStPXhmcmwO2gHy/3MB9ZwIOT7mkz7xkDwUkQK74Q4dvzzwUKOwCjSstDNnbNfZrNOqdFL1PYSi/waX75+Mv0oU58pA/VJX+rOhj365l4t9HCQiq4XM4fEO5twjCDXoYU4lLtVFWzgDeFhLEd0vpmcpReYs7h7itoBnWsqQeGh+6k+6CfvM9hjx0Elh6OURjYL1PlXlh77QJAZ0lfswwzXEaLZyGFbL4pRdL5VhiWFJYFCFtQwKfyRe9nGJ6JvgAfjBHgfc3AeYoYf9//BMlHubKpB1/SckPgpLAsQZUZAyT1YaEg==
#获取许可证
登录官网,CloudCanal 产品页点击,获取许可证。
https://www.clougence.com/?src=cc-doc
#输入许可证
SDkHEwBq5d0TXmsv0ur5qcRyqaftlfPEEP5iLeVPos1GXwb05FBlTtutxjh+ABfLX+zP9xJ1Rb/ha9ZJALB1+Q==CloudCanalL9z44HNXokmptiH2Q3IV6BqhtH5gkyTX/E5mkOZQ0ASVhTQJXiydS2TRr4dZIrIt5X1Gb65UInAQ59Ci00Yu8lYJB3YSd577R6Cc3DXn/lQS9XZvF7cc1YiOsHz0jvt/4u/lHlrVMRfelI+2jmmWdAZfRer2mTUk8M6bqRp3LZzDIeZWNak5FEjNUl1A5+r/RWaeCEEWUe/ZZ4UpQNWDQBlyegpQuQ8Q/pI6QiiamnsbfBXnZKmG9KnrmGrdqDfAGaF4iG0711BTa0ghMSAdwK7KbswDumQIPpPoR4WWQKXa0hzNf03EqPvSS77WaZGin7+EP+z8gGrAeUzIceCBgRwuZpxpgLsz8jk6O2Ygfi6AKTkt/nz+FqY2Y2b9kRUfTwmbLlj4BSqN7mgtYKyE/ZJRS0rRYW0a9zt1fQQd4lUWnnFRtNz4I8WMl3QMF9bOCBXi4C2RKty+XxNc5wUq7xir+sFI9y+MpIS6/kD+KnxYubctTcXsbcxmo39mrIlz5EdlTQFa2MnZck4aUdC6Y3UNUUjp3e2VAPunfH3jM3T8/EqumWoxi1ZYrm8ew57G3MOclFKpaJPACXqDdacoPwg0YNMotWkS/s+Ga9AImGQhpVCiIbSX6Yy8WCcUOPDFlKPnaPLcrDrgDNCqNH8hxnKlQIjYfUzZtpvDcJuCMpqmJDCmKRGdC7+Sl8sLkYS37Aqwl7IkLz+1XlZUNmYUcDLY9EfXBEHLS6WEAvRvQ64WR23fHokxBCB56hu3WRXb1ZQ98ygcLFJ2rNdysL3vEx448Iu55/chIj7kqgdkD/0j2xsTY2gI8eyVCm+60bkccNDsg6BNHGc428Op5wzTstcAxwdCvML6L4vbl5Zi1P/qoP/NdqiZC+NY5snOTzmI3HW6+BBAt4UJe3HxoAQZRB8AJAqNWs2Rr4xNoxeXR4xagn4SxM87xIJX1Xq5EuTxOHm25oTrh0fvvvi/I6sQ1Rqb4B3J6qiay+6tdYmJCWqO1K+gHsb0iG8l/lBIksLkTfzT2triuZoXTg0obDNC4iv2UUe/tgw0hS0fsMhN7MoXOzr1kUCeRfIHD51ejkTvgVtmMt/0YDUT/hluTQbJEXiZtXfZKcz6O7DvJ8DTMzNZFBKViR5c4v05xZqyE7uh/eK2KjGOl2nT+Lvoo8kNVQMDB4HUU0H0U1LK5oqSDui9Wvx4i79UoR9p128M8feL8XjnQT16ggHZ5nforCcaf6t7QQTiH+zhRNYwRNOteVW13cg1q/BHhgVVEzriYMROL3Aufh421yRuTLPZpznr95YOO4fQPDebX6Q2foPvscplzRaaNVq/5mcgCX/3dhBoZDrME7sgcd31/epzn4cl5MAVDuVZp/cWs5wwlodLVZvCUaTIQUC4xInvH6BXfypBN2UiIU7fWYt0YUp2nwBeypjVSpyWVXwZuSVWsjQ/NgVi11Aa1/H0UzdR/zdyAFpfKuLhju/B5tuB4fm3tnb9J/EmMfZ16slS0yOoenHUE2pY7JNIzwFY8EDhmunHEcLlmOpKHKVraji3vto91oCNLkSBffoJFOAne9mrOB7SjTpzoIu1qP/F5KaEEnKbbEPwRcA5cxVeItUBNUINh7rX8O28DbrYYu8nJwNzTOz+MG1aSwtQVumgODwEgww3MtP4ehplYGL8QLNkwUFDAw53DtJfkzKoBbUm+sMKkbOLjB45T/ti/B3/+OERXBe7/7H4cefUQbm9b/0p7UR1UjHr+4PqmDVm+Kk+XPM7ox7QAT/UW4HkxD1hLEr7asGOQ/u9VlSs4P71ZilfjFuTABsCQ3AH5thjG7gH7oqCCCFBup2vLGL/jwqgI2tdQyyT0QAy4fWmlFyy8XCpQ3sfxT76dzdbGXOgopzgwbwMfD5HMA9X54UWEAWFOZTKcbHXnYyX8pLAkR3LY/ovVeOQXRSa28Z5nV+MD/f1wqjWtmHeJQOfhfhvK09L16hqVvcwvn89jaNRA3NCo729exd1pcauTIf205L+i7LCns8NkrgYGt1CkoBYHD5lNdRfghmWCnPk9puMz75ideyDo8aRkLkfZg==
说明:填入申请码,输入申请下来的许可证,点击激活按钮即可。
6.3.3 日常运维
6.3.3.1 进入cloudcanal-mysql容器
docker exec -it cloudcanal-mysql /bin/bash
6.3.3.2 登录mysql
6.3.3.2.1 进入cloudcanal-mysql容器内登录mysql
#查看版本
mysql -version
#登录mysql
mysql -uroot -p (默认密码:123456)
show databases;
创建库表
#创建库
create database test;
#创建表
#插入数据
说明:无法输入中文
6.3.3.2.2 在容器外登录mysql
docker ps
docker exec -it cloudcanal-mysql mysql -uclougence -h172.21.228.187 -p123456
说明:访问mysql容器成功。
6.3.3.3 docker启动mysql无法输入中文以及中文不显示
6.3.3.3.1 临时解决方法
使用如下命令进入容器:
docker exec -it cloudcanal-mysql env LANG=C.UTF-8 /bin/bash
说明:可行
6.3.3.3.2 统一客户端与连接编码为utf8
登录数据库执行以下命令:
docker exec -it cloudcanal-mysql /bin/bash
mysql -uroot -p
#查看数据库编码
show variables like '%character%';
说明:可以看到docker启动的mysql这里有的编码是 latin1,我们先把这里设置成utf8。
#修改编码
set character_set_client = utf8;
set character_set_results = utf8;
set character_set_connection = utf8;
-- 或者使用下面的命令同时统一编码(以下和以上命令选择一种执行即可,效果一样)
set names 'utf8';
说明:修改成功。
#还要修改mysql的配置文件
退出数据库,修改my.cnf文件。
说明:安装vim命令失败。
把my.cnf文件拷贝到docker容器外修改好,再拷贝回docker容器内。
#重启mysql
exit退出容器,重启mysql。
docker restart mysql
#写数据到表
说明:使用第二种方法,还是不支持输入中文。
6.3.3.3.3 xxx
#查看当前编码
locale
#查询容器外的服务器编码
sudo docker cp f42fd44d39ec:/etc/profile ./
echo "export LANG=zh_CN.utf8" >>/usr/local/apps/profile
sudo docker cp /usr/local/apps/profile f42fd44d39ec:/etc/
说明:先把要修改的文件导出来,修改好后,再导入到容器目录中去。
说明:这方法也不行,还是无法在mysql容器内输入中文。
6.3.3.4 修改容器内文件
#将容器中的文件拷贝出来
sudo docker cp f42fd44d39ec:/etc/my.cnf ./
#将容器中的文件拷贝回去
sudo docker cp ./my.cnf f42fd44d39ec:/etc/
6.3.3.5 访问元数据库
CloudCanal docker版镜像带有元数据库容器,当需要访问元数据库查看或订正数据。
#登陆安装 CloudCanal 的宿主机
Linux宿主机上如果没有安装 MySQL Client 可以使用如下命令安装,其他操作系统宿主机请自行安装 MySQL Client。
rpm -ivh https://repo.mysql.com//mysql57-community-release-el7-11.noarch.rpm
yum install mysql-community-client.x86_64
yum install mysql-community-client.x86_64
说明:安装失败,yum源没有包,装不了,换离线安装。(暂时不装)
#通过MySQL客户端链接元数据库,库名为cloudcanal_console。
说明:访问不通,ip地址可能不对。
6.3.4 添加数据源
6.3.5 创建同步任务
6.3.5.1 单库单表单任务
Mysql同步到Starrocks
6.3.5.1 检查同步情况
#查看任务
#查看更多监控图表
#查看Starrocks表
#新增一条数据
INSERT INTO student VALUES (6,'小二', '女', '2024-03-26', '123456789@qq.com');
说明:初始同步表结构到starrocks的test库成功,初始全量同步5条数据成功,新增一条数据,增量同步成功。
#更新数据
update student set name='小二_更新数据' WHERE id=6;
#删除数据
delete from student where id=6;
说明:删除数据,同步成功。
#删除字段
alter table student drop column email;
说明:删除字段,同步成功。
#查看自动创建表生成结构
6.3.5.2 单库多表单任务
Mysql创建库表
create table student(
id int(11),
name varchar(20),
gender varchar(10),
birthday varchar(20),
email varchar(64),
PRIMARY KEY (id)
);
create table student2(
id int(11) primary key,
name varchar(20),
gender varchar(10),
birthday varchar(20),
email varchar(64)
);
create table student3(
id int(11) primary key,
name varchar(20),
gender varchar(10),
birthday varchar(20),
email varchar(64)
);
create table student4(
id int(11) primary key,
name varchar(20),
gender varchar(10),
birthday varchar(20),
email varchar(64)
);
create table student5(
id int(11) primary key,
name varchar(20),
gender varchar(10),
birthday varchar(20),
email varchar(64)
);
create table student6(
id int(11) primary key,
name varchar(20),
gender varchar(10),
birthday varchar(20),
email varchar(64)
);
#插入数据
INSERT INTO student VALUES
(1,'张三', '男', '2024-03-22', '123456789@qq.com'),
(2,'李四', '男', '2024-03-23', '123456789@qq.com'),
(3,'王五', '男', '2024-03-24', '123456789@qq.com'),
(4,'老六', '男', '2024-03-25', '123456789@qq.com'),
(5,'小二', '女', '2024-03-26', '123456789@qq.com');
INSERT INTO student2 VALUES
(1,'张三', '男', '2024-03-22', '123456789@qq.com'),
(2,'李四', '男', '2024-03-23', '123456789@qq.com'),
(3,'王五', '男', '2024-03-24', '123456789@qq.com'),
(4,'老六', '男', '2024-03-25', '123456789@qq.com'),
(5,'小二', '女', '2024-03-26', '123456789@qq.com');
INSERT INTO student3 VALUES
(1,'张三', '男', '2024-03-22', '123456789@qq.com'),
(2,'李四', '男', '2024-03-23', '123456789@qq.com'),
(3,'王五', '男', '2024-03-24', '123456789@qq.com'),
(4,'老六', '男', '2024-03-25', '123456789@qq.com'),
(5,'小二', '女', '2024-03-26', '123456789@qq.com');
INSERT INTO student4 VALUES
(1,'张三', '男', '2024-03-22', '123456789@qq.com'),
(2,'李四', '男', '2024-03-23', '123456789@qq.com'),
(3,'王五', '男', '2024-03-24', '123456789@qq.com'),
(4,'老六', '男', '2024-03-25', '123456789@qq.com'),
(5,'小二', '女', '2024-03-26', '123456789@qq.com');
INSERT INTO student5 VALUES
(1,'张三', '男', '2024-03-22', '123456789@qq.com'),
(2,'李四', '男', '2024-03-23', '123456789@qq.com'),
(3,'王五', '男', '2024-03-24', '123456789@qq.com'),
(4,'老六', '男', '2024-03-25', '123456789@qq.com'),
(5,'小二', '女', '2024-03-26', '123456789@qq.com');
INSERT INTO student6 VALUES
(1,'张三', '男', '2024-03-22', '123456789@qq.com'),
(2,'李四', '男', '2024-03-23', '123456789@qq.com'),
(3,'王五', '男', '2024-03-24', '123456789@qq.com'),
(4,'老六', '男', '2024-03-25', '123456789@qq.com'),
(5,'小二', '女', '2024-03-26', '123456789@qq.com');
#创建全库同步任务
查看任务
#结构迁移
#全量迁移
说明:初始化同步数据已完成。
PS:mysql表若新增数据,改任务会执行增量同步操作,无需另起任务。
#确认Starrocks集群库表同步
说明:6张表数据同步成功,每张表都有数据。
#增量同步
说明:初始全量,没有新增数据。
#mysql更新6张表数据
update student set name='小二_更新' WHERE id=5;
update student2 set name='小二_更新' WHERE id=5;
update student3 set name='小二_更新' WHERE id=5;
update student4 set name='小二_更新' WHERE id=5;
update student5 set name='小二_更新' WHERE id=5;
update student6 set name='小二_更新' WHERE id=5;
查看任务,增量同步位点已发生变化,说明有同步更新数据。
#验证数据更新实时同步
说明:6张表数据已同步更新数据,更新数据实时同步成功。
#验证数据新增实时同步
INSERT INTO student VALUES (6,'新增一条数据', '男', '2024-03-26', '987654321@qq.com');
INSERT INTO student2 VALUES (6,'新增一条数据', '男', '2024-03-26', '987654321@qq.com');
INSERT INTO student3 VALUES (6,'新增一条数据', '男', '2024-03-26', '987654321@qq.com');
INSERT INTO student4 VALUES (6,'新增一条数据', '男', '2024-03-26', '987654321@qq.com');
INSERT INTO student5 VALUES (6,'新增一条数据', '男', '2024-03-26', '987654321@qq.com');
INSERT INTO student6 VALUES (6,'新增一条数据', '男', '2024-03-26', '987654321@qq.com');
说明:6张表已同步新增一条数据,新增数据实时同步成功。
#验证数据删除实时同步
delete from student where id=6;
delete from student2 where id=6;
delete from student3 where id=6;
delete from student4 where id=6;
delete from student5 where id=6;
delete from student6 where id=6;
说明:6张表已同步删除id=6的数据,删除数据实时同步成功。
#验证表字段删除实时同步
alter table student drop column email;
alter table student2 drop column email;
alter table student3 drop column email;
alter table student4 drop column email;
alter table student5 drop column email;
alter table student6 drop column email;
说明:6张表已同步删除email字段,删除字段实时同步成功。
#验证在test_demo库新增一张表,全库同步任务是否会实时同步新增表。
create table student7(
id int(11) primary key,
name varchar(20),
gender varchar(10),
birthday varchar(20),
email varchar(64)
);
说明:全库同步任务, mysql新创建的一张student7表,实时同步表到starrocks集群成功。
#验证mysql主键表同步到starrocks主键模型表
create table student8(
id int(11) primary key,
name varchar(20),
gender varchar(10),
birthday varchar(20),
email varchar(64),
price double
);
INSERT INTO student8 VALUES (1,'新增一条数据', '男', '2024-03-27', '987654321@qq.com', 19.99);
INSERT INTO student8 VALUES (2,'新增一条数据', '男', '2024-03-27', '987654321@qq.com', 19.99);
INSERT INTO student8 VALUES (3,'新增一条数据', '男', '2024-03-27', '987654321@qq.com', 19.99);
6.3.5.3 创建同步任务报错问题
问题一:创建任务,预检失败。
解决办法:给mysql账号授权。(已解决)
#压测环境mysql
同步链路:mysql-->starrocks
账号172.21.227.10:3305
用户:my_to_starrocks
密码:Ls_sync3
账号授权命令:grant select,replication slave,replication client on *.* to my_to_starrocks@'%'; root账号密码:root/Evoc_mysql8(不推荐使用root)
官方参照文档:
https://www.clougence.com/cc-doc/dataMigrationAndSync/connection/mysql2#%E5%89%8D%E7%BD%AE%E6%9D%A1%E4%BB%B6
#测试环境mysql
同步链路:mysql-->starrocks
账号:172.21.237.95:3305
用户:root
密码:Dwq123
6.3.6 高可用
CloudCanal 社区版自 1.0.3 开始支持用户添加机器,部署高可用集群。CloudCanal高可用集群包含如下特性:
1. 任务容灾自动切换:如果任务所在的机器crash,在机器上的任务会自动切换到集群内其他可用的机器上。
2. 任务手动调度:如果一台机器上运行了过多的任务,支持用户手动调度任务到其他机器上运行。
3. 创建任务时自动分配到低负载机器上:创建任务的时候,任务会自动分配到绑定集群下负载较低的机器上。
4. CloudCanal中的Sidecar容器负责数据同步,Console容器负责任务的调度以及为提供管理操作。接下来分别模拟Sidecar容器和Console容器故障时,数据能否依然正常同步。
https://cloud.tencent.com/developer/article/1877729
6.3.7 授权到期更换
#复制申请码
点击已激活查看详情:http://172.21.235.224:8111/data/job/list#/data/job/list
AxdCogLhIrLNrUH3uwBBU8WchwhSSymNlZOvOIZxVITgtEQhezdBDSCZhJWwLsN7+AcKVgPdVHkAvrfwy+Z9letQB6OuC6uev1DPscu56V75Vat/EA4zUc3XHRGo8lBrIY3RxfqwgeARrnMGoQjUt5tmuceWwLvRAEncrQStPXhmcmwO2gHy/3MB9ZwIOT7mkz7xkDwUkQK74Q4dvzzwUKOwCjSstDNnbNfZrNOqdFL1PYSi/waX75+Mv0oU58pA/VJX+rOhj365l4t9HCQiq4XM4fEO5twjCDXoYU4lLtVFWzgDeFhLEd0vpmcpReYs7h7itoBnWsqQeGh+6k+6CfvM9hjx0Elh6OURjYL1PlXlh77QJAZ0lfswwzXEaLZyGFbL4pRdL5VhiWFJYFCFtQwKfyRe9nGJ6JvgAfjBHgfc3AeYoYf9//BMlHubKpB1/SckPgpLAsQZUZAyT1YaEg==
说明:显示已激活,可使用时间剩余7天4小时。
#第二次申请许可证(续期)
填写申请码,获取许可证。
https://www.clougence.com/buy
说明:填写好申请码后,点击立即购买(无付款),立即生成一条新订单。
说明:点击订单链接查看,弹出获取短信验证码输入框,点击获取短信验证码,输入收到的短信验证码,查看许可证。
#回到Cloudcanal平台
点击重新激活
#将新申请的许可证输入进去
说明:输入新的许可证,点击激活即可。
说明:显示已激活,有效使用时间已更新为91天23小时。
6.3.8 生产环境部署Cloudcanal
6.3.9 重启cloudcanal报错
解决办法
执行:sh upgrade.sh
说明:会重新拉下包文件,然后自动重启所有服务。
七、压测工具使用
7.1 Starrocks数字孪生压测
7.1.1 压测工具Apache JMeter
#下载Jmeter
下载上传服务器目录并解压缩,进入bin目录,点击jmeter.bat脚本启动客户端。
#配置测试计划
#创建线程组
#添加配置元件
JDBC Connection Configuration
Variable Name for created pool:starrocks_test
DatabaseURL:
jdbc:mysql:loadbalance://172.21.242.66:9030,172.21.242.21:9030,172.21.242.161:9030/yx_statistic?allowMultiQueries=TRUE&useUnicode=true&characterEncoding=utf8
#添加取样器
JDBC Request
select
date_format(dates.stats_date,'%y-%m-%d') as stats_date,
coalesce(count_num, 0) as count_num
from (
select
date_trunc('day', days_add('2024-03-26 00:00:00', generate_series)) as stats_date
from table(generate_series(0,days_diff('2024-04-02 23:59:59', '2024-03-26 00:00:00'))
)
) as dates
left join (
select
date_trunc('day',create_time) as stats_date,
count(1) as count_num
from flm_access_stats
where
stats_type in(5,6)
and create_time between '2024-03-26 00:00:00' and '2024-04-02 23:59:59'
and create_tenant_id = 12345
group by date_trunc('day',create_time)
) as count_num on dates.stats_date = count_num.stats_date
order by dates.stats_date
#添加监听器
查看结果树
聚合报告
图形结果
用表格查看
#执行
#查看聚合报告
#查看Starrocks集群监控面板
八、集群压测性能分析与调优
8.1 perf入门
作为系统管理员,您可以使用perf工具来收集和分析系统的性能数据。
简介
与基于内核的子系统Performance Counters for Linux(PCL)的perf用户空间工具接口。perf是一个强大的工具,它使用性能监控单元(PMU)测量、记录和监控各种硬件和软件事件。perf 还支持追踪点、kprobes和uprobes。
8.2 使用
8.2.1 perf record
perf record是Linux内核性能分析工具perf的一个重要子命令,用于收集指定进程或系统的性能数据,包括但不限于CPU性能事件、硬件性能计数器、内核动态追踪以及调用栈信息。
perf record -F 100 -p 54554 -g -- sleep 30
8.3 火焰图安装与使用
8.3.1 简介
火焰图(Flame Graph)是一种高性能分析工具,由Brendan Gregg创造,主要用于可视化程序执行时的CPU调用栈,展示程序在不同函数层级上的时间消耗情况。这种图形化的表示方法因其形状酷似燃烧的火焰而得名。
8.3.2 火焰图的特点
1. 可视化堆栈跟踪:火焰图将多个堆栈跟踪(stack traces)合并在一起,形成一个层次分明的图表。每个函数调用形成一个矩形,宽度表示函数在CPU上执行的时间占比,高度表示函数调用的层级。
2. 直观揭示性能瓶颈:通过观察火焰图,可以直观地看到哪些函数在执行过程中占据了大量的CPU时间,从而快速定位潜在的性能瓶颈。
3. 排序方式:x轴通常按照函数名称字母顺序排列,而不是时间顺序。这样做的好处是可以很容易地对比相似函数在整个程序中的开销。
4. 颜色编码:图中的每个矩形(或称“火焰条”)通常使用随机颜色,目的是在视觉上更容易区分相邻的函数调用。有些变种火焰图可能会采用不同的颜色方案来区分不同的代码区域或模块。
5. 分析数据来源:火焰图的数据来源于性能分析工具(如Linux中的perf工具)收集的CPU采样数据,或者是通过其他性能分析手段得到的调用栈信息。
6. 应用领域:火焰图广泛应用于性能优化、故障排查、代码重构等领域,尤其适合大型复杂软件系统,有助于工程师们快速理解和改进程序性能。
8.3.3 下载安装
火焰图下载:https://github.com/brendangregg/FlameGraph.git
上传到服务器目录并解压:unzip FlameGraph-master.zip
8.3.4 生成程序性能分析火焰图的一组流程
8.3.4.1 分析starrocks_be
1、执行top命令
可看到starrocks_be进程的PID是54554
2、使用perf采集一组数据
cd /usr/local/apps
perf record -F 100 -p 54554 -g -- sleep 30
这条命令是用来使用Linux的性能分析工具perf进行记录和分析特定进程的性能数据的。命令的组成部分及其功能解释如下:
sudo: 以超级用户权限执行命令,因为在很多情况下,为了获取详细的性能数据,perf需要访问受保护的内核资源。
perf record: perf工具的子命令,用于执行性能数据记录。它会在指定条件下收集有关系统或进程的性能数据,并将其保存到一个数据文件中(默认为perf.data)。
-F 100: 设置采样频率为每秒100次。这意味着每隔大约10毫秒就会进行一次采样,以此频率收集性能数据。
-p 54554: 指定要监控的进程ID(PID)为54554。perf将会收集这个进程的性能数据。
-g: 启用调用栈收集(call graph)。这意味着在每次采样时,perf不仅记录当前执行的指令地址,还会记录当时的函数调用栈,这对于分析函数间的调用关系和性能瓶颈非常有用。
--: 表示命令行选项的结束,之后的参数会被当作非选项参数传递给命令。在这种情况下,后面跟的是sleep 30命令。
sleep 30: 这是一个简单的命令,让它执行30秒。在此期间,perf会记录PID为54554的进程的性能数据。sleep命令的作用是为了确保有足够的采样数据被收集,同时不影响被监控进程的正常运行。
所以,整个命令的目的是在接下来的30秒内,以每秒100次的频率,对PID为54554的starrocks_be进程进行详细的性能数据采样(包括调用栈信息),并将这些数据存储起来供后续分析使用。
3、生成perf.unfold
这一步生成的perf.unfold文件包含了未折叠的调用栈信息,即每次采样的函数调用链。
perf.unfold 是上一步生成的包含详细调用栈信息的文件。
perf script -i perf.data > perf.unfold
4、生成火焰图
./stackcollapse-perf.pl是FlameGraph工具集中的一部分,用于处理perf生成的未折叠调用栈数据。
经过stackcollapse-perf.pl处理后的文件内容是对原始调用栈进行了折叠统计,
即将同一调用路径下的事件次数累加,形成一种更紧凑的格式,便于生成火焰图。
./FlameGraph-master/stackcollapse-perf.pl perf.unfold &> perf.folded
5、最后生成svg图
./flamegraph.pl是FlameGraph工具集中用于生成火焰图的脚本
将火焰图生成的输出重定向到了名为perf.svg的SVG矢量图形文件中
./FlameGraph-master/flamegraph.pl perf.folded > perf.svg
8.3.4.2 查看火焰图(SVG)图
SVG是一种可缩放的矢量图形格式,生成的火焰图可以直接在浏览器中查看,形象地展示了各个函数在CPU执行过程中的调用关系及其占用时间比例,有助于定位性能瓶颈。
将生成好的perf.svg图从linux服务器下载到桌面
sz perg.svg
用浏览器打开进行分析
火焰图的特点:
1. 每个小方块表示一个函数
2. 方块的颜色深浅没有关系,是随机取的颜色
3. 纵轴表示调用栈的深度,调用的方向是从下往上,也就是下面的函数调用了上面的函数,因此,函数越往上则越底层
4. 横轴的宽度表示占用时间,但是从左到右并不表示时间顺序,而只是按照字母表顺序排列
怎么用火焰图查找性能问题呢?
1. 横轴的宽度表示占用时间,因此,方块越宽表示占用时间越多,所以,我们的目的就是找到比较宽的方块。
2. 在最下面找比较宽的方块,当找到一个比较宽的方块时,再在这个方块的上面的方块中找比较宽的方块,这样一步一步往上找,根据代码分析出性能出现问题的地方,然后对这部分代码进行优化。
8.3.5 统计调用栈信息
perf report
perf工具的另一个子命令,用于从之前记录的性能数据文件中生成分析报告。通常是在运行perf record采集数据后,使用此命令来查看和分析结果。
perf report -n --stdio
命令参数具体解读如下:
1. -n: 选项告诉perf report不要尝试去解析符号(symbolicate),也就是说,不将地址转换为函数名称或其他可读性更高的形式。如果未加载适当的调试信息或符号表,或者出于某种原因不需要函数名的解析,则可以使用这个选项。
2. --stdio: 指定报告输出至标准输出(stdout),而不是默认的交互式TUI模式。这意味着报告将以纯文本的形式直接打印到终端窗口,适合自动化脚本处理或直接查看简单报告,而非通过图形界面浏览详细报告。
综上所述,该命令旨在以非解析符号的纯文本格式,从之前用perf record收集的性能数据中生成并显示一个简洁的性能分析报告。由于没有指定具体的数据文件名,perf report将默认读取最近一次记录的.data文件。
8.4 集群压测调优
数字孪生项目集群SQL压测
8.4.1 参数调优
修改start_backend.sh
#修改be节点配置文件
cd /opt/starrocks/be/bin
vim start_backend.sh
修改前参数:
muzzy_decay_ms:5000
dirty_decay_ms:5000
修改后参数:
muzzy_decay_ms:30000
dirty_decay_ms:30000
说明:修改完6台BE节点配置后,需要重启BE。
实例并行数量
set global pipeline_dop=1;
参数说明:设置0表示核数的一半,默认0代表自适应动态调整,动态调的技术还不够成熟。
说明:该参数作用是设置并行度,建议要是想高并发,就调小,要是想单个sql查询快,就调大。数值越大,调度开销越重。值建议设置8以内,不要太高,上限值是32/64。
表分桶设置
6台BE节点,表建议创建12个分桶。
#修改表分桶数
ALTER TABLE flm_access_stats DISTRIBUTED BY HASH(stats_id) BUCKETS 12;
#查看副本
ADMIN SHOW REPLICA STATUS FROM flm_access_stats;
说明:单表100w数据量不算大,创建表时间分区效果不大,1000w+数据量建议创建表分区。
8.4.2 虚机集群扩容调优后压测
#压测sql
select
date_format(dates.stats_date, '%Y-%m-%d' ) as stats_date,
coalesce(count_num, 0) as count_num
from (
SELECT date_trunc('day', days_add('2024-05-29 00:00:00', generate_series)) AS stats_date
FROM TABLE(generate_series( 0, days_diff('2024-06-04 23:59:59', '2024-05-29 00:00:00')) )
) as dates
left join (
SELECT date_trunc('day' ,create_time) AS stats_date,
count(1) as count_num
FROM flm_access_stats
WHERE stats_type IN (5 , 6)
AND create_time >= '2024-05-29 00:00:00'
AND create_time <= '2024-06-04 23:59:59'
and create_tenant_id = 1738967206549181173
group by date_trunc('day' , create_time)
) as count_num on dates.stats_date = count_num.stats_date
order by dates.stats_date
压测参数:200线程,持续时间:900秒。
压测结果:tps最高:2590 回落至2472 be节点cpu使用率:70% 内存使用:3GB
说明:做该压测时没有修改表分桶数为12;修改分桶数后压测,tps也无提升。
#Starrocks集群监控
#火焰图
8.4.2.1 空闲时间压测
压测参数:200线程,设置时间:900秒。
select
date_format(dates.stats_date,'%y-%m-%d') as stats_date,
coalesce(count_num, 0) as count_num
from (
select
date_trunc('day', days_add('2024-03-26 00:00:00', generate_series)) as stats_date
from table(generate_series(0,days_diff('2024-04-02 23:59:59', '2024-03-26 00:00:00'))
)
) as dates
left join (
select
date_trunc('day',create_time) as stats_date,
count(1) as count_num
from flm_access_stats
where
stats_type in(5,6)
AND create_time >= '2024-03-26 00:00:00'
AND create_time <= '2024-04-02 23:59:59'
and create_tenant_id = 12345
group by date_trunc('day',create_time)
) as count_num on dates.stats_date = count_num.stats_date
order by dates.stats_date
压测结果:tps:2636 fe cpu使用率:75% be cpu使用率:68% BE内存:2GB
#查看SR集群监控
8.4.2.2 二测
压测参数:200线程,设置时间:900秒。
select
date_format(dates.stats_date,'%y-%m-%d') as stats_date,
coalesce(count_num, 0) as count_num
from (
select
date_trunc('day', days_add('2024-03-26 00:00:00', generate_series)) as stats_date
from table(generate_series(0,days_diff('2024-04-02 23:59:59', '2024-03-26 00:00:00'))
)
) as dates
left join (
select
date_trunc('day',create_time) as stats_date,
count(1) as count_num
from flm_access_stats
where
stats_type in(5,6)
AND create_time >= '2024-03-26 00:00:00'
AND create_time <= '2024-04-02 23:59:59'
and create_tenant_id = 12345
group by date_trunc('day',create_time)
) as count_num on dates.stats_date = count_num.stats_date
order by dates.stats_date
压测结果:tps:2609 fe cpu使用率:80% be cpu使用率:67% BE内存:从2.09降到1.45GB。
感觉调整muzzy_decay_ms:30000,dirty_decay_ms:30000参数后,会影响fe的cpu消耗。
#查看SR集群监控
#调整分桶数后压测
压测参数:200线程,设置时间:900秒。
select
date_format(dates.stats_date,'%y-%m-%d') as stats_date,
coalesce(count_num, 0) as count_num
from (
select
date_trunc('day', days_add('2024-03-26 00:00:00', generate_series)) as stats_date
from table(generate_series(0,days_diff('2024-04-02 23:59:59', '2024-03-26 00:00:00'))
)
) as dates
left join (
select
date_trunc('day',create_time) as stats_date,
count(1) as count_num
from flm_access_stats
where
stats_type in(5,6)
AND create_time >= '2024-03-26 00:00:00'
AND create_time <= '2024-04-02 23:59:59'
and create_tenant_id = 12345
group by date_trunc('day',create_time)
) as count_num on dates.stats_date = count_num.stats_date
order by dates.stats_date
压测结果:tps:2624 FE cpu使用率:80% BE cpu使用率:68% BE内存:1.8GB
8.4.3 物理集群压测
#压测sql
select
date_format(dates.stats_date,'%y-%m-%d') as stats_date,
coalesce(count_num, 0) as count_num
from (
select
date_trunc('day', days_add('2024-03-26 00:00:00', generate_series)) as stats_date
from table(generate_series(0,days_diff('2024-04-02 23:59:59', '2024-03-26 00:00:00'))
)
) as dates
left join (
select
date_trunc('day',create_time) as stats_date,
count(1) as count_num
from flm_access_stats
where
stats_type in(5,6)
AND create_time >= '2024-03-26 00:00:00'
AND create_time <= '2024-04-02 23:59:59'
and create_tenant_id = 12345
group by date_trunc('day',create_time)
) as count_num on dates.stats_date = count_num.stats_date
order by dates.stats_date
压测参数:200线程,持续时间:900秒。
压测结果:tps最高:4840 回落至:4740 be cpu使用率:30% BE内存:1.12GB FE 内存使用率:10%。
#压测调优参数
#修改全局并发数
SHOW VARIABLES LIKE 'pipeline_dop';
set global pipeline_dop=1;
#增加表分桶数
ALTER TABLE flm_access_stats DISTRIBUTED BY HASH(stats_id) BUCKETS 12;
ADMIN SHOW REPLICA STATUS FROM flm_access_stats;
压测结论:在设置全局pipeline_dop参数和修改分桶数后,压测tps达到了4700+,没设置此参数前或设置为50,压测tps仅有280左右,性能提升较大;在资源方面,BE节点CPU消耗30%左右,调优之前CPU使用率高达80%。
#二次压测
压测参数:400线程,持续时间:900秒。
select
date_format(dates.stats_date,'%y-%m-%d') as stats_date,
coalesce(count_num, 0) as count_num
from (
select
date_trunc('day', days_add('2024-03-26 00:00:00', generate_series)) as stats_date
from table(generate_series(0,days_diff('2024-04-02 23:59:59', '2024-03-26 00:00:00'))
)
) as dates
left join (
select
date_trunc('day',create_time) as stats_date,
count(1) as count_num
from flm_access_stats
where
stats_type in(5,6)
AND create_time >= '2024-03-26 00:00:00'
AND create_time <= '2024-04-02 23:59:59'
and create_tenant_id = 12345
group by date_trunc('day',create_time)
) as count_num on dates.stats_date = count_num.stats_date
order by dates.stats_date
压测结果:tps最高:6640 回落至:6479 be cpu使用率:48% BE内存:2.86GB FE 内存使用率:15%。
#SR集群监控
#第三次压测
压测参数:800线程,持续时间:900秒。
select
date_format(dates.stats_date,'%y-%m-%d') as stats_date,
coalesce(count_num, 0) as count_num
from (
select
date_trunc('day', days_add('2024-03-26 00:00:00', generate_series)) as stats_date
from table(generate_series(0,days_diff('2024-04-02 23:59:59', '2024-03-26 00:00:00'))
)
) as dates
left join (
select
date_trunc('day',create_time) as stats_date,
count(1) as count_num
from flm_access_stats
where
stats_type in(5,6)
AND create_time >= '2024-03-26 00:00:00'
AND create_time <= '2024-04-02 23:59:59'
and create_tenant_id = 12345
group by date_trunc('day',create_time)
) as count_num on dates.stats_date = count_num.stats_date
order by dates.stats_date
压测结果:tps最高:6780 回落至:6503 be cpu使用率:54% BE内存:3.99GB FE 内存使用率:40%。
结论:400线程加到800线程压测,tps基本没有提升,be cpu消耗跟 400线程所使用的cpu差不多。但内存消耗增加了将近一倍。
#SR集群监控
#第四次压测
压测参数:600线程,持续时间:900秒。
select
date_format(dates.stats_date,'%y-%m-%d') as stats_date,
coalesce(count_num, 0) as count_num
from (
select
date_trunc('day', days_add('2024-03-26 00:00:00', generate_series)) as stats_date
from table(generate_series(0,days_diff('2024-04-02 23:59:59', '2024-03-26 00:00:00'))
)
) as dates
left join (
select
date_trunc('day',create_time) as stats_date,
count(1) as count_num
from flm_access_stats
where
stats_type in(5,6)
AND create_time >= '2024-03-26 00:00:00'
AND create_time <= '2024-04-02 23:59:59'
and create_tenant_id = 12345
group by date_trunc('day',create_time)
) as count_num on dates.stats_date = count_num.stats_date
order by dates.stats_date
压测结果:tps最高:6910 回落至:6641 be cpu使用率:53% BE内存:3.67GB FE 内存使用率:32%。
结论:400线程加到600线程压测,tps提升不明显(增加200+),be cpu消耗跟 400线程所使用的cpu差不多。内存消耗随之增加了一些。
- 点赞
- 收藏
- 关注作者
评论(0)