公司使用clickhouse做爲其時序分析數據庫,在上線前須要對Clickhouse集羣作一個性能基準測試,用於數據評估。這裏我搭建了三節點的集羣,集羣採用三分片單副本的模式(即數據分別存儲在三個Clickhouse節點上,每一個Clickhouse節點都有一個單獨的副本,以下圖:html
具體的搭建方式參考:Clickhouse集羣搭建python
1)虛擬機列表sql
機器名shell |
IP數據庫 |
配置bash |
部署的服務多線程 |
備註運維 |
server01tcp |
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
在碼農的苦悶歲月裏,期待咱們一塊兒成長,歡迎關注,感謝拍磚!