背景
公司使用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
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
微信公眾號:測試生財(定期分享獨家內容和資源)