Як можна змусити кластер виконувати завдання лише один раз?


13

Якщо у вас виникло завдання, яке ви хотіли запустити лише один раз на кластері серверів, через регулярний проміжок часу, який би був найкращий спосіб досягти цього? Визначення кластера в цьому випадку - це 2 або більше однакових серверів з розподіленими сеансами, що сидять за балансиром навантаження.

Використовуйте випадок: у вас є дороге завдання, яке потрібно виконувати лише один раз за X години. Наприклад, ця робота може повторювати купу записів та оновлювати їх статус.

  • Найгірший сценарій - це те, що виконання роботи два рази недійсні ваші дані.
  • Найкращий сценарій - це те, що робота використовує ресурси на всіх ваших серверах.

Резюме вимог:

  1. Завдання все одно має виконуватися, навіть якщо один з вузлів не працює.
  2. Робота повинна виконуватися лише один раз за графіком.
  3. Якщо заплановано кілька завдань одночасно або в часи перекриття, кількість запущених завдань розподіляється порівну між серверами.
  4. Машини повинні мати однакову базу коду та синхронізуватися через NTP.
  5. Конфігурація може відрізнятися між вузлом і вузлом за змінними середовища.
  6. Завдання має розпочатися вчасно або протягом заданого інтервалу від призначеного часу. (скажімо, наприклад, 5 хвилин)

Можливі рішення

  • Встановіть один вузол як головний вузол, він не працює, оскільки він порушує 1 вище.
  • Зробіть запит, щоб балансир навантаження врівноважився, щоб розпочати роботу. На жаль, це побічний ефект полягає в тому, що якщо у вас одночасно працює декілька завдань, всі вони можуть працювати на одній машині.

Це потрібно було б запустити на Java, у контейнері сервлетів. Однак це не кодування завдань, які я шукаю.

Звичайно, це вирішена проблема з відомим найкращим рішенням.


Супутнє питання. /programming/5949038/schedule-job-executes-twice-on-cluster

Це не дублікат, оскільки рішення недостатньо відповідно до цих 5 вимог, наведених вище. Найбільш схвалене рішення страждає від гоночної проблеми, а друге рішення порушує вимогу 3

Відповіді:


16

У вас є спільна база даних? Я робив це за допомогою бази даних як арбітра в минулому.

В основному кожне "завдання" представлено у вигляді рядка в базі даних. Ви плануєте роботу, додаючи рядок у базу даних з часом, коли ви хочете її запустити, а потім виконує кожен сервер:

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

Таким чином, всі вони виберуть роботу, яку планується виконати наступним . Всі вони сплять так, що прокидаються, коли робота насправді повинна виконуватись. Потім вони все роблять:

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

Де :idідентифікатор роботи, яку ви отримали на кроці вище. Оскільки оновлення є атомним, лише один із серверів буде фактично оновлювати рядок, ви можете перевірити код статусу бази даних "кількість рядків оновлень", щоб визначити, чи був ви сервер, який фактично оновлював рядок, а отже, чи є ви сервером що отримує роботу.

Якщо ви не «перемогли» і не виконуєте роботу, просто негайно поверніться до кроку 1. Якщо ви "виграли", заплануйте завдання на виконання в іншій потоці, а потім зачекайте пару секунд, перш ніж повернутися до кроку 1. Таким чином, сервери, які цього разу не отримали роботу, швидше за все підберуть роботу це планується запустити негайно.


1
Який рівень розташування ви тут використовуєте? Читати вчинене чи серіалізувати?
Маверик Різ

2

Кілька серверів додатків мають функцію для "кластерних одиночних послуг".

Наприклад, Weblogic має функцію послуги Singleton, яка налаштована через консоль веб-адміністратора.

Ви повинні написати клас, який реалізує weblogic.cluster.singleton.SingletonService і використовувати його для оголошення служби на консолі адміністратора. Кластер дбає про інстанціювання класу та оповіщення про те, коли послуга запущена чи зупинена. Інтерфейс SingletonService має метод активації () та деактивації ().

Виклики Weblogic активуються () під час першого запуску послуги на одному з вузлів кластера. Якщо вибраний вузол знижується, сервер адміністратора "переміщує" послугу на інший сервер, викликаючи там активацію ().

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.