1 需求分析
1.1 分析壓測(cè)對(duì)象
1)什么是 ClickHouse 和 Elasticsearch
ClickHouse 是一個(gè)真正的列式數(shù)據(jù)庫(kù)管理系統(tǒng)(MS)。在 ClickHouse 中,數(shù)據(jù)始終是列存儲(chǔ)的,包括向量(對(duì)或列塊)的執(zhí)行過(guò)程。只要有可能,操作都是基于向量進(jìn)行分派的,而不是實(shí)現(xiàn)的價(jià)值,這被稱(chēng)為?它有查詢(xún)實(shí)際的數(shù)據(jù)處理?。
Elasticsearch 是一款開(kāi)源的引擎可以使用、這樣的RESTful 風(fēng)格的搜索分析,它的Apache 是開(kāi)源的開(kāi)源引擎。
- 一個(gè)索引的索引文檔存儲(chǔ),字段可以被與搜索
- 一個(gè)實(shí)時(shí)分析搜索引擎
- 勝上百個(gè)服務(wù)節(jié)點(diǎn)的擴(kuò)展支持PB人物的任性或非血數(shù)據(jù)
2)為什么要對(duì)他們進(jìn)行壓測(cè)
是的劇集,非常多的點(diǎn)擊屋在場(chǎng)景中具有出色的性能,具有復(fù)雜性的基本業(yè)務(wù)查詢(xún),但我們卻有一個(gè)非常重要的查詢(xún)業(yè)務(wù)場(chǎng)景,甚至是雙十一業(yè)務(wù)的真實(shí)情況,確保大型活動(dòng)具有業(yè)務(wù)能力的持續(xù)性,ClickHouse 和 Elasticsearch 的性能業(yè)務(wù)場(chǎng)景中是否具備性能優(yōu)良的性能,通過(guò)性能壓測(cè),中壓我們的任務(wù)點(diǎn),進(jìn)行抗壓,優(yōu)化設(shè)計(jì)性能。
1.2 定壓測(cè)目標(biāo)
會(huì)選擇這個(gè)(queryOBBacklogData)接口呢?
1)從復(fù)雜度來(lái)看,接口(queryOBBacklogData)查詢(xún)了5次,代碼如下:
/**
*切ck-queryOBBacklogData
*@paramqueryBO
*@return
*/
publicOutboundBacklogRespBOqueryOBBacklogDataCKNew(OutboundBacklogQueryBOqueryBO){
log.info(" queryOBBacklogDataCK入?yún)ⅲ簕}",JSON.toJSONString(queryBO));
//公共條件-卡最近十天時(shí)間
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);
//越庫(kù)信息-待越庫(kù)件數(shù)&待越庫(kù)任務(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)查詢(xún)表(OBBacklogData),查詢(xún)了5個(gè)表:
wms.wms_ob_cross_dock
wms.wms_ob_assign_order
wms.wms_picking_task.
wms.wms_check_task_detail
wms.wms_order_sku
3)查詢(xún)的數(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截圖中,查詢(xún)待越庫(kù)文件數(shù)&待越庫(kù)任務(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 截圖共讀取了,可以從查詢(xún)?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截圖&可以從查詢(xún)揀貨任務(wù)信息-待揀貨件數(shù)條,共讀到2673536個(gè)數(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截圖-可以從分查詢(xún)分播信息行數(shù)待播播任務(wù),共讀148149個(gè)數(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 共讀取可以從查詢(xún)收到的信息 - 待件數(shù),截圖 99591 行數(shù)據(jù)
基于 Spring Boot + MyBatis Plus + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶(hù)小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶(hù)、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能
- 項(xiàng)目地址:https://gitee.com/zhijiantianya/ruoyi-vue-pro
- 視頻教程:https://doc.iocoder.cn/video/
2 測(cè)試環(huán)境準(zhǔn)備
為了發(fā)揮壓測(cè)作用,履行壓測(cè)環(huán)境,應(yīng)該使用其他類(lèi)似的環(huán)境一致,所以我們應(yīng)該使用類(lèi)似的環(huán)境一致了和類(lèi)似的環(huán)境
基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶(hù)小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶(hù)、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能
3 采集工具準(zhǔn)備
工具監(jiān)控
- http://origin.jd.com/ :監(jiān)控 JVM,方法等級(jí)監(jiān)控(提供秒級(jí)支持)
- http ://console.jex.jd/ :提供異常監(jiān)控,火焰圖監(jiān)控、資源分析。
- http://x.devops.jdcloud.com/ :支持查看clickhouse/Elasticsearch 數(shù)據(jù)庫(kù)服務(wù)器每個(gè)節(jié)點(diǎn)的cpu使用率
- http://dashboard.fireeye.jdl.cn/ :應(yīng)用服務(wù)器cpu使用率、內(nèi)存使用率監(jiān)控
4 壓測(cè)執(zhí)行及結(jié)果分析
4.1 編寫(xiě)壓測(cè)腳本工具
Forcebot(http://force.jd.com) 是一個(gè)為開(kāi)發(fā)人員、測(cè)試人員提供的性能測(cè)試平臺(tái),通過(guò)編寫(xiě)、配置、場(chǎng)景任務(wù)、實(shí)時(shí)監(jiān)控、日志定位、發(fā)布監(jiān)控、設(shè)置報(bào)告操作的流程來(lái)完成測(cè)試,靈活的腳本配置滿(mǎn)足同步性能、異步、集合點(diǎn)等各種發(fā)壓模式。
幫助文檔(http://doc.jd.com/forcebot/helper/)
4.2 設(shè)計(jì)壓測(cè)數(shù)據(jù)
4.2.1 壓測(cè)中名詞解釋
- DBCP:數(shù)據(jù)庫(kù)連接,是apache的一個(gè)Java連接項(xiàng)目。DBCP通過(guò)連接池上的數(shù)據(jù)庫(kù)同建立一些連接內(nèi)存中(即連接池中),應(yīng)用程序需要建立數(shù)據(jù)庫(kù)時(shí)直接到從連接池中申請(qǐng)一個(gè)連接使用,使用后由回收該連接,從而達(dá)到連接復(fù)用完成,減少資源消耗的目的。
- maxTotal:是連接池中總連接的最大數(shù)量,默認(rèn)值為8
- max_thread:clickhouse中配置,處理SQL請(qǐng)求時(shí)使用的最大線(xiàn)程數(shù)。數(shù)值是clickhouse服務(wù)器的核心數(shù)量。
- 協(xié)調(diào):協(xié)調(diào)節(jié)點(diǎn)數(shù),主要作用于請(qǐng)求,請(qǐng)求轉(zhuǎn)發(fā)請(qǐng)求響應(yīng)處理等輕量級(jí)
- 數(shù)據(jù)節(jié)點(diǎn):主要是存儲(chǔ)索引節(jié)點(diǎn)的節(jié)點(diǎn),主要是對(duì)文檔進(jìn)行刪除,聚合操作等。的時(shí)候,需要在群里添加新的節(jié)點(diǎn)
4.2.2 壓測(cè)數(shù)據(jù)
clickhouse數(shù)據(jù)服務(wù):32C128G6節(jié)點(diǎn)2副本
應(yīng)用服務(wù)器:4 核 8G 2maxTotal=16
注: 每次壓測(cè)前,一定要觀察每個(gè)數(shù)據(jù)節(jié)點(diǎn)的 cpu 使用率
注: 從上面的壓測(cè)過(guò)程中,序號(hào)-12,數(shù)據(jù)庫(kù)中的數(shù)據(jù)庫(kù)中的數(shù)據(jù)池中的數(shù)據(jù)可以在tps 6號(hào),但沒(méi)有增加數(shù)據(jù)庫(kù)中的大數(shù)據(jù),但沒(méi)有更多的變化,檢查數(shù)字未配置,默認(rèn)的數(shù)字是連接的8個(gè)最大的地方用戶(hù)數(shù)增加至8以后,clickhouse cpu穩(wěn)定在40%~50%之間不再增加,應(yīng)用服務(wù)器CPU穩(wěn)定在25%左右。
之后我們調(diào)整 max50,通過(guò) max_thread 不同的值,節(jié)點(diǎn) CPU 使用率保持在左右,來(lái)查看數(shù)據(jù):服務(wù)器 CPU 使用率、TP、TP99、應(yīng)用指標(biāo)總比例 = 監(jiān)控?cái)?shù)。
clickhouse 數(shù)據(jù)節(jié)點(diǎn),CPU 使用率:
Elasticsearch 數(shù)據(jù)服務(wù):328G6 2 2 副本應(yīng)用服務(wù)器:4 8G 2Elasticsearch 節(jié)點(diǎn)服務(wù)器保持?jǐn)?shù)據(jù)庫(kù)服務(wù)器 CPU 使用率達(dá)到50%左右(50%左右),重新監(jiān)控?cái)?shù)據(jù)節(jié)點(diǎn)、tp99 指標(biāo):coating 節(jié)點(diǎn)協(xié)調(diào)數(shù)、數(shù)據(jù)節(jié)點(diǎn)大小
指標(biāo)1:coordinating=2,數(shù)據(jù)偏差=4,poolSize=400
在測(cè)的過(guò)程中,CPU 的使用率達(dá)到 51.6%,注平均的發(fā)現(xiàn)率在 9% 的情況下,協(xié)調(diào)每個(gè)節(jié)點(diǎn)的負(fù)載率,所以需要協(xié)調(diào)每個(gè)節(jié)點(diǎn)
指標(biāo)2:coordinating=4,數(shù)據(jù)偏差=5,poolSize=800
注: 在壓測(cè)的過(guò)程中,發(fā)現(xiàn)CPU使用率(數(shù)據(jù)庫(kù))ES數(shù)據(jù)節(jié)點(diǎn)在40%左右的時(shí)候,發(fā)現(xiàn)一直上不去,查看日志activeCount已經(jīng)達(dá)到797,需要增加poolSize值
指標(biāo)3:coordinating=4,數(shù)據(jù)偏差=5,poolSize=1200
注: 壓測(cè)過(guò)程中,發(fā)現(xiàn)協(xié)調(diào)節(jié)點(diǎn)支持還是需要擴(kuò)容,不能現(xiàn)在數(shù)據(jù)節(jié)點(diǎn)cpu使用率達(dá)到50%Elasticsearch數(shù)據(jù)節(jié)點(diǎn)及協(xié)調(diào)節(jié)點(diǎn),CPU使用率:
我們?cè)趬簻y(cè)的過(guò)程中發(fā)現(xiàn)一些在開(kāi)發(fā)過(guò)程中沒(méi)有發(fā)現(xiàn)的問(wèn)題,首先 bdcp 數(shù)大數(shù)據(jù)應(yīng)用服務(wù)器,使用的線(xiàn)程池?cái)?shù)線(xiàn)程數(shù)為 8 時(shí),使需求,用戶(hù)增加至 8 以后,clickhouse 的 cpu CPU 20%~55%之間穩(wěn)定左右穩(wěn)定,CPU 40%左右穩(wěn)定運(yùn)行,CPU40服務(wù)器20左右,服務(wù)器使用率高,是clickhouse-jdbc解析sql效率低。
4.3 結(jié)果分析
4.3.1 測(cè)試結(jié)束
1)clickhouse對(duì)有一定的支持,通過(guò)不支持高線(xiàn)程,可以調(diào)整線(xiàn)程的增加
- max_thread=32 時(shí),支持最大TPS 為37,相應(yīng)TP99 為122
- max_thread=2 時(shí),支持最大TPS 66,相應(yīng)TP99 155
- max_thread=1 時(shí),支持最大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)化建議
- 對(duì) ES 協(xié)商節(jié)點(diǎn)進(jìn)行擴(kuò)容
- bigdata 應(yīng)用至最大線(xiàn)程數(shù)調(diào)高 200
- bigdata 應(yīng)用 dbcp 線(xiàn)程池 maxTotal 設(shè)置成 50
- 讀取配置文件工具類(lèi)增加內(nèi)存緩存
審核編輯:湯梓紅
-
cpu
+關(guān)注
關(guān)注
68文章
10806瀏覽量
210850 -
開(kāi)源
+關(guān)注
關(guān)注
3文章
3218瀏覽量
42329 -
腳本
+關(guān)注
關(guān)注
1文章
387瀏覽量
14811 -
Elasticsearch
+關(guān)注
關(guān)注
0文章
26瀏覽量
2816
原文標(biāo)題:ClickHouse和Elasticsearch壓測(cè)對(duì)比,誰(shuí)是yyds?
文章出處:【微信號(hào):芋道源碼,微信公眾號(hào):芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論