使用JDBC-JobStore配置群集

2018-10-03 09:41 更新

Quartz的集群功能通過(guò)故障轉(zhuǎn)移和負(fù)載平衡功能為您的調(diào)度程序帶來(lái)高可用性和可擴(kuò)展性。

使用JDBC-JobStore配置群集

目前,群集僅適用于JDBC-Jobstore(JobStoreTX或JobStoreCMT),并且基本上通過(guò)使群集的每個(gè)節(jié)點(diǎn)共享相同的數(shù)據(jù)庫(kù)來(lái)工作。

負(fù)載平衡自動(dòng)發(fā)生,群集的每個(gè)節(jié)點(diǎn)都盡可能快地觸發(fā)jobs。當(dāng)Triggers的觸發(fā)時(shí)間發(fā)生時(shí),獲取它的第一個(gè)節(jié)點(diǎn)(通過(guò)在其上放置一個(gè)鎖定)是將觸發(fā)它的節(jié)點(diǎn)。

每次射擊只能有一個(gè)節(jié)點(diǎn)開(kāi)火。我的意思是,如果工作有一個(gè)重復(fù)的Triggers,告訴它每10秒鐘發(fā)射一次,那么在12:00:00,正好一個(gè)節(jié)點(diǎn)將運(yùn)行這個(gè)工作,在12:00:10,一個(gè)節(jié)點(diǎn)將運(yùn)行作業(yè)等。它不一定是每次相同的節(jié)點(diǎn) - 它或多或少是隨機(jī)的,哪個(gè)節(jié)點(diǎn)運(yùn)行它。負(fù)載平衡機(jī)制對(duì)于繁忙的調(diào)度器(大量的Triggers)是近似隨機(jī)的,但是對(duì)于非忙(例如,很少的Triggers)調(diào)度器而言,有利于同一個(gè)節(jié)點(diǎn)。

當(dāng)其中一個(gè)節(jié)點(diǎn)在執(zhí)行一個(gè)或多個(gè)作業(yè)期間失敗時(shí)發(fā)生故障切換。當(dāng)節(jié)點(diǎn)出現(xiàn)故障時(shí),其他節(jié)點(diǎn)會(huì)檢測(cè)到該狀況并識(shí)別數(shù)據(jù)庫(kù)中在故障節(jié)點(diǎn)內(nèi)正在進(jìn)行的作業(yè)。任何標(biāo)記為恢復(fù)的作業(yè)(在JobDetail上都具有“請(qǐng)求恢復(fù)”屬性)將被剩余的節(jié)點(diǎn)重新執(zhí)行。沒(méi)有標(biāo)記為恢復(fù)的作業(yè)將在下一次相關(guān)的Triggers觸發(fā)時(shí)簡(jiǎn)單地被釋放以執(zhí)行。

集群功能最適合擴(kuò)展長(zhǎng)時(shí)間運(yùn)行和/或cpu密集型作業(yè)(通過(guò)多個(gè)節(jié)點(diǎn)分配工作負(fù)載)。如果需要擴(kuò)展以支持?jǐn)?shù)千個(gè)短期運(yùn)行(例如1秒)作業(yè),則可以考慮通過(guò)使用多個(gè)不同的調(diào)度程序(包括HA的多個(gè)群集調(diào)度程序)對(duì)作業(yè)集進(jìn)行分區(qū)。調(diào)度程序使用集群范圍的鎖,這種模式會(huì)在添加更多節(jié)點(diǎn)(超過(guò)三個(gè)節(jié)點(diǎn) - 取決于數(shù)據(jù)庫(kù)的功能等)時(shí)降低性能。

通過(guò)將“org.quartz.jobStore.isClustered”屬性設(shè)置為“true”來(lái)啟用聚類(lèi)。集群中的每個(gè)實(shí)例都應(yīng)該使用相同的quartz.properties文件。這樣做的例外是使用相同的屬性文件,具有以下允許的異常:不同的線程池大小,以及“org.quartz.scheduler.instanceId”屬性的不同值。集群中的每個(gè)節(jié)點(diǎn)必須具有唯一的instanceId,通過(guò)將“AUTO”作為此屬性的值,可以輕松完成(不需要不同的屬性文件)。有關(guān)更多信息,請(qǐng)參閱有關(guān)JDBC-JobStore的配置屬性的信息。

不要在單獨(dú)的機(jī)器上運(yùn)行群集,除非它們的時(shí)鐘使用某種形式的時(shí)間同步服務(wù)(守護(hù)進(jìn)程)進(jìn)行同步,而這些時(shí)間同步服務(wù)(守護(hù)進(jìn)程)運(yùn)行非常有限(時(shí)鐘必須在彼此之間)。如果您不熟悉如何執(zhí)行此操作,請(qǐng)參閱http://www.boulder.nist.gov/timefreq/service/its.htm。
不要針對(duì)任何其他實(shí)例運(yùn)行(start()ed)的同一組數(shù)據(jù)庫(kù)表啟動(dòng)(scheduler.start())非集群實(shí)例。您可能會(huì)收到嚴(yán)重的數(shù)據(jù)損壞,一定會(huì)遇到不正常的行為。

集群調(diào)度程序的示例屬性

#============================================================================
# Configure Main Scheduler Properties  
#============================================================================

org.quartz.scheduler.instanceName = MyClusteredScheduler
org.quartz.scheduler.instanceId = AUTO

#============================================================================
# Configure ThreadPool  
#============================================================================

org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 25
org.quartz.threadPool.threadPriority = 5

#============================================================================
# Configure JobStore  
#============================================================================

org.quartz.jobStore.misfireThreshold = 60000

org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.oracle.OracleDelegate
org.quartz.jobStore.useProperties = false
org.quartz.jobStore.dataSource = myDS
org.quartz.jobStore.tablePrefix = QRTZ_

org.quartz.jobStore.isClustered = true
org.quartz.jobStore.clusterCheckinInterval = 20000

#============================================================================
# Configure Datasources  
#============================================================================

org.quartz.dataSource.myDS.driver = oracle.jdbc.driver.OracleDriver
org.quartz.dataSource.myDS.URL = jdbc:oracle:thin:@polarbear:1521:dev
org.quartz.dataSource.myDS.user = quartz
org.quartz.dataSource.myDS.password = quartz
org.quartz.dataSource.myDS.maxConnections = 5
org.quartz.dataSource.myDS.validationQuery=select 0 from dual
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)