天天看點

es 查詢總數_基于改進的粒子群算法優化 ES 叢集的排程

編輯導語

本文使用改進的粒子群算法建立ES叢集的排程模型,通過對叢集資料節點的定期動态調整,不僅減少了資料節點的投入,降低了 CPU 和記憶體的使用,還改善了整個叢集的查詢和寫入性能。

概述

随着業務增長,ES 叢集規模越來越大,各叢集的使用場景不同,機器節點配置不同,業務場景使用 ES 的方式不同, 易出現叢集單點 CPU 飙高,記憶體不足、GC 時間過長以及磁盤使用率不足等問題,進而影響叢集的整體性能。

目前 ES 叢集的排程大多是通過人工觀測 Zabbix 以及 Grafana 手動對叢集的節點進行排程,由于依賴人工調節,并不能将 ES 叢集機器的利用效率發揮到最大。為了提高叢集的利用效率,降低運維成本,本文建立了一種基于粒子群算法的 ES 叢集排程模型。

由于不同時間段叢集的通路和寫入流量不同,業務的使用方式也在不斷調整,傳統的全局最優政策無法運用到這種變化的場景,是以建立了可滾動的優化排程模型。該模型會在每一個時間段開始前,根據目前環境(記憶體、CPU、磁盤)調整這一時間段的排程安排,若環境沒有發生改變,則進入下一時間段。但這樣的排程方案随着計劃周期的不斷細化,計算量也随之變大,甚至可能出現“維數災難”等問題。

針對上述問題,本文采用混合粒子群算法來提高搜尋效率,利用 Python 語言設計并驗證了混合粒子群算法用于 ES 叢集排程優化的可行性和有效性。

ES 叢集日負荷排程模組化

# CPU、記憶體以及磁盤使用率打分模型

下圖是某個線上 ES 叢集 CPU 使用率、堆記憶體使用以及索引存儲一天的使用情況。通常情況下,ES 叢集的 CPU 使用率、堆記憶體使用情況會随着一天的不同時段而變化,索引的存儲相對于叢集磁盤的總體容量來說變化及影響不是很大。

es 查詢總數_基于改進的粒子群算法優化 ES 叢集的排程

ES叢集24H負荷趨勢圖

對于一個線上運作的 ES 叢集而言,CPU 使用率高可能會緻使慢查詢增多導緻業務查詢逾時;記憶體使用率過高則會導緻 GC 暫停、觸發 old GC;磁盤使用率高于水位線時會将寫請求 reroute 到其他節點,同時也可能會觸發 ES 的熔斷機制導緻該叢集上的索引不可寫入。是以,CPU 使用率、記憶體使用率以及磁盤使用率是衡量 ES 叢集整體性能的重要名額。

本文的做法是将備選機器放入資源池,對資源池裡的機器進行打分,然後通過粒子群優化算法(PSO)選擇合适的機器作為 ES 叢集的 data 節點。

es 查詢總數_基于改進的粒子群算法優化 ES 叢集的排程

# 資源均衡度打分模型

設想一個場景,當面臨節假日流量猛增等情況,ES 叢集需要進行擴容,這時可能遇到備選機器 CPU 使用率高但記憶體使用率低或其記憶體使用率高但 CPU 使用率低等資源不均衡的情況。針對該問題,使用以下公式對備選機器的 CPU 資源以及記憶體資源的均衡情況進行打分:

es 查詢總數_基于改進的粒子群算法優化 ES 叢集的排程

結合以上(4)和(5)兩個公式,本文使用公式(6)作為粒子群算法的适應值函數:

es 查詢總數_基于改進的粒子群算法優化 ES 叢集的排程

粒子群算法

# 算法簡介

通常 ES 叢集的部署是需要在備選機器中選擇合适的機器進行節點部署。在一堆機器中尋找叢集部署的最佳方案使之既能滿足業務需求又不浪費機器資源,這在數學中可以簡化為一個最優化問題,即在特定的解空間中搜尋最優解。

粒子群算法是受鳥群的社會行為啟發建立的一種依賴于随機過程的啟發式搜尋算法。PSO 通過粒子之間的互相協作,朝着局部最優和全局最優調整。該算法全局搜尋能力強,可以融合其他算法的長處設計出适合于實際問題的改進算法。

# 速度位置更新

