Druid.io大查詢分析思路

Druid.io 是CPU和IO雙密集型的大數(shù)據(jù)組件疾渴,因為Druid架構(gòu)中無論是處理實時數(shù)據(jù)攝入的peon進程還是存儲歷史數(shù)據(jù)的歷史節(jié)點,在負責(zé)數(shù)據(jù)存儲的同時還需要處理其節(jié)點上數(shù)據(jù)的查詢髓堪。因為這樣的架構(gòu)送朱,導(dǎo)致Druid的服務(wù)節(jié)點對磁盤,內(nèi)存和CPU都有著比較高的要求干旁。而Druid架構(gòu)本身是無法對查詢進行隔離的驶沼,所以單個節(jié)點上可能并行處理著多條查詢。而處理查詢的線程資源和內(nèi)存資源是有限的争群,所以查詢之間可能存在互相影響回怜。在這樣的背景下,當(dāng)查詢耗時比較久需要定位原因時换薄,面對紛繁的指標(biāo)玉雾,如果沒有正確的思路,那么問題定位可能會浪費開發(fā)或運維人員較多的時間轻要。為此抹凳,將自己日常工作中學(xué)習(xí)到的查詢問題定位流程總結(jié),方便日后不斷優(yōu)化問題分析流程伦腐。此次總結(jié)主要以歷史數(shù)據(jù)查詢?yōu)橹鳌?/p>

1. 預(yù)備備

1.1 查詢鏈路

Druid查詢鏈路

拿出一張精簡的查詢流程圖,我們先簡單的看一下Druid查詢的大概流程失都,不考慮太多的外部依賴柏蘑。
①首先客戶端發(fā)送http請求,請求Broker節(jié)點(假設(shè)集群中沒有設(shè)置Router節(jié)點)粹庞;
②接著Broker就會根據(jù)zookeeper上信息咳焚,把客戶端查詢拆分成不同的subquery,分發(fā)給不同的查詢節(jié)點庞溜;
③實時數(shù)據(jù)查詢路由給middleManager上的peon進程革半,歷史數(shù)據(jù)查詢路由給相應(yīng)的historical節(jié)點;
④各個查詢節(jié)點處理完查詢之后把查詢節(jié)點返回給Broker流码;
⑤Broker節(jié)點把各個節(jié)點返回的結(jié)果進行合并又官,返回給客戶端。至此漫试,一個完整的查詢鏈路結(jié)束六敬。

1.2 Druid監(jiān)控指標(biāo)

在之前的文章中也有提過,Druid組件會將自身的指標(biāo)信息通過emitter發(fā)送出來驾荣。這一部分信息我們是可以采集到的外构,Druid原生也支持httpEmitter普泡。通過這個emitter我們可以將指標(biāo)信息發(fā)送給本地或者其他的http服務(wù),通過http服務(wù)我們可以將指標(biāo)信息發(fā)送到kafka的topic中审编,這樣我們就可以像攝入一般實時數(shù)據(jù)那樣保存實時的Druid指標(biāo)信息了撼班。
目前我們生產(chǎn)上是這樣采集指標(biāo)信息的,流程架構(gòu)如下:

image.png

社區(qū)還有一些其他的emitter垒酬,沒有嘗試過砰嘁,感興趣的可以去官網(wǎng)了解一下。
Druid的指標(biāo)還是相當(dāng)豐富的伤溉,這里不做一一介紹般码,主要說幾個跟查詢分析有關(guān)的指標(biāo)。

Broker端

metric Description 關(guān)聯(lián)維度
query/time 查詢耗時乱顾,這個耗時是相對于整個查詢而言 Common: dataSource, type, interval, hasFilters, duration, context, remoteAddress, id. Aggregation Queries: numMetrics, numComplexMetrics. GroupBy: numDimensions. TopN: threshold, dimension.
query/node/bytes 各個節(jié)點返回的數(shù)據(jù) id, status, server.
query/node/ttfb 子查詢從節(jié)點上返回第一個結(jié)果的耗時 id, status, server

Historical端

metric Description 關(guān)聯(lián)維度
query/time 查詢耗時,這個耗時是指某條查詢在這個單個節(jié)點上的耗時 Common: dataSource, type, interval, hasFilters, duration, context, remoteAddress, id. Aggregation Queries: numMetrics, numComplexMetrics. GroupBy: numDimensions. TopN: threshold, dimension
query/segment/time 單個segment的查詢耗時 id, status, segment.
query/wait/time 某條查詢或者某個segment等待給執(zhí)行的時間 id, segment

Jetty

metric Description
jetty/numOpenConnections jetty的連接數(shù)量

以上板祝,分析大查詢的主要指標(biāo)就是這些了。

2. 淡定分析

