Elastic-Job實現原理
原文地址:http://dangdangdotcom.github.io/elastic-job/post/1.x/theory/
實現原理
彈性分散式實現
-
第一臺伺服器上線觸發主伺服器選舉。主伺服器一旦下線,則重新觸發選舉,選舉過程中阻塞,只有主伺服器選舉完成,才會執行其他任務。
-
某作業伺服器上線時會自動將伺服器資訊註冊到註冊中心,下線時會自動更新伺服器狀態。
-
主節點選舉,伺服器上下線,分片總數變更均更新重新分片標記。
-
定時任務觸發時,如需重新分片,則通過主伺服器分片,分片過程中阻塞,分片結束後才可執行任務。如分片過程中主伺服器下線,則先選舉主伺服器,再分片。
-
通過上一項說明可知,為了維持作業執行時的穩定性,執行過程中只會標記分片狀態,不會重新分片。分片僅可能發生在下次任務觸發前。
-
每次分片都會按伺服器
IP
排序,保證分片結果不會產生較大波動。 -
實現失效轉移功能,在某臺伺服器執行完畢後主動抓取未分配的分片,並且在某臺伺服器下線後主動尋找可用的伺服器執行任務。
註冊中心資料結構
註冊中心在定義的名稱空間下,建立作業名稱節點,用於區分不同作業,所以作業一旦建立則不能修改作業名稱,如果修改名稱將視為新的作業。作業名稱節點下又包含4個數據子節點,分別是config
, servers
, execution
和leader
。
概覽
config節點
作業全域性配置資訊
子節點名 | 臨時節點 | 描述 |
---|---|---|
jobClass | 否 | 作業實現類名稱 |
shardingTotalCount | 否 | 作業分片總數 |
cron | 否 |
作業啟動時間的cron 表示式 |
shardingItemParameters | 否 | 分片序列號和個性化引數對照表 |
jobParameter | 否 | 作業自定義引數 |
monitorExecution | 否 | 監控作業執行時狀態 |
processCountIntervalSeconds | 否 | 統計作業處理資料數量的間隔時間 |
concurrentDataProcessThreadCount | 否 | 同時處理資料的併發執行緒數 |
fetchDataCount | 否 | 每次抓取的資料量 |
streaming-process | 否 |
是否流式處理資料 如果流式處理資料, 則 fetchData 如果非流式處理資料, 則處理資料完成後作業結束 |
maxTimeDiffSeconds | 否 | 允許的本機與註冊中心的時間誤差秒數 |
failover | 否 | 是否開啟失效轉移 |
misfire | 否 | 是否開啟錯過任務重新執行 |
description | 否 | 作業描述資訊 |
scriptCommandLine | 否 | 指令碼型作業作業執行命令列 |
servers節點
作業伺服器資訊,子節點是作業伺服器的IP
地址。IP
地址節點的子節點儲存詳細資訊。同一臺作業伺服器只能執行一個相同的作業例項,因為作業執行時是按照IP
註冊和管理的。
子節點名 | 臨時節點 | 描述 |
---|---|---|
hostName | 否 | 作業伺服器名稱 |
status |
是 |
作業伺服器狀態,分為READY和RUNNING 用於表示伺服器在等待執行作業還是正在執行作業 如果status節點不存在則表示作業伺服器未上線 |
disabled | 否 |
作業伺服器狀態是否禁用 可用於部署作業時,先禁止啟動,部署結束後統一啟動 |
sharding | 否 |
該作業伺服器分到的作業分片項 多個分片項用逗號分隔 如: 0, 1, 2 代表該伺服器執行第1,
2, 3 片分片 |
processSuccessCount | 否 |
統計一段時間內處理資料成功的數量 統計間隔可通過 config\processCountIntervalSeconds 配置 |
processFailureCount | 否 |
統計一段時間內處理資料失敗的數量 統計間隔可通過 config\processCountIntervalSeconds 配置 |
paused | 否 | 暫停作業的標記,暫停的作業不會終止排程器執行。作業程式再次啟動時不會清理此標記 |
shutdown | 否 | 關閉作業的標記,關閉的作業將停止排程,並可通過控制檯刪除。只有作業程式再次啟動時才會清理此標記 |
trigger | 否 | 立刻觸發作業的標記,作業在不與上次執行中作業衝突的情況下將立刻啟動,並在啟動後自動清理此標記 |
execution節點
執行時資訊,子節點是分片項序號,從零開始,至分片總數減一。分片項序號的子節點儲存詳細資訊。可通過配置config\monitorExecution
為false
關閉記錄作業執行時資訊。
子節點名 | 臨時節點 | 描述 |
---|---|---|
running |
是 |
分片項正在執行的狀態 如果沒有此節點,並且沒有 completed 節點,表示該分片未執行 |
completed | 否 |
分片項執行完成的狀態 下次作業開始執行時會清理 |
failover |
是 |
如果該分片項被失效轉移分配給其他作業伺服器,則此節點值記錄執行此分片的作業伺服器IP |
lastBeginTime | 否 | 該分片項最近一次的開始執行時間 |
nextFireTime | 否 | 該分片項下次作業觸發時間 |
lastCompleteTime | 否 | 該分片項最近一次的結束執行時間 |
misfire | 否 | 是否開啟錯過任務重新執行 |
leader節點
作業伺服器主節點資訊,分為election
,sharding
和execution
三個子節點。分別用於主節點選舉,分片和作業執行時處理。
leader節點是內部使用的節點,如果對作業框架原理不感興趣,可不關注此節點。
子節點名 | 臨時節點 | 描述 |
---|---|---|
election\host |
是 |
主節點伺服器IP 地址一旦該節點被刪除將會觸發重新選舉 重新選舉的過程中一切主節點相關的操作都將阻塞 |
election\latch | 否 |
主節點選舉的分散式鎖 為 curator 的分散式鎖使用 |
sharding\necessary | 否 |
是否需要重新分片的標記 如果分片總數變化,或作業伺服器節點上下線或啟用/禁用,以及主節點選舉,會觸發設定重分片標記 作業在下次執行時使用主節點重新分片,且中間不會被打斷 作業執行時不會觸發分片 |
sharding\processing |
是 |
主節點在分片時持有的節點 如果有此節點,所有的作業執行都將阻塞,直至分片結束 主節點分片結束或主節點崩潰會刪除此臨時節點 |
execution\necessary | 否 |
是否需要修正作業執行時分片項資訊的標記 如果分片總數變化,會觸發設定修正分片項資訊標記 作業在下次執行時會增加或減少分片項數量 |
execution\cleaning |
是 |
主節點在清理上次作業執行時狀態時所持有的節點 每次開始新作業都需要清理上次執行完成的作業資訊 如果有此節點,所有的作業執行都將阻塞,直至清理結束 主節點分片結束或主節點崩潰會刪除此臨時節點 |
failover\items\分片項 | 否 |
一旦有作業崩潰,則會向此節點記錄 當有空閒作業伺服器時,會從此節點抓取需失效轉移的作業項 |
failover\items\latch | 否 |
分配失效轉移分片項時佔用的分散式鎖 為 curator 的分散式鎖使用 |
流程圖
作業啟動
作業執行
===========================================================================================================