1 需求分析
1.1 分析壓測對象
1)什么是 ClickHouse 和 Elasticsearch
ClickHouse 是一個真正的列式數(shù)據(jù)庫管理系統(tǒng)(MS)。在 ClickHouse 中,數(shù)據(jù)始終是列存儲的,包括向量(對或列塊)的執(zhí)行過程。只要有可能,操作都是基于向量進行分派的,而不是實現(xiàn)的價值,這被稱為?它有查詢實際的數(shù)據(jù)處理?。
Elasticsearch 是一款開源的引擎可以使用、這樣的RESTful 風(fēng)格的搜索分析,它的Apache 是開源的開源引擎。
- 一個索引的索引文檔存儲,字段可以被與搜索
- 一個實時分析搜索引擎
- 勝上百個服務(wù)節(jié)點的擴展支持PB人物的任性或非血數(shù)據(jù)
2)為什么要對他們進行壓測
是的劇集,非常多的點擊屋在場景中具有出色的性能,具有復(fù)雜性的基本業(yè)務(wù)查詢,但我們卻有一個非常重要的查詢業(yè)務(wù)場景,甚至是雙十一業(yè)務(wù)的真實情況,確保大型活動具有業(yè)務(wù)能力的持續(xù)性,ClickHouse 和 Elasticsearch 的性能業(yè)務(wù)場景中是否具備性能優(yōu)良的性能,通過性能壓測,中壓我們的任務(wù)點,進行抗壓,優(yōu)化設(shè)計性能。
1.2 定壓測目標(biāo)

1)從復(fù)雜度來看,接口(queryOBBacklogData)查詢了5次,代碼如下:
/**
*切ck-queryOBBacklogData
*@paramqueryBO
*@return
*/
publicOutboundBacklogRespBOqueryOBBacklogDataCKNew(OutboundBacklogQueryBOqueryBO){
log.info(" queryOBBacklogDataCK入?yún)ⅲ簕}",JSON.toJSONString(queryBO));
//公共條件-卡最近十天時間
StringcommonStartTime=DateUtils.getTime(DateUtil.format(newDate(),DateUtil.FORMAT_DATE),DateUtils.ELEVEN_AM,1,-10);
StringcommonEndTime=DateUtils.getTime(DateUtil.format(newDate(),DateUtil.FORMAT_DATE),DateUtils.ELEVEN_AM,1,1);
//越庫信息-待越庫件數(shù)&待越庫任務(wù)數(shù)
WmsObCrossDockQueryBowmsObCrossDockQueryBo=wmsObCrossDockQueryBoBuilder(queryBO,commonStartTime,commonEndTime);
log.info("queryOBBacklogDataCK-wmsObCrossDockQueryBo:{}",JSON.toJSONString(wmsObCrossDockQueryBo));
CompletableFuturepreCrossDockInfoCF=CompletableFuture.supplyAsync(
()->wmsObCrossDockMapper.preCrossDockInfo(wmsObCrossDockQueryBo),executor);
//集合任務(wù)信息-待分配訂單
WmsObAssignOrderQueryBowmsObAssignOrderQueryBo=wmsObAssignOrderQueryBoBuilder(queryBO,commonStartTime,commonEndTime);
log.info("queryOBBacklogDataCK-wmsObAssignOrderQueryBo:{}",JSON.toJSONString(wmsObAssignOrderQueryBo));
CompletableFuturepreAssignOrderQtyCF=CompletableFuture.supplyAsync(
()->wmsObAssignOrderMapper.preAssignOrderInfo(wmsObAssignOrderQueryBo),executor);
//揀貨信息-待揀貨件數(shù)&待揀貨任務(wù)數(shù)
WmsPickTaskQueryBowmsPickTaskQueryBo=wmsPickTaskQueryBoBuilder(queryBO,commonStartTime,commonEndTime);
log.info("queryOBBacklogDataCK-wmsPickTaskQueryBo:{}",JSON.toJSONString(wmsPickTaskQueryBo));
CompletableFutureprePickingInfoCF=CompletableFuture.supplyAsync(
()->wmsPickTaskMapper.pickTaskInfo(wmsPickTaskQueryBo),executor);
//分播信息-待分播件數(shù)&待分播任務(wù)
WmsCheckTaskDetailQueryBowmsCheckTaskDetailQueryBo=wmsCheckTaskDetailQueryBoBuilder(queryBO,commonStartTime,commonEndTime);
log.info("queryOBBacklogDataCK-wmsCheckTaskDetailQueryBo:{}",JSON.toJSONString(wmsCheckTaskDetailQueryBo));
CompletableFuturepreSowInfoCF=CompletableFuture.supplyAsync(
()->wmsCheckTaskDetailMapper.checkTaskDetailInfo(wmsCheckTaskDetailQueryBo),executor);
//發(fā)貨信息-待發(fā)貨件數(shù)
WmsOrderSkuQueryBowmsOrderSkuQueryBo=wmsOrderSkuQueryBoBuilder(queryBO,commonStartTime,commonEndTime);
log.info("queryOBBacklogDataCK-wmsOrderSkuQueryBo:{}",JSON.toJSONString(wmsOrderSkuQueryBo));
CompletableFuturepreDispatchCF=CompletableFuture.supplyAsync(
()->wmsOrderSkuMapper.preDispatchInfo(wmsOrderSkuQueryBo),executor);
returnprocessResult(preCrossDockInfoCF,preAssignOrderQtyCF,prePickingInfoCF,preSowInfoCF,preDispatchCF);
}
2)查詢表(OBBacklogData),查詢了5個表:
wms.wms_ob_cross_dock
wms.wms_ob_assign_order
wms.wms_picking_task.
wms.wms_check_task_detail
wms.wms_order_sku
3)查詢的數(shù)據(jù)量,如下:
select
(ifnull(sum(m.shouldBeCrossedDockQty),
0)-
ifnull(sum(m.satisfiedCrossedDockQty),
0))aspreCrossStockSkuQty,
count(m.docId)aspreCrossStockTaskQty
from
wms.wms_ob_cross_dockmfinal
prewhere
m.createTime>='2021-12-031100'
andm.createTime<=?'2021-12-141100'
andm.warehouseNo='279_1'
andm.orderType='10'
andtenantCode='TC90230202'
where
m.deleted=0
andm.deliveryDestination='2'
andm.shipmentOrderDeleted=0
andm.status=0

