Trino418版本動態載入catalog不需要重啟叢集修改思路及實現2

liuzx8888發表於2024-04-18

原來沒事的時候改了一個這樣的功能,當時也沒有仔細研究,後來也沒繼續弄。詳細可以參考 https://www.cnblogs.com/liuzx8888/p/17635913.html

當時有1個問題:新增資料來源需要每一個節點都去調取API註冊,這樣非常麻煩,最近閒下來又研究了一下,在原先的基礎上做了一些改造。

具體流程:

具體的流程:

1.新增註冊、刪除 Catalog的需要的一些Api介面對外提供服務

2.透過 Coordinator 節點 API 註冊新的資料來源同時將相關的資料來源資訊儲存到資料庫,狀態Status=2

3.新增 WorkerCatalogSyncTask,Worker節點同步功能,參考了Trino 裡面的 CatalogPruneTask功能,透過Coordinator定時任務捕獲到新增資料來源[Status=2]通知到所有的Worker節點進行註冊

4.所有的Worker註冊完畢後,修改資料來源狀態為0

5.讓Worker節點啟動的時候也能跟Coordinator 一樣載入是有資料來源 【DynamicCatalogManageMoudle 模式、檔案模式本來就可以載入的】

這樣的改造好處就是所有的Catalog儲存在資料庫不容易丟失,無論哪個節點失敗了或者新增節點都能從資料庫獲取到最近的Catalog目錄,保證每個節點的Catalog都是最新的。

具體的一些程式碼實現截圖給大家參考下,前前後後除錯了很多,寫的有點亂。

這些具體的可以參照前面的文章,Github 2個推送已經實現了基本的功能,我這裡截圖我自己實現的一部分:

1.讓Worker 跟 Coordinator 一樣有載入catalog目錄的功能,新增WorkerDynamicCatalogManager 這個參考 CoordinatorDynamicCatalogManager 實現,基本一樣,

把Worker跟Coordinator 一樣的服務啟動的時候注入,讓Worker跟Coordinator有一樣的功能,不然Worker初始化不會自動載入資料來源。

2.WorkerCatalogSyncTask,參考CatalogPruneTask ,只要API的部分改造完成,這個地方就很好弄了,仿照一個就可以自動固定時間去訪問各個Worker節點的API資訊進行註冊,這樣就只需要跟Coordinator 通訊就可以了

實踐效果:

定時獲取是否有新增的資料來源

API註冊

Coordinator:資料庫會捕獲到新增了1個Catalog,Worker註冊完,數量從1變成0

Worker:新增了相同的Catalog

相關文章