基本粒子群算法中,解空間的每個粒子代表一個潛在的解,數學描述為:在一個 D 維解空間中,由 m 個粒子組成的種群 X=(X1…Xi…Xm)。其中第 i 個粒子位置為 Xi = (xi1,xi2...xiD)T,其速度為 Vi=(vi1,vi2...viD)T,粒子的個體值為 pi=(pi1,pi2...piD)T,其種群的全局值為 pg=(pg1,pg2...pgD)T。

首先求每個粒子的個體最優解,利用式子(7),(8)來更新每個粒子目前的速度和位置,式中:iter 代表疊代次數,r1,r2 為 [0,1] 之間的随機數,c1,c2 為加速常數, w為慣性權值。

es 查詢總數_基于改進的粒子群算法優化 ES 叢集的排程

# 計算步驟

  1. 初始化種群規模和疊代次數;
  2. 粒子群的初始化:在解空間内産生随機粒子,初始化粒子的位置以及速度;
  3. 評價每個粒子的個體适應值,淘汰适應值差的粒子;
  4. 疊代進化:在每一次疊代更新中, 粒子根據兩個“極值”: pbest 和 gbest 來更新本身: pbest 是該粒子目前找到的最佳解,gbest是整個種群目前找到的最好解, 稱為全局極值點;
  5. 疊代終止條件:如果目前疊代次數達到開始設定的最大疊代次數或達到最小誤差要求,則疊代終止,輸出結果;否則繼續疊代。

對粒子群算法的改進

# 軟限制政策

在 ES 叢集基于 PSO 算法排程過程中,決策變量會受到目前叢集規模的限制:叢集節點(data)個數受目前索引分片數以及分片存儲政策(total_shards_per_node)的限制。在此限制下,隻要決策變量稍微超出限制範圍一點,粒子的最優解就無法到達最優位置。為了得到滿足限制條件下可行的最優解,需要對适應值函數進行軟化,然後基于軟限制政策将限制函數加入适應值函數中。

es 查詢總數_基于改進的粒子群算法優化 ES 叢集的排程

式中:Nbefore 為未調整前的初始 data 節點數量,Nafter 為推薦的備選 data 節點的總數。如果推薦的備選機器數和初始叢集規模不等,則可以進行一定的妥協,這個妥協通過懲罰因子 λ 進行調節,其核心思想為:節點數量變化的增加,權重系數不斷增大,并且當這個誤差達到最大上限時,懲罰為無窮大。

# 懲罰函數

擷取備選機器的端口資訊,假如ES叢集運作的端口在備選機器中已經被占用則需要進行懲罰。

es 查詢總數_基于改進的粒子群算法優化 ES 叢集的排程

式中:θ 為懲罰因子。綜上,改進後的粒子群适應值函數為:

es 查詢總數_基于改進的粒子群算法優化 ES 叢集的排程

# 使用環形領域拓撲搜尋全局最優解

為了尋找全局最優解(gbest)避免過早收斂陷入局部最優,本文使用環形鄰域拓撲的搜尋方式,即所有粒子首尾相連構成環形,每個粒子與 k 個鄰近粒子相連。假設有 N 個粒子,當 k=1 時,每個粒子隻能選擇左右兩邊的一個粒子進行比較;當 k=2 時,每個粒子可以選擇左右兩邊的兩個相鄰粒子進行比較;而當 k=N-1 時,此時整體拓撲結構為全互聯結構。在快速查找鄰近點過程中,使用 kd 樹可以快速查找任何點的最近鄰居,本文使用 scipy.spatial.cKDTree 來計算 k 鄰近粒子。

# 疊代滾動優化排程政策

線上叢集需要每天持續穩定地提供服務,而每台機器的CPU、記憶體和磁盤情況都會随着不同時段發生變化,是以需要建立疊代滾動優化機制。即每個時間段根據目前資源池每台機器的情況來調整這一時間段的叢集節點安排。本文通過 Airflow 進行定時排程,将每小時作為一個計量點,每天一共 24 個計量點。

仿真實驗

# 實驗環境

  • ES 6.2.4 叢集(三主九從,一台備機)
  • 粒子群算法的種群規模 30,疊代次數 1000
  • 100G 的壓測資料、Rally 極限壓測腳本
  • 根據 baseline 的壓測時間大約兩小時,在 airflow 中配置半小時排程政策進行模拟
