成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

聊一聊Pulsar負載均衡原理及優化

開發 前端
當一個集群可以水平擴展后負載均衡就顯得非常重要,根本目的是為了讓每個提供服務的節點都能均勻的處理請求,不然擴容就沒有意義了。

前言

前段時間我們在升級 Pulsar 版本的時候發現升級后最后一個節點始終沒有流量。

雖然對業務使用沒有任何影響,但負載不均會導致資源的浪費。

和同事溝通后得知之前的升級也會出現這樣的情況,最終還是人工調用 Pulsar 的 admin API 完成的負載均衡。

這個問題我嘗試在 Google 和 Pulsar 社區都沒有找到類似的,不知道是大家都沒碰到還是很少升級集群。

我之前所在的公司就是一個版本走到黑

Pulsar 負載均衡原理

當一個集群可以水平擴展后負載均衡就顯得非常重要,根本目的是為了讓每個提供服務的節點都能均勻的處理請求,不然擴容就沒有意義了。

在分析這個問題的原因之前我們先看看 Pulsar 負載均衡的實現方案。

# Enable load balancer
loadBalancerEnabled=true

我們可以通過這個 broker 的這個配置來控制負載均衡器的開關,默認是打開。

但具體使用哪個實現類來作為負載均衡器也可以在配置文件中指定:

# Name of load manager to use
loadManagerClassName=org.apache.pulsar.broker.loadbalance.impl.ModularLoadManagerImpl

默認使用的是 ModularLoadManagerImpl

static LoadManager create(final PulsarService pulsar) {
try {
final ServiceConfiguration conf = pulsar.getConfiguration();
// Assume there is a constructor with one argument of PulsarService.
final Object loadManagerInstance = Reflections.createInstance(conf.getLoadManagerClassName(),
Thread.currentThread().getContextClassLoader());
if (loadManagerInstance instanceof LoadManager) {
final LoadManager casted = (LoadManager) loadManagerInstance;
casted.initialize(pulsar);
return casted;
} else if (loadManagerInstance instanceof ModularLoadManager) {
final LoadManager casted = new ModularLoadManagerWrapper((ModularLoadManager) loadManagerInstance);
casted.initialize(pulsar);
return casted;
}
} catch (Exception e) {
LOG.warn("Error when trying to create load manager: ", e);
}
// If we failed to create a load manager, default to SimpleLoadManagerImpl.
return new SimpleLoadManagerImpl(pulsar);
}

當 broker 啟動時會從配置文件中讀取配置進行加載,如果加載失敗會使用 SimpleLoadManagerImpl 作為兜底策略。

當 broker 是一個集群時,只有 leader 節點的 broker 才會執行負載均衡器的邏輯。

Leader 選舉是通過 Zookeeper 實現的。

默然情況下成為 Leader 節點的 broker 會每分鐘讀取各個 broker 的數據來判斷是否有節點負載過高需要做重平衡。

而是否重平衡的判斷依據是由 org.apache.pulsar.broker.loadbalance.LoadSheddingStrategy 接口提供的,它其實只有一個函數:

public interface LoadSheddingStrategy {

/**
* Recommend that all of the returned bundles be unloaded.
* @return A map from all selected bundles to the brokers on which they reside.
*/
Multimap<String, String> findBundlesForUnloading(LoadData loadData, ServiceConfiguration conf);
}

根據所有 broker 的負載信息計算出一個需要被 unload 的 broker 以及 bundle。

這里解釋下 unload 和 bundle 的概念:

  • bundle 是一批 topic 的抽象,將 bundle 和 broker 進行關聯后客戶端才能知道應當連接哪個 broker;而不是直接將 topic 與 broker 綁定,這樣才能實現海量 topic 的管理。
  • unload 則是將已經與 broker 綁定的 bundle 手動解綁,從而觸發負載均衡器選擇一臺合適的 broker 重新進行綁定;通常是整個集群負載不均的時候觸發。

ThresholdShedder 原理

LoadSheddingStrategy 接口目前有三個實現,這里以官方默認的 ThresholdShedder 為例:

它的實現算法是根據帶寬、內存、流量等各個指標的權重算出每個節點的負載值,之后為整個集群計算出一個平均負載值。

# 閾值
loadBalancerBrokerThresholdShedderPercentage=10

當集群中有某個節點的負載值超過平均負載值達到一定程度(可配置的閾值)時,就會觸發 unload,以上圖為例就會將最左邊節點中紅色部分的 bundle 卸載掉,然后再重新計算一個合適的 broker 進行綁定。

閾值存在的目的是為了避免頻繁的 unload,從而影響客戶端的連接。

問題原因

當某些 topic 的流量突然爆增的時候這種負載策略確實可以處理的很好,但在我們集群升級的情況就不一定了。

假設我這里有三個節點:

  • broker0
  • broker1
  • broker2

