淺談分散式排程
淺談分散式排程
什麼是分散式排程?
要說分散式排程,那麼先來談下什麼是分散式。
分散式:百度百科上是這麼說的,當計算機的程式和資料通過網路分佈在多於一個的計算機上時,計算就成為“分散式的”。通俗的說,平臺是分散式部署的,各個節點之間可以無狀態和無限的水平擴充套件。
那麼什麼是分散式排程?分散式排程就是運⾏在分散式叢集環境下的排程任務。它有兩層含義:
- 同⼀個定時任務程式部署多份,只應該有⼀個定時任務在執⾏
- 定時任務的拆分,即為把⼀個⼤的作業任務拆分為多個⼩的作業任務,同時執⾏
下面我們通過一個圖來簡單瞭解下分散式任務排程
其實分散式排程本質上就是在分散式環境下對定時任務的排程。定時任務的實現⽅式有多種。早期沒有定時任務框架的時候,我們會使⽤JDK中的Timer機制和多執行緒機制(Runnable+執行緒休眠)來實現定時或者間隔⼀段時間執⾏某⼀段程式;後來有了定時任務框架,⽐如⼤名鼎鼎的Quartz任務排程框架,使⽤時間表達式(包括:秒、分、時、⽇、周、年)配置某⼀個任務什麼時間去執⾏。現在有一系列針對分散式環境下的任務排程框架供我們使用,比如:cronsun、Elastic-job、saturn、lts、TBSchedule、xxl-job等。這裡,我們就拿噹噹網的Elastic-job來展開說明。
Elastic-Job
Elastic-Job是噹噹⽹開源的⼀個分散式排程解決⽅案,基於Quartz⼆次開發的,由兩個相互獨⽴的⼦項⽬Elastic-Job-Lite和Elastic-Job-Cloud組成。這裡我們要介紹的是 Elastic-Job-Lite,它定位為輕量級⽆中⼼化解決⽅案,使⽤Jar包的形式提供分散式任務的協調服務,⽽Elastic-Job-Cloud⼦項⽬需要結合Mesos以及Docker在雲環境下使⽤。
Elastic-Job的github地址:https://github.com/elasticjob,有興趣的可以去看看
功能介紹
下面我們對Elastic-Job-Lite的主要功能進行介紹
- 分散式排程協調 在分散式環境中,任務能夠按指定的排程策略執⾏,並且能夠避免同⼀任務多例項重複執⾏
- 豐富的排程策略 基於成熟的定時任務作業框架Quartz cron表示式執⾏定時任務
- 彈性擴容縮容 當叢集中增加某⼀個例項,它應當也能夠被選舉並執⾏任務;當叢集減少⼀個例項時,它所執⾏的任務能被轉移到別的例項來執⾏。
- 失效轉移 某例項在任務執⾏失敗後,會被轉移到其他例項執⾏
- 錯過執⾏作業重觸發 若因某種原因導致作業錯過執⾏,⾃動記錄錯過執⾏的作業,並在上次作業完成後⾃動觸發。
- ⽀持並⾏排程 ⽀持任務分⽚,任務分⽚是指將⼀個任務分為多個⼩任務項在多個例項同時執⾏。
- 作業分⽚⼀致性 當任務被分⽚後,保證同⼀分⽚在分散式環境中僅⼀個執⾏例項。
特點
Elastic-Job-lite有兩個重要的特點:
- 輕量級 all in jar,所有用到的東西都在jar包中,唯一的也是必要的依賴只有zookeeper
- 去中心化 執行節點對等;定時排程自觸發,無需中心排程節點分配;服務自發現;主節點非固定,一個節點故障或者下線自動切換到其它節點
分片
⼀個⼤的⾮常耗時的作業Job,⽐如:⼀次要處理⼀億的資料,那這⼀億的資料儲存在資料庫中,如果⽤⼀個作業節點處理⼀億資料要很久,在互聯⽹領域是不太能接受的,互聯⽹領域更希望機器的增加去橫向擴充套件處理能⼒。所以,ElasticJob可以把作業分為多個的task(每⼀個task就是⼀個任務分⽚),每⼀個task交給具體的⼀個機器例項去處理(⼀個機器例項是可以處理多個task的),但是具體每個task執⾏什麼邏輯由我們⾃⼰來指定。
Strategy策略定義這些分⽚項怎麼去分配到各個機器上去,預設是平均去分,可以定製,⽐如某⼀個機器負載 ⽐較⾼或者預配置⽐較⾼,那麼就可以寫策略。分⽚和作業本身是通過⼀個註冊中⼼協調的,因為在分散式環境下,狀態資料肯定集中到⼀點,才可以在分散式中溝通。
彈性擴容
上圖中我們新增加⼀個運⾏例項app3,它會⾃動註冊到註冊中⼼,註冊中⼼發現新的服務上線,註冊中⼼會通知ElasticJob 進⾏重新分⽚,那麼總得分⽚項有多少,那麼就可以搞多少個例項機器,⽐如完全可以分1000⽚, 來同時工作。
注意:
- 分⽚項也是⼀個JOB配置,修改配置,重新分⽚,在下⼀次定時運⾏之前會重新調⽤分⽚演算法,那麼這個分⽚演算法的結果就是:哪臺機器運⾏哪⼀個⼀⽚,這個結果儲存到zk中的,主節點會把分⽚給分好放到註冊中⼼去,然後執⾏節點從註冊中⼼獲取資訊(執⾏節點在定時任務開啟的時候獲取相應的分⽚)。
- 如果所有的節點掛掉值剩下⼀個節點,所有分⽚都會指向剩下的⼀個節點,這也是ElasticJob的⾼可⽤。
總結
結合分散式任務排程框架(elastic-job),我們來總結下:
分散式環境下任務排程相對於單體部署環境下的任務排程,需要考慮的更多,比如,單體部署環境下同一個定時任務只會執行一次,而分散式環境下每個環境中都有相同的定時任務,我們要保證一個定時任務,只能有一個服務來執行。同時分散式環境也給我們帶來了一些好處,比如,我們可以對一個體量較大的任務來進行分片拆分,讓多個服務來分工執行不同條件的任務,降低單體服務環境下伺服器的壓力;如果一個服務出現異常,我們立馬可以讓另外一個服務來頂替異常服務的工作,從而保證任務可以繼續執行,提高系統的穩定和可靠性。