叢集角色分布:
  • 主節點:ES-216,ES-217,ES-218
  • 資料節點 :ES-100,ES-101, ES-102,ES-103,ES-104,ES-105,ES-106,ES-107,ES-108
  • 冷備:ES-111

# 實驗步驟

  1. 運作 Rally 腳本對叢集進行壓測,生成 baseline 的壓測結果報告;
  2. 再次運作 Rally 腳本,每隔半小時進行一次叢集排程;
  3. 每次通過 python 的 paramiko 子產品擷取冷備機器的 feature,通過 _nodes/stats 擷取叢集 data 節點機器的 feature;
  4. 資料清洗,整理成 dataframe 代入算法模型疊代計算;
  5. 對排程結果中位置為0的機器 ip 逐個執行 exclude 操作,通過 _cat/recovery 檢視分片情況;
  6. 等分片結束後,卸掉 exclude 掉的機器;
  7. 對排程結果中位置為1且不在叢集 data 節點中的機器 ip,通過 paramiko ssh 到目标機器啟動該節點;
  8. 生成 contender 壓測結果報告,和 baseline 的壓測結果比較分析。

實驗結果

  • baseline 壓測:壓測過程中的CPU使用率
es 查詢總數_基于改進的粒子群算法優化 ES 叢集的排程
  • baseline 壓測:同一時間,堆記憶體使用的情況
es 查詢總數_基于改進的粒子群算法優化 ES 叢集的排程
  • contender 壓測:最後一次算法排程結果
es 查詢總數_基于改進的粒子群算法優化 ES 叢集的排程
  • contender 壓測:适應值函數收斂圖
es 查詢總數_基于改進的粒子群算法優化 ES 叢集的排程
  • contender 壓測:壓測過程中的CPU使用率
es 查詢總數_基于改進的粒子群算法優化 ES 叢集的排程
  • contender 壓測:同一時間,堆記憶體使用的情況
es 查詢總數_基于改進的粒子群算法優化 ES 叢集的排程

實驗結果分析

從結果對比來看,基于改進後的粒子群算法的ES叢集排程後,機器數減少 22%,CPU 和記憶體使用率都有所降低,索引寫入、phrase 查詢、聚合查詢性能有所提高,scroll 拉取時間有所降低,但 Young GC 時間有所增加,term 查詢時間增加。

實驗總結與展望

在實驗過程中,索引分片耗時大約每次在十分鐘左右,後續可以考慮增加分片數把索引分片切得更小一點以提高算法整體效果。因為是對線上環境進行測試,是以未使用循環壓測腳本把壓測時間拉長到一天甚至更久。

另外,本文隻選取 CPU、記憶體、磁盤三個次元作為給機器打分的依據。實際上,io、網絡甚至是機器出廠時的名額資料都可以作為 feature 進行計算。

本文主要基于現有的實驗資源和環境,驗證了改進後的粒子群算法在叢集排程中的可行性和有效性。後續當 ES、HBase、HDFS 等存儲元件在 k8s 運作後,希望能對機器的降本增效以及存儲元件的熱點等問題做進一步的探索。

正文完

es 查詢總數_基于改進的粒子群算法優化 ES 叢集的排程

作者:張劉毅

https://me.csdn.net/dtzly

本文編輯:筷子

嗨,互動起來吧!

喜歡這篇文章麼?

歡迎留下你想說的,留言 100% 精選哦!

Elastic 社群公衆号長期征稿,如果您有 Elastic  技術的相關文章,也歡迎投稿至本公衆号,一起進步! 投稿請添加微信:medcl123

招聘資訊

Job board

社群招聘欄目是一個新的嘗試,幫助社群的小夥伴找到心儀的職位,也幫助企業找到所需的人才,為伯樂和千裡馬牽線搭橋。有招聘需求的企業和正在求職的社群小夥伴,可以聯系微信 medcl123 送出招聘需求和釋出個人履歷資訊。

es 查詢總數_基于改進的粒子群算法優化 ES 叢集的排程

Elastic中文社群公衆号 (elastic-cn)

為您彙集 Elastic 社群的最新動态、精選幹貨文章、精華讨論、文檔資料、翻譯與版本釋出等。

es 查詢總數_基于改進的粒子群算法優化 ES 叢集的排程

喜歡本篇内容就請給我們點個[在看]吧

es 查詢總數_基于改進的粒子群算法優化 ES 叢集的排程

繼續閱讀