集群升級時會從 broker2->0 進行鏡像替換重啟,假設在升級前每個 broker 的負載值都是 10。

  • 重啟 broker2 時,它所綁定的 bundle 被 broker0/1 接管。
  • 升級 broker1 時,它所綁定的 bundle 又被 broker0/2 接管。
  • 最后升級 broker0, 它所綁定的 bundle 會被broker1/2 接管。

只要在這之后沒有發生流量激增到觸發負載的閾值,那么當前的負載情況就會一直保留下去,也就是 broker0 會一直沒有流量。

經過我反復測試,現象也確實如此。

./pulsar-perf monitor-brokers --connect-string pulsar-test-zookeeper:2181

通過這個工具也可以查看各個節點的負載情況

優化方案

這種場景是當前 ThresholdShedder 所沒有考慮到的,于是我在我們所使用的版本 2.10.3 的基礎上做了簡單的優化:

  • 當原有邏輯走完之后也沒有獲取需要需要卸載的 bundle,同時也存在一個負載極低的 broker 時(emptyBundle),再觸發一次 bundle 查詢。
  • 按照 broker 所綁定的數量排序,選擇一個數量最多的 broker 的 第一個 bundle 進行卸載。

修改后打包發布,再走一遍升級流程后整個集群負載就是均衡的了。

但其實這個方案并不嚴謹,第二步選擇的重點是篩選出負載最高的集群中負載最高的 bundle;這里只是簡單的根據數量來判斷,并不夠準確。

正當我準備持續優化時,鬼使神差的我想看看 master 上有人修復這個問題沒,結果一看還真有人修復了;只是還沒正式發版。

??https://github.com/apache/pulsar/pull/17456??

整體思路是類似的,只是篩選負載需要卸載 bundle 時是根據 bundle 自身的流量來的,這樣會更加精準。

總結

不過看社區的進度等這個優化最終能用還不知道得多久,于是我們就自己參考這個思路在管理臺做了類似的功能,當升級后出現負載不均衡時人工觸發一個邏輯:

  • 系統根據各個節點的負載情況計算出一個負載最高的節點和 bundle 在頁面上展示。
  • 人工二次確認是否要卸載,確認無誤后進行卸載。

本質上只是將上述優化的自動負載流程改為人工處理了,經過測試效果是一樣的。

Pulsar 整個項目其實非常龐大,有著幾十上百個模塊,哪怕每次我只改動一行代碼準備發布測試時都得經過漫長的編譯+ Docker鏡像打包+上傳私服這些流程,通常需要1~2個小時;但總的來說收獲還是很大的,最近也在提一些 issue 和 PR,希望后面能更深入的參與進社區。

責任編輯:姜華 來源: 今日頭條
相關推薦

2022-08-22 09:20:05

Kubernetes工作負載管理

2020-08-24 07:12:17

前端CRP性能優化

2024-09-12 10:06:21

2021-11-24 22:47:07

Docker開發容器

2020-01-17 09:07:14

分布式系統網絡

2022-11-09 18:38:08

視頻清晰度

2018-06-07 13:17:12

契約測試單元測試API測試

2023-09-22 17:36:37

2021-01-28 22:31:33

分組密碼算法

2020-05-22 08:16:07

PONGPONXG-PON

2023-06-20 06:44:14

Node.jsCPU 負載

2020-08-12 08:34:16

開發安全We

2022-11-26 00:00:06

裝飾者模式Component

2022-10-08 11:33:56

邊緣計算云計算

2018-01-10 14:13:04

測試矩陣API測試

2019-12-17 10:06:18

CDMA高通4G

2022-03-08 16:10:38

Redis事務機制

2020-09-08 06:54:29

Java Gradle語言

2022-03-29 09:56:21

游戲版本運營

2021-01-01 09:01:05

前端組件化設計
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲综合久久网 | 91精品国产乱码久久久久久久久 | 欧美黄色一级毛片 | 91大片 | 亚洲第一福利视频 | 婷婷色国产偷v国产偷v小说 | 成人在线视频免费看 | 国产精品我不卡 | 成人精品毛片国产亚洲av十九禁 | 狠狠操天天干 | 狠狠干狠狠插 | 久久久久久久久久久久91 | 欧美一级毛片免费观看 | 中文字幕视频免费 | 免费国产精品久久久久久 | 久久精品国产99国产 | 成人在线h | 在线免费小视频 | 国产成人综合亚洲欧美94在线 | 久久av网| 国产视频一区在线 | 在线中文字幕亚洲 | 91美女在线| 狠狠操狠狠色 | 亚洲成人av在线播放 | 国产精品视频一二三区 | 亚洲视频在线免费 | 久久伊 | 国产午夜精品久久久久免费视高清 | 日韩精品二区 | 午夜视频在线观看网址 | 黄色大片毛片 | 老司机精品福利视频 | 欧美一区二区在线观看视频 | 久久精品亚洲国产奇米99 | 国产探花在线观看视频 | 久久久99国产精品免费 | 97成人在线 | 久草视频在线看 | 精品无码久久久久久国产 | 国产精品国产a级 |