【翻譯自https://druid.apache.org/docs/latest/operations/basic-cluster-tuning.html】
本文檔提供Druid部署調(diào)優(yōu)基礎(chǔ)指南,涉及相關(guān)屬性配置以及集群架構(gòu)設(shè)想用含。
請注意矮慕,本文檔提供一般性的指導(dǎo)原則和經(jīng)驗法則:對于集群調(diào)優(yōu)來說,這些法則并不是絕對的耕餐,通用的凡傅,而且并沒有完全覆蓋到Druid屬性調(diào)優(yōu)的所有部分。
如果對于特定的case有疑問或者本文未盡事宜肠缔,請詳詢https://druid.apache.org/community/夏跷。
Historical(歷史節(jié)點)
Heap sizing(堆大小)
Historical節(jié)點中堆使用主要集中在:
? ? ?來自于segments中未合并的查詢結(jié)果
? ? ?用于lookups的存儲地圖
通常情況下明未,調(diào)整Historical堆大小的經(jīng)驗規(guī)則:(0.5GB * CPU核數(shù))槽华,上限約為24GB。這個公式并不是一個硬性標準趟妥,僅供參考猫态。
如果堆太大,則可能會導(dǎo)致GC時間過長披摄,因此要設(shè)置一個24G左右的上限亲雪。
如果在Historical節(jié)點上啟動了緩存,則緩存存儲在堆中疚膊,大小由druid.cache.sizeInBytes決定义辕。
Historical節(jié)點上的堆耗盡,說明配置錯誤或者所用的方式導(dǎo)致集群過載
Lookups
目前處于試驗階段寓盗,暫不說明
Processing Threads and Buffers(線程和緩沖)
關(guān)于 Historicals:
druid.processing.numThreads(用于并行處理segment的線程數(shù)):通常設(shè)置為(number of cores -1)灌砖,值設(shè)置的小不能充分利用cpu,超過核心數(shù)會導(dǎo)致不必要的cpu爭用
druid.processing.buffer.sizeBytes:可設(shè)置500M
druid.processing.numMergeBuffers(用于合并查詢結(jié)果的直接內(nèi)存緩沖區(qū)數(shù)):numMergeBuffers:numThreads = 1:4傀蚌,通常是一個合理的選擇
Direct Memory Sizing(直接內(nèi)存大谢浴)
當歷史節(jié)點處理查詢請求時,它需要讀取segments善炫,此時撩幽,需要一些直接內(nèi)存空間。
預(yù)估直接內(nèi)存使用量的公式:
(druid.processing.numThreads + druid.processing.numMergeBuffers + 1) * druid.processing.buffer.sizeBytes
Connection pool sizing(連接池大邢俊)
對于歷史節(jié)點摸航,druid.server.http.numThreads 應(yīng)設(shè)置為略高于druid.broker.http.numConnections 數(shù)量和(集群中所有broker節(jié)點相加)
可以從每個歷史節(jié)點接收50個查詢和10個非查詢開始對集群連接池進行調(diào)優(yōu)
Segment Cache Size(緩存大小)
druid.server.maxSize:Coordinator節(jié)點能夠分配給一個Historical節(jié)點 segment 總的數(shù)據(jù)大小
druid.segmentCache.locations:segment 存儲所在歷史節(jié)點的位置舅桩,這些位置所在磁盤的大小應(yīng)該大于等于druid.server.maxSize
歷史節(jié)點利用可用的系統(tǒng)內(nèi)存(沒有被jvm以及堆/直接內(nèi)存緩沖區(qū)使用的內(nèi)存)將segment文件映射到內(nèi)存中酱虎,當查詢到來時,不在內(nèi)存中的segment將會被從磁盤分頁(從磁盤移動到內(nèi)存)
因此擂涛,druid.server.maxSize的設(shè)置應(yīng)該使歷史節(jié)點不分配過量的segment读串。隨著 (free system memory/druid.server.maxSize)值的增加聊记,內(nèi)存中可以保留更多的segment,提供更好的查詢性能恢暖。
Number of Historicals(歷史節(jié)點的數(shù)量)
所需歷史節(jié)點的數(shù)量依賴于數(shù)據(jù)量的大小排监。為了獲取良好的性能,將需要足夠的歷史節(jié)點杰捂,以致于每個歷史節(jié)點有一個好的比率(free system memory/ druid.server.maxSize),如上述 segment cache size部分描述的那樣舆床。
在對使用場景有足夠的容錯情況下,擁有較少的大型服務(wù)器通常比擁有較多的小型服務(wù)器要好嫁佳。
SSD storage(SSD存儲)
我們建議歷史節(jié)點采用SSD存儲挨队,因為該節(jié)點處理存儲在磁盤上的segment數(shù)據(jù)。
Total memory usage(總的內(nèi)存使用)
根據(jù)如下指導(dǎo)來預(yù)估歷史節(jié)點總的內(nèi)存使用量:
Heap(堆):(0.5GB *? number of CPU cores) + (2 * total size of lookup maps) + druid.cache.sizeInBytes
Direct Memory(直接內(nèi)存):(druid.processing.numThreads + druid.processing.numMergeBuffers +1) * druid.processing.buffer.sizeBytes
歷史節(jié)點將會使用任意可用的系統(tǒng)內(nèi)存(jvm蒿往、堆/直接內(nèi)存緩沖區(qū)以及系統(tǒng)上其他進程未使用到的內(nèi)存)來對磁盤上的segments進行內(nèi)存映射盛垦。為了獲取更好的查詢性能,需要確保一個合適的比率(free system memory/ druid.server.maxSize),這樣就可以在內(nèi)存中保留更大比例的segments瓤漏。
續(xù)接 Druid調(diào)優(yōu)指南(二)