從攜程性能測試case中重新認(rèn)識(shí)clickhouse

背景

其實(shí)早在去年我們就已經(jīng)開始接觸并研究clickhouse了,因?yàn)楫?dāng)時(shí)進(jìn)行多表關(guān)聯(lián)測試性能并不是特別優(yōu)秀,所以并沒有在線上大范圍使用,當(dāng)時(shí)研究的是分布式部署 (感覺分布式會(huì)比單機(jī)好一些)最后發(fā)現(xiàn)性能并不怎么樣 而且分布式的sql也有很多限制,不支持單條刪除和更新操作、不支持in和join(當(dāng)時(shí)的版本,18.12.14之前),直到前幾天看了攜程一篇關(guān)于clickhouse的文章,將clickhouse的性能描述的神乎其神,再次勾起了我研究的欲望,附攜程公眾號(hào)文章 每天十億級(jí)數(shù)據(jù)更新,秒出查詢結(jié)果,ClickHouse在攜程酒店的應(yīng)用

測試

開始之前我們先看結(jié)果:

  • 攜程的case:

clickhouse 版本:18.12.13
服務(wù)器配置:

參數(shù) 配置
CPU 40c
內(nèi)存 128g
硬盤 SSD
虛擬內(nèi)存 禁用

數(shù)據(jù):

數(shù)據(jù)量
A 1000w
B 2000w
C 6000w
D 2.4億

測試場景:

case 時(shí)間
A + B +C 三表關(guān)聯(lián)聚合查詢 190ms
B + D 關(guān)聯(lián)聚合查詢 390ms
A + B +D 三表關(guān)聯(lián)聚合查詢 640ms

根據(jù)攜程給的一份查詢統(tǒng)計(jì)數(shù)據(jù)來看他們基于clickhouse的分析需求90%在500ms內(nèi):


查詢分析
  • 易企秀測試case:

clickhouse 版本:18.12.13
服務(wù)器配置:

參數(shù) 配置
CPU 32c
內(nèi)存 128g
硬盤 SSD
虛擬內(nèi)存 禁用

數(shù)據(jù):

數(shù)據(jù)量
A 4000w
B 1.3億

測試場景:

case 時(shí)間
B 單表聚合排序 2s
B + D 關(guān)聯(lián)聚合排序 11s
單表聚合
多表關(guān)聯(lián)聚合

通過對比測試,在配置相當(dāng)?shù)那闆r下測試結(jié)果差距還是很大的,那么究竟是什么原因造成的呢?該如何進(jìn)行優(yōu)化...

過程再現(xiàn)

  • 調(diào)參:
    網(wǎng)上有人說通過調(diào)大 max_memory_usage 與 max_bytes_before_external_group_by 的值可改善查詢性能(主要是處理并發(fā)query或單次查詢內(nèi)存約束的)
SET max_memory_usage = 128000000000; #128G,
SET max_memory_usage = 60000000000; #60G,

實(shí)際測試這種操作,性能并沒有任何影響,但在16C 、68G、普通硬盤環(huán)境下的clickhouse調(diào)大這兩個(gè)參數(shù)的值性能會(huì)有一倍提升。

  • 優(yōu)化建表語句


    建表語句

通過縮小分區(qū)數(shù)量性能略有提升,但不明顯

  • 優(yōu)化SQL
    JOIN操作時(shí)一定要把數(shù)據(jù)量小的表放在右邊,ClickHouse中無論是Left Join 、Right Join還是Inner Join永遠(yuǎn)都是拿著右表中的每一條記錄到左表中查找該記錄是否存在,所以右表必須是小表。

  • 優(yōu)化engine
    將普通的mergetree engin 改為特殊的memory engine,性能無任何變化。

  • io 排查
    通過測試過程中對硬盤io的監(jiān)控?cái)?shù)據(jù)看,clickhouse在計(jì)算的過程中基本沒有什么io操作,只是在最后一個(gè)階段有1-2s的寫io操作,這也側(cè)面印證mergetree的強(qiáng)大。


    memory engine

那么問題來了 ,這些都沒有明顯改善,那攜程的case是怎么快起來的呢?

初步懷疑攜程case中的操作并沒有使用到全表數(shù)據(jù),應(yīng)該在聚合前加了很多篩選條件,帶著疑問郵件了上文的作者,結(jié)論如下:


郵件
攜程多表關(guān)聯(lián)聚合的真實(shí)case
  • 我們調(diào)整后的case:


    秒查

結(jié)論

1、使用SSD盤比普通盤性能會(huì)提升1倍
2、億級(jí)別單表聚合排序最慢2s出結(jié)果,普通盤需4秒
3、多表關(guān)聯(lián)需增加過濾條件,將聚合結(jié)果控制在千萬級(jí)別內(nèi)可秒出
4、join時(shí)大表在左小表在右
5、如果不想加where條件,那么可以提前構(gòu)建大寬表或者預(yù)計(jì)算
6、按照我們業(yè)務(wù)量級(jí)上面服務(wù)器配置減半并不影響性能

其實(shí)clickhouse并不需要做什么優(yōu)化,100個(gè)并發(fā)內(nèi)單表分析可隨意操作,體驗(yàn)極佳;多表分析需根據(jù)實(shí)際使用場景針對性優(yōu)化

普通盤

認(rèn)為是對的 堅(jiān)持下去 就是對的,認(rèn)為是對的 不去堅(jiān)持 最后可能就是錯(cuò)的

目前我們實(shí)時(shí)數(shù)倉除了使用clickhouse 外 還在使用另外一個(gè)秒查引擎,億級(jí)規(guī)模場景下分析 這個(gè)engine是真的秒查哦 SnappyData

SnappyData
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容