0

После поиска hi и lo для наилучшего способа запуска задания cron при развертывании приложения, использующего Amazon Elastic Beanstalk с автоматическим масштабированием, масштабирование включено, я столкнулся с несколькими решениями.Использование MySQL LOCK TABLE для обеспечения одного экземпляра задания cron в облаке (автомасштабирование EC2/ELB)

Проблема: проблема с запуском cron в beanstalk (или облаке с автоматическим масштабированием) заключается в том, что каждый экземпляр будет иметь собственный демон cron, и скрипт будет запускать много копий одновременно (на каждом экземпляре EC2), когда он автоматически масштабируется.

Solutions предложила:

  1. Используйте экземпляр уборщица + SQS
    • Проблема: это слишком сложно, и я не хочу быть выставлен счет за дополнительный экземпляр по одной простым хронам работы, как отправка оповещения пользователю.
  2. Использование cronlock
    • Проблема: требует установки центрального Redis разъединить.

Мое решение:

Мой сайт уже есть сервер Mysql (Amazon RDS), и поэтому я думал, что, возможно, это может работать?

  1. Я могу создать таблицу только с одним полем last_run.
  2. Создайте следующий скрипт и добавить его в демон cron вместо:
    1. LOCK TABLES crond WRITE
    2. Считайте значение в crond. last_run
    3. Если time() - last_run> 5 (то есть 5 секунд прошло), то я обновления времени в last_run поле текущего time.
    4. Если time() - last_run < 5, то я сразу же выйти говоря, хрон был выполнен менее чем за 5 секунд назад (то есть какой-то другой экземпляр получил ЗАМОК первый)
    5. UNLOCK TABLES.
    6. Spawn фактических хрон сценарий (ы), если last_run> 5 (то есть # 3 верно)

Вопросы:

  • Будет ли это быть достаточным, чтобы гарантировать, что только одна копия cron работает одновременно?
  • Есть ли более простые альтернативы тому, чего я пытаюсь достичь?

Ваши идеи будут полезны, прежде чем я буду проектировать и проверять эту вещь.

+0

Вы задумывались над использованием запланированной функции лямбда вместо cron? Это, безусловно, будет проще, чем предлагаемое вами решение, и намного дешевле, чем выделенный экземпляр cron. –

+0

привет, нет, я не знал об этом. Спасибо за подсказку, я буду искать дополнительную информацию об этом – supersan

ответ

1

Elastic Benastalk содержит механизм только для этого. Он называется leader_only и гарантирует, что ваш cron будет работать на одном экземпляре, а не на всех. See documentation here.

Вот StackOverflow нить, которая занимается только что: AWS Elastic Beanstalk, running a cronjob

Если это не работает для вас, дайте Cronally шанс.

+1

Привет, да, я читал об этом, но проблема в том, что «лидер» может быть убит после автоматического масштабирования шкал. Таким образом, возможно, что задание cron перестанет работать, если оно установлено только для лидера:/(он упоминается в обновлении для первого ответа) – supersan

+0

Вы верны. В этом случае я предполагаю, что Cronally является единственным «простым» вариантом: http://blog.turret.io/run-cron-jobs-on-aws-with-cronally/ – Tal

Смежные вопросы