一般情況走净,當(dāng)大查詢出現(xiàn)之后券时,我們能獲取到的信息一般有兩個:

  1. queryID
  2. 查詢時間

那我們的分析也就從這兩個已知信息入手。首先我們要知道的是伏伯,一個查詢耗時很長橘洞,可能并不是它本身涉及到的數(shù)據(jù)量過大或查詢語句過于復(fù)雜,也可能是因為其他的大查詢占用了太多的資源说搅,導(dǎo)致它的耗時增加炸枣。所以,分析這類查詢問題的時候我們不能只關(guān)注于這個點的問題弄唧,更要在縱向上分析其他的的查詢是否有問題适肠。
以下為了方便描述,我就使用plyql來查詢Druid的指標(biāo)信息候引。這個是一款可以將SQL語句轉(zhuǎn)換成Druid查詢的工具侯养。沒有的話,也可以人工把下面的SQL語句轉(zhuǎn)換成json查詢澄干。

2.1 首先確認查詢在哪些節(jié)點上耗時比較長

./plyql -h druid-broker-host:8082 -q "select __time, host, value_max   from druid_metrics where metric in ('query/time') and __time>='2019-12-09T13:50:00+08:00' and __time<='2019-12-09T14:05:00+08:00' and id = ''test-query-id" '

返回結(jié)果如下

image.png

注意:返回的結(jié)果中有個8082端口逛揩,這個是broker節(jié)點的端口號,后面我們可以通過這個確認查詢路由到的broker麸俘,然后從這個broker日志中撈出queryID對應(yīng)的查詢語句辩稽。
我們可以看到這個查詢被分發(fā)到了不同的歷史節(jié)點上,而且每個節(jié)點的查詢耗時都比較長从媚。這里我們可以先從一個歷史節(jié)點分析搂誉,例如:historical01。我們要分析這個查詢在這個節(jié)點上是否是因為其他的查詢才導(dǎo)致的耗時較長。這里我們就要用到兩個指標(biāo)炭懊,一個query/wait/time,quer/sgment/time并级。如果前者過大,則可能是因為節(jié)點要處理的查詢過多侮腹。如果后者過大嘲碧,則大概率是因為查詢本身過于復(fù)雜導(dǎo)致,但是這種情況下父阻,一般通過判斷查詢語句就能看出了愈涩,這里就不考慮這種情況了。其實加矛,還有第三種情況就是query/wait/time,quer/sgment/time這兩個指標(biāo)值都不大履婉,但是查詢的耗時很長。目前我們生產(chǎn)環(huán)境中斟览,第三種情況是比較常見的毁腿。這個和第一種情況一樣,一般都是因為其他查詢的影響導(dǎo)致的苛茂。所以我們要查看已烤,這個query所在節(jié)點對應(yīng)時間點的前一段時間是否出現(xiàn)了大查詢,即耗時比較長的查詢妓羊。我們先查看query/wait/timequer/sgment/time這兩個指標(biāo)胯究。

./plyql -h druid-broker-host:8082 -q "select segment,metric, value_max from druid_metrics where metric in ('query/segment/time','query/wait/time') and __time>='2019-12-09T13:50:00+08:00' and __time<='2019-12-09T14:05:00+08:00' and id = 'test-query-id' and host='historical01:8083' "
image.png

從返回的結(jié)果來看,query和wait的time都不算很長躁绸,但是我們知道這個查詢在這個節(jié)點上耗時很長裕循。所以肯定有很多的時間是耗費在等待資源上了。那么我們現(xiàn)在要做的就是找出這個占資源的查詢净刮,分析它為什么占了資源剥哑。

2.2 確認資源使用較多的查詢

還是在這個歷史節(jié)點上,我們查看這個查詢之前的一段時間庭瑰,看看是否有耗時比較大的查詢。這里需要使用子查詢抢埋,因為我們要選出查詢耗時較長的查詢弹灭,而且需要根據(jù)時間排序。因為一般都是最早的那個耗時較多的查詢導(dǎo)致后面的查詢耗時增加揪垄。

 ./plyql -h druid-broker-host:8082 -q "select * from (select __time,id, value_max   from druid_metrics where metric in ('query/time') and __time>='2019-12-09T13:50:00+08:00' and __time<='2019-12-09T14:05:00+08:00' and host='historical01:8083' order by value_max desc limit 30) order by __time""
image.png

從結(jié)果來看每個查詢的耗時都比較大穷吮,這樣我們是沒法確認,我們需要找的是一個分界的值饥努。這里的查詢時間還沒有到達我們過濾的邊界捡鱼,所以我們增加返回的數(shù)據(jù)量。

 ./plyql -h druid-broker-host:8082 -q "select * from (select __time,id, value_max   from druid_metrics where metric in ('query/time') and __time>='2019-12-09T13:50:00+08:00' and __time<='2019-12-09T14:05:00+08:00' and host='historical01:8083' order by value_max desc limit 100) order by __time""

