Dkron說明
Dkron是一個分布式,啟動迅速,容錯的定時任務系統,支持cron表達式。
Dkron特點:
- 易用:易操作和漂亮的UI
- 可靠:支持容錯
- 高可擴展性:能夠處理大量的計划作業和數千個節點
Dkron是用Go編寫的,它利用Raft協議和Serf的強大功能提供容錯性、可靠性和可擴展性,同時保持簡單易安裝。
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執行流程圖:
在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把數據復制到各個節點,最終一個任務就執行結束了。
分布式調度任務管理——Dkron(1)運行機制
分布式調度任務管理——Dkron(2)運行配置
分布式調度任務管理——Dkron(3)代碼結構分析及部署運行
參考鏈接:
https://www.pianshen.com/article/7240967509/