Kümenin bir görevi yalnızca bir kez çalıştırmasını nasıl sağlayabilirsiniz?


13

Bir sunucu kümesinde yalnızca bir kez çalıştırmak istediğiniz bir göreviniz olsaydı, düzenli aralıklarla bunu başarmanın en iyi yolu ne olurdu? Bu durumda kümenin tanımı, bir yük dengeleyicinin arkasında oturan dağıtılmış oturumlara sahip 2 veya daha fazla özdeş sunucudur.

Kullanım Örneği: Çalıştırılması pahalı olan ve her X saatte bir çalıştırılması gereken bir göreviniz var. Bu iş, örneğin bir grup kaydın üzerinde yineleme yapabilir ve durumlarını güncelleyebilir.

  • En kötü senaryo, işin iki kez çalıştırılmasının verilerinizi geçersiz kılmasıdır.
  • En iyi durum senaryosu, işin tüm sunucularınızdaki kaynakları kullanmasıdır.

Gereksinim Özeti:

  1. Düğümlerden biri kapalı olsa bile işin devam etmesi gerekir.
  2. İş, her zamanlama için yalnızca bir kez çalıştırılmalıdır.
  3. Aynı anda veya çakışan zamanlarda birden fazla iş planlanıyorsa, çalışan iş sayısının sunucular arasında eşit olarak dağıtıldığı durumlarda.
  4. Makineler aynı kod tabanına sahip olmalı ve NTP üzerinden senkronize edilmelidir.
  5. Yapılandırma, ortam değişkenlerine göre düğüm ve düğüm arasında farklılık gösterebilir.
  6. İşin zamanında veya belirlenen zaman aralığında başlaması gerekir. (örneğin 5 dakika deyin)

Muhtemel çözümler

  • Bir düğümü ana düğüm olarak ayarlayın, bu yukarıdaki 1'i ihlal ettiği için çalışmaz.
  • Yük dengeleyicinin işi başlatmak için dengelenmesini talep edin. Ne yazık ki, aynı anda birden fazla işiniz varsa, hepsinin aynı makine tarafından çalıştırılabileceği yan etkisi vardır.

Bunun Java'da, bir sunucu uygulaması kapsayıcısında çalışması gerekir. Ancak aradığım işleri kodlamıyor.

Elbette bu bilinen en iyi çözümle çözülmüş bir sorundur.


İlgili soru. /programming/5949038/schedule-job-executes-twice-on-cluster

Yukarıda belirtilen 5 gereksinime göre çözüm yetersiz olduğu için bu bir kopya değildir. En çok oylanan çözüm bir yarış probleminden muzdarip ve ikinci çözüm gereksinimi 3 ihlal ediyor

Yanıtlar:


16

Paylaşılan bir veritabanınız var mı? Bunu geçmişte hakem olarak bir veritabanı kullanarak yaptım.

Temel olarak, her "iş" veritabanında bir satır olarak temsil edilir. Bir işi, veritabanına çalışmasını istediğiniz zamanla bir satır ekleyerek zamanlarsınız ve her sunucu bunu yapar:

SELECT TOP 1 *
FROM jobs
WHERE state = 'NotRun'
ORDER BY run_time ASC

Bu şekilde, hepsi bir sonraki çalıştırılması planlanan işi seçer . Hepsi uyuyorlar, böylece işin gerçekten çalışması gerekiyorsa uyanıyorlar. Sonra hepsi bunu yapar:

UPDATE jobs
SET state = 'Running'
WHERE job_id = :id
  AND state = 'NotRun'

:idYukarıdaki adımda aldığınız işin tanımlayıcısı nerede . Güncelleştirme atomik olduğundan, sunucuların tek aslında olmadığını belirlemek için durum kodu veritabanının "rows güncellemeler sayısını" kontrol edebilirsiniz, satır güncellenir sen aslında satır güncellenen bu sunucu vardı ve bu nedenle ister sen sunucusuysanız bu işi yürütür.

Eğer "kazanamazsan" ve işi yapmazsan hemen 1. adıma geri dön. "Kazandınız", işi başka bir iş parçacığında yürütmek üzere zamanlayın, ardından 1. adıma dönmeden önce birkaç saniye bekleyin. Bu şekilde, bu sefer işi almayan sunucuların bir iş alma olasılığı daha yüksektir hemen çalışması planlanıyor.


1
Burada hangi isloation seviyesini kullanıyorsunuz? Taahhütlü mü yoksa serileştirilmiş mi?
Maverick Riz

2

Birçok uygulama sunucusunun "küme genişliğinde tektonlu hizmetler" özelliği vardır.

Örneğin Weblogic, web yönetici konsolu üzerinden yapılandırılan bir Singleton Hizmeti özelliğine sahiptir.

Weblogic.cluster.singleton.SingletonService uygulayan bir sınıf yazmanız ve bunu yönetici konsolunda bildirmek için kullanmanız gerekir. Küme, sınıfı başlatır ve hizmet başlatıldığında veya durdurulduğunda size bildirir. SingletonService arabiriminin bir enable () ve bir deactivate () yöntemi vardır.

Weblogic çağrıları, kümenin düğümlerinden birinde hizmeti ilk kez getirdiğinde etkinleştirir (). Seçilen düğüm aşağı inerse, yönetici sunucu hizmeti farklı bir sunucuda "hareket ettirir" ve oradan activ () öğesini çağırır.

http://docs.oracle.com/cd/E12839_01/apirefs.1111/e13952/taskhelp/clusters/ConfigureSingletonService.html

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.