image.png

到這里我們就找到了最開始耗時比較長的查詢酷愧。那么接下來就是分析一波這幾個查詢驾诈〔纾可以用之前類似的query/wait/timequery/segment/time來分析。如果query/segment/time比較大乍迄,那么基本上就是這個查詢的問題了管引。接著就可以把這個查詢的查詢語句從日志里撈出來看了。查詢語句記錄在broker的日志里闯两,怎么確定broker我們在之前的查詢中已經(jīng)提到過了褥伴。
但是,有一種情況也有可能發(fā)生漾狼,就是這個最開始的幾個查詢的query/wait/timequery/segment/time這兩個指標(biāo)也不大重慢,但是查詢耗時長。這時候就要進行第三步分析了逊躁。

3. 確認處理查詢的并發(fā)量

這個我們可以從兩個方面考慮似踱,一個是這段時間的查詢訪問量,一個是jetty的連接數(shù)志衣。當(dāng)節(jié)點處理的查詢并發(fā)比較大時屯援,也可能會對資源造成較大的壓力,導(dǎo)致查詢耗時增加念脯。這個可以通過zabbix查看到是節(jié)點的性能情況狞洋,這里只從Druid層面分析。

3.1 查詢訪問量

每個查詢都會對應(yīng)一個queryID绿店,我們只需要對這段時間的queryID做個簡單的count就可以算出這個節(jié)點的查詢訪問量了吉懊。

./plyql -h druid-broker-host:8082 -q "select count(id)   from druid_metrics where metric in ('query/time') and __time>='2019-12-09T13:50:00+08:00' and __time<='2019-12-09T14:05:00+08:00' and host='historical01:8083'"
image.png

如果需要查看dataSource訪問量的話,只需要再做個group by:

./plyql -h druid-broker-host:8082 -q "select count(id)   from druid_metrics where metric in ('query/time') and __time>='2019-12-09T13:50:00+08:00' and __time<='2019-12-09T14:05:00+08:00' and host='historical01:8083' group by dataSource"
image.png

3.1 jetty連接數(shù)

./plyql -h druid-broker-host:8082 -q "select __time, value_max from druid_metrics where metric in ('jetty/numOpenConnections') and __time>='2019-12-09T13:50:00+08:00' and __time<='2019-12-09T14:05:00+08:00' and host='historical01:8083'"
image.png

這兩個指標(biāo)假勿,可以跟歷史數(shù)據(jù)比較借嗽,就可以知道訪問量是否有波動了。

4. 小結(jié)

其實Druid查詢涉及到的內(nèi)容比較多转培,這里只討論如何分析耗時比較長的情況恶导。但是為什么會導(dǎo)致這種情況,如何去避免這種情況的產(chǎn)生浸须?這又會涉及到Druid本身的數(shù)據(jù)分配和查詢路由策略惨寿。這一部分若有機會,再做總結(jié)删窒。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末裂垦,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子肌索,更是在濱河造成了極大的恐慌蕉拢,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異晕换,居然都是意外死亡午乓,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進店門届巩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來硅瞧,“玉大人,你說我怎么就攤上這事恕汇⊥筮螅” “怎么了?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵瘾英,是天一觀的道長枣接。 經(jīng)常有香客問我,道長缺谴,這世上最難降的妖魔是什么但惶? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮湿蛔,結(jié)果婚禮上膀曾,老公的妹妹穿的比我還像新娘。我一直安慰自己阳啥,他們只是感情好添谊,可當(dāng)我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著察迟,像睡著了一般斩狱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上扎瓶,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天所踊,我揣著相機與錄音,去河邊找鬼概荷。 笑死秕岛,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的误证。 我是一名探鬼主播继薛,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼雷厂!你這毒婦竟也來了惋增?” 一聲冷哼從身側(cè)響起叠殷,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤改鲫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體像棘,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡稽亏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了缕题。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片截歉。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖烟零,靈堂內(nèi)的尸體忽然破棺而出瘪松,到底是詐尸還是另有隱情,我是刑警寧澤锨阿,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布宵睦,位于F島的核電站,受9級特大地震影響墅诡,放射性物質(zhì)發(fā)生泄漏壳嚎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一末早、第九天 我趴在偏房一處隱蔽的房頂上張望烟馅。 院中可真熱鬧,春花似錦然磷、人聲如沸郑趁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽穿撮。三九已至,卻和暖如春痪欲,著一層夾襖步出監(jiān)牢的瞬間悦穿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工业踢, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留栗柒,地道東北人。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓知举,卻偏偏與公主長得像瞬沦,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子雇锡,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,573評論 2 359

推薦閱讀更多精彩內(nèi)容