Якщо у вас виникло завдання, яке ви хотіли запустити лише один раз на кластері серверів, через регулярний проміжок часу, який би був найкращий спосіб досягти цього? Визначення кластера в цьому випадку - це 2 або більше однакових серверів з розподіленими сеансами, що сидять за балансиром навантаження.
Використовуйте випадок: у вас є дороге завдання, яке потрібно виконувати лише один раз за X години. Наприклад, ця робота може повторювати купу записів та оновлювати їх статус.
- Найгірший сценарій - це те, що виконання роботи два рази недійсні ваші дані.
- Найкращий сценарій - це те, що робота використовує ресурси на всіх ваших серверах.
Резюме вимог:
- Завдання все одно має виконуватися, навіть якщо один з вузлів не працює.
- Робота повинна виконуватися лише один раз за графіком.
- Якщо заплановано кілька завдань одночасно або в часи перекриття, кількість запущених завдань розподіляється порівну між серверами.
- Машини повинні мати однакову базу коду та синхронізуватися через NTP.
- Конфігурація може відрізнятися між вузлом і вузлом за змінними середовища.
- Завдання має розпочатися вчасно або протягом заданого інтервалу від призначеного часу. (скажімо, наприклад, 5 хвилин)
Можливі рішення
- Встановіть один вузол як головний вузол, він не працює, оскільки він порушує 1 вище.
- Зробіть запит, щоб балансир навантаження врівноважився, щоб розпочати роботу. На жаль, це побічний ефект полягає в тому, що якщо у вас одночасно працює декілька завдань, всі вони можуть працювати на одній машині.
Це потрібно було б запустити на Java, у контейнері сервлетів. Однак це не кодування завдань, які я шукаю.
Звичайно, це вирішена проблема з відомим найкращим рішенням.
Супутнє питання. /programming/5949038/schedule-job-executes-twice-on-cluster
Це не дублікат, оскільки рішення недостатньо відповідно до цих 5 вимог, наведених вище. Найбільш схвалене рішення страждає від гоночної проблеми, а друге рішення порушує вимогу 3