可以從上面的SQL截圖中,查詢待越庫文件數(shù)&待越庫任務(wù)數(shù)共讀取720817行數(shù)據(jù)
selectcount(distinctm.orderNo)aspreAssignedOrderQty
fromwms.wms_ob_assign_ordermfinal
prewhere
m.createTime>='2021-12-031100'
andm.createTime<=?'2021-12-141100'
andm.warehouseNo='361_0'
andtenantCode='TC90230202'
wherem.taskassignStatus=0
andm.deliveryDestination=2
andm.stopProductionFlag=0
andm.deleted=0
andm.orderType=10

上面的 SQL 截圖共讀取了,可以從查詢?nèi)蝿?wù)信息 - 集合待分配訂單,153118 行數(shù)據(jù)
selectminus(toInt32(ifnull(sum(m.locateQty),toDecimal64(0,4))),
toInt32(ifnull(sum(m.pickedQty),toDecimal64(0,4))))asprePickingSkuQty,
count(distinctm.taskNo)asprePickingTaskQty
fromwms.wms_picking_taskmfinal
prewhere
m.shipmentOrderCreateTime>='2021-12-031100'
andm.shipmentOrderCreateTime<=?'2021-12-141100'
andm.warehouseNo='286_1'
andtenantCode='TC90230202'
wherem.pickingTaskDeleted=0
andm.deliveryDestination=2
andm.pickLocalDetailDeleted=0
andm.shipmentOrderDeleted=0
andm.orderType=10
and(m.operateStatus=0orm.operateStatus=1)

上面的SQL截圖&可以從查詢揀貨任務(wù)信息-待揀貨件數(shù)條,共讀到2673536個數(shù)據(jù)
selectminus(toInt32(ifnull(sum(m.locateQty),toDecimal64(0,4))),
toInt32(ifnull(sum(m.pickedQty),toDecimal64(0,4))))asprePickingSkuQty,
count(distinctm.taskNo)asprePickingTaskQty
fromwms.wms_picking_taskmfinal
prewhere
m.shipmentOrderCreateTime>='2021-12-031100'
andm.shipmentOrderCreateTime<=?'2021-12-141100'
andm.warehouseNo='279_1'
andtenantCode='TC90230202'
wherem.pickingTaskDeleted=0
andm.deliveryDestination=2
andm.pickLocalDetailDeleted=0
andm.shipmentOrderDeleted=0
andm.orderType=10
and(m.operateStatus=0orm.operateStatus=1)

以上SQL截圖-可以從分查詢分播信息行數(shù)待播播任務(wù),共讀148149個數(shù)據(jù)
selectifnull(sum(m.unTrackQty),0)asunTrackQty
fromwms.wms_order_skumfinal
prewhere
m.shipmentOrderCreateTime>='2021-12-031100'
andm.shipmentOrderCreateTime<=?'2021-12-141100'
andm.warehouseNo='280_1'
andm.orderType='10'
andm.deliveryDestination='2'
andtenantCode='TC90230202'
wherem.shipmentOrderDeleted<>'1'
andm.ckDeliveryTaskDeleted<>'1'
andm.ckDeliveryTaskDetailDeleted<>'1'
andm.ckDeliveryTaskStatusin('1','0','2')

