ElasticJob Lite調研

寒露君發表於2018-10-18

因現有系統的排程系統對作業的生命週期,執行軌跡與狀態監控和報警,無統一的管理和資源規劃;導致運維維護困難、排程與執行耦合性嚴重、開發不規範、作業週期設定不合理等因素帶來的一系列定位問題困難,人工干預困難及資源控制不合理的問題;調研了幾項比較熱門的開源的分散式排程系統,最後因某些原因,選擇了自研;

Elastic Job主要功能的

A. 開源地址 github.com/elasticjob/…
B. Elastic Job文件 elasticjob.io/docs/elasti…
C. Bug列表 github.com/elasticjob/…

支援功能項 待改造專案 Elastic Job
動態管理Job生命週期
直觀展示Job的web頁面
Misfire功能
Job容錯Failover功能
HA
跟蹤Job執行軌跡
執行緒是否可控

Elastic Job 主要支援功能項列表

A. 支援Job生命週期的管理

  1. 提供全部的job列表,支援Job的線上搜尋及統計,並直觀的展現Job的執行狀態
  2. 支援對Job直接觸發;動態的暫停,失效,及修改Job資訊(Cron表示式,分片總數,攜帶自定義引數,是否失效轉移,是否開啟錯過執行等主要的資訊的動態修改);

B. 支援Job Fail Over 失效轉移的策略

  1. 當執行Job A的所在機器 Task Server A 當機後,如果開啟失效轉移,Job A會立即選擇一個備機 Task Server B上補償 執行 Job A;
  2. 觸發重新選舉,選擇由哪臺Task Server來執行 Job A;

C. 支援分散式排程協調,確保在job在分散式環境下執行的冪等性

  1. 確保一個Job在分散式環境下只有一臺Task Server 在執行(注意事項),採用熱備方式保證HA
  2. 通過zk leader選舉,leader協調分散式環境下的Job,執行分片和清理分片

D. 支援Job MisFire 錯過重新執行策略

  1. 開啟Misfire和 Monitor-Execution後,當Job B 1執行時,發現Job B2正在執行,為Job B2設定Misfire標誌,當Job B1執行完比後執行 Job B2

E. 支援Job執行軌跡的記錄

  1. 提供了事件追蹤功能,可通過事件訂閱的方式處理排程過程的重要事件,用於查詢、統計和監控。Elastic-Job目前提供了基於關係型資料庫兩種事件訂閱方式記錄事件

F. 支援豐富的作業型別

  1. Simple 型別 一般Job採用此方式
  2. Dataflow 型別 : 以流式方式處理業務邏輯
  3. Script型別 : 以指令碼方式建立Job

G. 支援作業並行排程

  1. 同一Job在執行時,可以以多例項執行;只需要指定不同的job name;

H. 支援定製化處理

  1. 支援定製化的異常處理
  2. 支援定製化的執行緒池處理

Elastic Job 操作時需要注意的問題

A. 業冪等性操作的問題

  1. 開啟monitorExecution才能實現分散式作業冪等性(即不會在多個作業伺服器執行同一個分片)的功能,但monitorExecution對短時間內執行的作業(如每5秒一觸發)會造成Job堆積的情況;效能影響較大,建議關閉並自行實現冪等性;同樣不建議開啟misfire,對zk效能有影響;
  2. 重啟全部作業機器時,如果開啟失效轉移,一些特定的業務場景需要手動清除此作業的Failover資料節點,避免重啟時候作業機器開始執行被標記為failover的作業;

Elastic Job 目前存在問題

A. 間隔短的Job冪等性問題需要業務程式碼去控制;
B. 效能問題:一個分片為1的Job,產生執行緒數為4個,一個執行分片的Job執行緒數為 4 + 可執行核數*2;需要修改原始碼規範執行緒使用;
C. Tomcat正常關閉(非 kill)的情況下,提醒記憶體洩露,執行緒池中的執行緒和排程執行緒未被銷燬;此問題因建立Schduler時未指定容易銷燬時關閉排程,導致排程執行緒未終止;修改原始碼JobScheduler指定銷燬動作即可;
D. 分散式一次監聽AbstractDistributeOnceElasticJobListener在併發下存在不可用問題;此問題通過修改原始碼已經修復;
E. 短頻執行的任務不適合開啟監聽和事件跟蹤;

架構設計

ElasticJob Lite調研

A. 環境說明

  1. Job配置儲存:xml儲存/java程式碼配置/scrip配置
  2. 外部依賴zookeeper( 3.4.6及其以上版本);實現master選舉,分散式協調/通知,分散式佇列,分散式鎖
  3. JDK 1.7以上版本
  4. Maven3.0.4及其以上版本

B. 模組說明

  1. Registry註冊中心提供Job config,Job instance,Job status 儲存;提供Rest API方便外部應用(Console)對Job生命週期進行統一控制;如:獲取Job資訊及執行資訊,更新Job配置資訊,暫停或禁止Job執行等操作
  2. Console提供視覺化頁面,採集Job列表,配置資訊,執行資訊,分片狀態,Job事件資訊及Job命令下發;
  3. Lite 作為Elastic Job的起承轉合:主要負責 作業機器(Job instance)選主,作業分片,作業建立,作業註冊,作業啟動/暫停/禁止/misfire/failover;並通過一些列的Listener完成zookeeper節點變化的監聽,實現當機自動切換,失效轉移,命令下發等功能;基於事件監聽實現Job執行軌跡的跟蹤;

C. 啟動流程

ElasticJob Lite調研

D. 作業執行

ElasticJob Lite調研


專案部署

A. 應用部署

  1. 啟動Elastic-Job-Lite指定註冊中心的Zookeeper
  2. 執行包含Elastic-Job-Lite和業務程式碼的jar檔案。不限與jar或war的啟動方式

B. 運維部署

  1. 解壓縮elastic-job-lite-console-${version}.tar.gz並執行bin\start.sh
  2. 開啟瀏覽器訪問http://localhost:8899/即可訪問控制檯。8899為預設口號,可通過啟動指令碼輸入-p自定義埠號。
  3. 訪問RESTFul API方法同控制檯
  4. elastic-job-lite-console-${version}.tar.gz可通過mvn install編譯獲取

其他開源的分散式排程框架


後續會帶來Elastic Job和Quarzt的原始碼解析

相關文章