背景
公司使用clickhouse作为其时序分析数据库,在上线前需要对Clickhouse集群做一个性能基准测试,用于数据评估。这里我搭建了三节点的集群,集群采用三分片单副本的模式(即数据分别存储在三个Clickhouse节点上,每个Clickhouse节点都有一个单独的副本,如下图:
具体的搭建方式参考:Clickhouse集群搭建
性能测试说明
性能关注指标
- clickhouse-server写性能
- clickhouse-server读性能
- clickhouse-server的CPU和内存占用情况
测试环境说明
1)虚拟机列表
机器名 | IP | 配置 | 部署的服务 | 备注 |
server01 | 192.168.21.21 | 8c8g | clickhouserver(cs01-01)和 clickhouserver(cs01-02) | clickhouse01-01: 实例1, 端口: tcp 9000, http 8123, 同步端口9009, 类型: 分片1, 副本1 clickhouse01-02: 实例2, 端口: tcp 9001, http 8124, 同步端口9010, 类型: 分片2, 副本2 (clickhouse2的副本) |
server02 | 192.168.21.69 | 8c8g | clickhouserver(cs02-01)和 clickhouserver(cs02-02) | clickhouse02-01: 实例1, 端口: tcp 9000, http 8123, 同步端口9009, 类型: 分片2, 副本1 clickhouse02-02: 实例2, 端口: tcp 9001, http 8124, 同步端口9010, 类型: 分片3, 副本2 (clickhouse3的副本) |
server03 | 192.168.21.6 | 8c8g | clickhouserver(cs03-01)和 clickhouserver(cs03-02) | clickhouse03-01: 实例1, 端口: tcp 9000, http 8123, 同步端口9009, 类型: 分片3, 副本1 clickhouse03-02: 实例2, 端口: tcp 9001, http 8124, 同步端口9010, 类型: 分片1, 副本2 (clickhouse1的副本) |
发压机器 | 192.168.21.3 | 16c2g | 压测机器 | 用于测试clickhouse-server的性能 |
2)测试数据表说明
server02上的cs02-01中数据表使用如下sql创建写测试表:
create database test_ck; #创建本地复制表用于写入(使用ReplicatedMergeTree复制表) CREATE TABLE test_ck.device_thing_data ( time UInt64, user_id String, device_id String, source_id String, thing_id String, identifier String, value_int32 Int32, value_float Float32, value_double Float64, value_string String, value_enum Enum8('0'=0,'1'=1,'2'=2,'3'=3,'4'=4,'5'=5,'6'=6,'7'=7,'8'=8), value_string_ex String, value_array_string Array(String), value_array_int32 Array(Int32), value_array_float Array(Float32), value_array_double Array(Float64), action_date Date, action_time DateTime ) Engine= ReplicatedMergeTree('/clickhouse/tables/01-02/device_thing_data','cluster01-02-1') PARTITION BY toYYYYMM(action_date) ORDER BY (user_id,device_id,thing_id,identifier,time,intHash64(time)) SAMPLE BY intHash64(time) SETTINGS index_granularity=8192创建分布式表用于查询,在三台每个机器上均执行如下sql:
CREATE TABLE device_thing_data_all AS test_ck.device_thing_data ENGINE = Distributed(cluster_3s_1r, test_ck, device_thing_data, rand())
测试数据说明
1)测试原始数据从开发联调环境的clickhouse导出,保存到本地的csv文件
2)写数据测试往192.168.21.69的9000端口(cs02-01)的test_ck.device_thing_data写入,使用的sql类似如下:
self.client.execute('INSERT INTO test_ck.device_thing_data (time,user_id,device_id,source_id,thing_id,identifier,value_int32,value_float,value_double,value_string,value_enum,value_string_ex,value_array_string,value_array_int32,value_array_float,value_array_double,action_date,action_time) VALUES', data,types_check=True)
3)读数据测试和写数据clickhouse-server实例一致,表使用device_thing_data_all,使用的sql类似如下:
self.client.execute('select count(1) from (select time,user_id,device_id,source_id,thing_id,identifier,value_int32,value_float,value_double,value_string,value_enum,value_string_ex,value_array_string,value_array_int32,value_array_float,value_array_double,action_date,action_time from device_thing_data_all limit %d) t1' % self.bulksize)
测试工具
测试工具使用python和shell编写,python使用clickhouse的客户端,shell使用parallel实现多进程
测试场景与性能数据
1)写入测试,对集群的(cs02-01)的复制表的写入测试
每次批量数据条数 | 客户端连接数 | 耗时(秒) | 插入总行数 | TPS(records/sec) | clickhouse的CPU占用 | clickhouse内存占用(m) | 备注 |
10 | 1 | 12.319155 | 10000 | 811.744020 | 43% | 1.8%(约160M) | /bin/bash start_clickhouse_perf.sh --mode=1 --clientnum=1 --bulksize=10 --times=1000 |
100 | 3 | 25.015171 | 300000 | 12026.095374 | 72% | 1.8%(约160M) | /bin/bash start_clickhouse_perf.sh --mode=1 --clientnum=3 --bulksize=100 --times=1000 |
1000 | 3 | 61.579590 | 1500000 | 24496.428544 | 18.3% | 1.9%(约160M) | /bin/bash start_clickhouse_perf.sh --mode=1 --clientnum=3 --bulksize=1000 --times=500 |
1000 | 6 | 64.323068 | 3000000 | 47051.112386 | 35.2% | 1.9%(约160M) | /bin/bash start_clickhouse_perf.sh --mode=1 --clientnum=6 --bulksize=1000 --times=500 |
10000 | 6 | 222.632641 | 12000000 | 54542.892502 | 9.3% | 2.4%(约160M) | /bin/bash start_clickhouse_perf.sh --mode=1 --clientnum=6 --bulksize=1000 --times=500 |
2)读取测试,对集群的(cs02-01)的分布式表的读取测试
每次批量数据条数 | 客户端连接数 | 耗时(秒) | 插入总行数 | TPS(records/sec) | clickhouse的CPU占用 | clickhouse内存占用(m) | 备注 |
1000 | 1 | 11.610356 | 1000000 | 86130.004332 | 69.4% | 2.1%(约160M) | /bin/bash start_clickhouse_perf.sh --mode=0 --clientnum=1 --bulksize=1000 --times=1000 |
1000 | 3 | 12.897658 | 3000000 | 233129.085885 | 200.1% | 2.1%(约160M) | /bin/bash start_clickhouse_perf.sh --mode=0 --clientnum=3 --bulksize=1000 --times=1000 |
10000 | 3 | 12.971161 | 30000000 | 2322824.513353 | 207% | 2.1%(约160M) | /bin/bash start_clickhouse_perf.sh --mode=0 --clientnum=3 --bulksize=10000 --times=1000 |
10000 | 6 | 16.298867 | 60000000 | 3705072.680627 | 353.5% | 2.1%(约160M) | /bin/bash start_clickhouse_perf.sh --mode=0 --clientnum=6 --bulksize=10000 --times=1000 |
100000 | 6 | 19.740923 | 600000000 | 30605253.774755 | 461% | 2.2%(约160M) | /bin/bash start_clickhouse_perf.sh --mode=0 --clientnum=6 --bulksize=100000 --times=1000 |
3)写入数据量测试
写入1亿条记录到clickhouse单实例中,最后硬盘上的数据大小约为450M左右。
最后
可以看出,Clickhouse的单批次读写的记录越多,性能越好;尽量使用多线程进行读写,这样能够最大化利用Clickhouse的性能。
博主:测试生财(一个不为996而996的测开码农)
座右铭:专注测试开发与自动化运维,努力读书思考写作,为内卷的人生奠定财务*。
内容范畴:技术提升,职场杂谈,事业发展,阅读写作,投资理财,健康人生。
csdn:https://blog.csdn.net/ccgshigao
博客园:https://www.cnblogs.com/qa-freeroad/
51cto:https://blog.51cto.com/14900374
在码农的苦闷岁月里,期待我们一起成长,欢迎关注,感谢拍砖!