上面的 SQL 共讀取可以從查詢收到的信息 - 待件數(shù),截圖 99591 行數(shù)據(jù)
基于 Spring Boot + MyBatis Plus + Vue & Element 實現(xiàn)的后臺管理系統(tǒng) + 用戶小程序,支持 RBAC 動態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能
- 項目地址:https://gitee.com/zhijiantianya/ruoyi-vue-pro
- 視頻教程:https://doc.iocoder.cn/video/
2 測試環(huán)境準(zhǔn)備
為了發(fā)揮壓測作用,履行壓測環(huán)境,應(yīng)該使用其他類似的環(huán)境一致,所以我們應(yīng)該使用類似的環(huán)境一致了和類似的環(huán)境
基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實現(xiàn)的后臺管理系統(tǒng) + 用戶小程序,支持 RBAC 動態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能
3 采集工具準(zhǔn)備
工具監(jiān)控
- http://origin.jd.com/ :監(jiān)控 JVM,方法等級監(jiān)控(提供秒級支持)
- http ://console.jex.jd/ :提供異常監(jiān)控,火焰圖監(jiān)控、資源分析。
- http://x.devops.jdcloud.com/ :支持查看clickhouse/Elasticsearch 數(shù)據(jù)庫服務(wù)器每個節(jié)點的cpu使用率
- http://dashboard.fireeye.jdl.cn/ :應(yīng)用服務(wù)器cpu使用率、內(nèi)存使用率監(jiān)控
4 壓測執(zhí)行及結(jié)果分析
4.1 編寫壓測腳本工具
Forcebot(http://force.jd.com) 是一個為開發(fā)人員、測試人員提供的性能測試平臺,通過編寫、配置、場景任務(wù)、實時監(jiān)控、日志定位、發(fā)布監(jiān)控、設(shè)置報告操作的流程來完成測試,靈活的腳本配置滿足同步性能、異步、集合點等各種發(fā)壓模式。
幫助文檔(http://doc.jd.com/forcebot/helper/)
4.2 設(shè)計壓測數(shù)據(jù)
4.2.1 壓測中名詞解釋
- DBCP:數(shù)據(jù)庫連接,是apache的一個Java連接項目。DBCP通過連接池上的數(shù)據(jù)庫同建立一些連接內(nèi)存中(即連接池中),應(yīng)用程序需要建立數(shù)據(jù)庫時直接到從連接池中申請一個連接使用,使用后由回收該連接,從而達(dá)到連接復(fù)用完成,減少資源消耗的目的。
- maxTotal:是連接池中總連接的最大數(shù)量,默認(rèn)值為8
- max_thread:clickhouse中配置,處理SQL請求時使用的最大線程數(shù)。數(shù)值是clickhouse服務(wù)器的核心數(shù)量。
- 協(xié)調(diào):協(xié)調(diào)節(jié)點數(shù),主要作用于請求,請求轉(zhuǎn)發(fā)請求響應(yīng)處理等輕量級
- 數(shù)據(jù)節(jié)點:主要是存儲索引節(jié)點的節(jié)點,主要是對文檔進行刪除,聚合操作等。的時候,需要在群里添加新的節(jié)點
4.2.2 壓測數(shù)據(jù)
clickhouse數(shù)據(jù)服務(wù):32C128G6節(jié)點2副本
應(yīng)用服務(wù)器:4 核 8G 2maxTotal=16
注: 每次壓測前,一定要觀察每個數(shù)據(jù)節(jié)點的 cpu 使用率

注: 從上面的壓測過程中,序號-12,數(shù)據(jù)庫中的數(shù)據(jù)庫中的數(shù)據(jù)池中的數(shù)據(jù)可以在tps 6號,但沒有增加數(shù)據(jù)庫中的大數(shù)據(jù),但沒有更多的變化,檢查數(shù)字未配置,默認(rèn)的數(shù)字是連接的8個最大的地方用戶數(shù)增加至8以后,clickhouse cpu穩(wěn)定在40%~50%之間不再增加,應(yīng)用服務(wù)器CPU穩(wěn)定在25%左右。
之后我們調(diào)整 max50,通過 max_thread 不同的值,節(jié)點 CPU 使用率保持在左右,來查看數(shù)據(jù):服務(wù)器 CPU 使用率、TP、TP99、應(yīng)用指標(biāo)總比例 = 監(jiān)控數(shù)。

clickhouse 數(shù)據(jù)節(jié)點,CPU 使用率:

Elasticsearch 數(shù)據(jù)服務(wù):328G6 2 2 副本應(yīng)用服務(wù)器:4 8G 2Elasticsearch 節(jié)點服務(wù)器保持?jǐn)?shù)據(jù)庫服務(wù)器 CPU 使用率達(dá)到50%左右(50%左右),重新監(jiān)控數(shù)據(jù)節(jié)點、tp99 指標(biāo):coating 節(jié)點協(xié)調(diào)數(shù)、數(shù)據(jù)節(jié)點大小
指標(biāo)1:coordinating=2,數(shù)據(jù)偏差=4,poolSize=400

