Dkron分佈式定時任務系統分析(v2)

Dkron分佈式定時任務系統分析(v2)

Dkron github address

Dkron是一個分佈式,啓動迅速,容錯的定時任務系統,支持cron表達式。

Dkron特點:

  • 易用:易操作和漂亮的UI
  • 可靠:支持容錯
  • 高可擴展性:能夠處理大量的計劃作業和數千個節點

Dkron是用Go編寫的,它利用Raft協議和Serf的強大功能提供容錯性、可靠性和可擴展性,同時保持簡單易安裝。

Dkron-v2整體架構圖:
Dkron-v2整體架構
Dkron每個節點都是由一個web服務、grpc服務、raft服務、serf服務、badger數據庫構成。

web負責轉發來自前端job的元信息給grpc服務,一般的grpc操作都在leader節點進行。job的調度和修改保存都要通過leader,只有獲取job的信息不需要到leader節點,因爲每個節點的數據是一致的。有人會說這樣的話那是不是leader的壓力會不會太大,不必擔心,由於對於job的增刪改其實請求是很小的,而且job的執行也不是在leader,所以大可不必擔心。

Serf用於服務發現和節點故障提醒,提供節點成員信息,執行job任務。

嵌入式數據庫badger負責在每個節點存儲數據,通過Raft協議保證數據一致性。

Dkron的每個節點在運行的服務上都是相同的,但存在一個仲裁節點leader,job的增刪改都需要直接通過它來進行,但查詢job不需要通過leader在本機即可查詢。job更新後leader的調度器job schedule會重啓一次,調度器只會在leader節點運行。

當集羣中當前的leader失去leader地位時,它會關閉job schedule,而獲得leader地位的節點會啓動job schedule,這就保證了任務只會執行一次。

當leader的調度器檢查到將有任務需要執行時,它會發一個serf的消息,serf會隨機發送給任意一個節點去執行,當執行完成後會通知leader的執行結果,並寫進數據庫。

job執行流程圖:
job執行流程圖
在leader節點處,當job schedule的任務觸發時,leader發送一個serf消息(1-serf msg),serf會隨機選擇一個節點發送。當收到serf發送的執行job的消息後,節點會啓動一個協程去運行job(2-run job),接着返回給serf收到運行消息並正在執行任務的響應(3-serf msg resp)。

當Run job結束後會根據hash一致性隨機選擇一個節點發送grpc消息,將執行結果發送出去(4-Job Done),這裏爲什麼不直接發給leader呢?是因爲有可能當時存在leader未選舉出來。因此隨機選擇一個節點,再將請求轉發到leader,保證執行結果一定能發到leader(5-Job Done)。

最後leader會通過raft把數據複製到各個節點,最終一個任務就執行結束了。

在工作中遇到遷移任務數據的問題,由於不能導出所有job的json,也不能根據文件導入job所以提了個使用文件導入job的pr(https://github.com/distribworks/dkron/pull/654),作者也同意merge到master上。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章