在測的過程中,CPU 的使用率達(dá)到 51.6%,注平均的發(fā)現(xiàn)率在 9% 的情況下,協(xié)調(diào)每個節(jié)點的負(fù)載率,所以需要協(xié)調(diào)每個節(jié)點
指標(biāo)2:coordinating=4,數(shù)據(jù)偏差=5,poolSize=800

注: 在壓測的過程中,發(fā)現(xiàn)CPU使用率(數(shù)據(jù)庫)ES數(shù)據(jù)節(jié)點在40%左右的時候,發(fā)現(xiàn)一直上不去,查看日志activeCount已經(jīng)達(dá)到797,需要增加poolSize值
指標(biāo)3:coordinating=4,數(shù)據(jù)偏差=5,poolSize=1200

注: 壓測過程中,發(fā)現(xiàn)協(xié)調(diào)節(jié)點支持還是需要擴容,不能現(xiàn)在數(shù)據(jù)節(jié)點cpu使用率達(dá)到50%Elasticsearch數(shù)據(jù)節(jié)點及協(xié)調(diào)節(jié)點,CPU使用率:

我們在壓測的過程中發(fā)現(xiàn)一些在開發(fā)過程中沒有發(fā)現(xiàn)的問題,首先 bdcp 數(shù)大數(shù)據(jù)應(yīng)用服務(wù)器,使用的線程池數(shù)線程數(shù)為 8 時,使需求,用戶增加至 8 以后,clickhouse 的 cpu CPU 20%~55%之間穩(wěn)定左右穩(wěn)定,CPU 40%左右穩(wěn)定運行,CPU40服務(wù)器20左右,服務(wù)器使用率高,是clickhouse-jdbc解析sql效率低。
4.3 結(jié)果分析
4.3.1 測試結(jié)束
1)clickhouse對有一定的支持,通過不支持高線程,可以調(diào)整線程的增加
- max_thread=32 時,支持最大TPS 為37,相應(yīng)TP99 為122
- max_thread=2 時,支持最大TPS 66,相應(yīng)TP99 155
- max_thread=1 時,支持最大TPS 86,相應(yīng)TP99 206
2)在很多方面,Elasticsearch 比 clickhouse 支持的更好,但相應(yīng)的響應(yīng)速度慢
- Elasticsearch:TPS 是 192,TP99 是 3050
- clickhouse:TPS 是 86,TP99 是 206
考考,認(rèn)為clickhouse是我們普遍接受我們的業(yè)務(wù)訴求
4.3.2 優(yōu)化建議
- 對 ES 協(xié)商節(jié)點進行擴容
- bigdata 應(yīng)用至最大線程數(shù)調(diào)高 200
- bigdata 應(yīng)用 dbcp 線程池 maxTotal 設(shè)置成 50
- 讀取配置文件工具類增加內(nèi)存緩存
審核編輯:湯梓紅
-
cpu
+關(guān)注
關(guān)注
68文章
11013瀏覽量
215303 -
開源
+關(guān)注
關(guān)注
3文章
3537瀏覽量
43318 -
腳本
+關(guān)注
關(guān)注
1文章
395瀏覽量
28309 -
Elasticsearch
+關(guān)注
關(guān)注
0文章
30瀏覽量
2960
原文標(biāo)題:ClickHouse和Elasticsearch壓測對比,誰是yyds?
文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
linux安裝配置ElasticSearch之源碼安裝
Centos7下如何搭建ClickHouse列式存儲數(shù)據(jù)庫
ClickHouse與esProc SPL性能對比
替代ELK:ClickHouse+Kafka+FlieBeat才是最絕的
ElasticSearch是什么?應(yīng)用場景是什么?
火山引擎:ClickHouse增強計劃之“多表關(guān)聯(lián)查詢”
ClickHouse增強計劃之“資源隔離”
Elasticsearch保姆級入門

評論