Вопрос или проблема
Я использую func для выполнения параллельных команд на наших серверах.
На днях у нас возникла проблема, когда перезапуск службы puppet
через func
заставил все наши серверы одновременно подключиться к puppetmaster
.
Мой вопрос: Как я могу выполнить ту же самую команду на наборе серверов, добавляя задержку перед ее выполнением на отдельных серверах?
Например: random_delay && service puppet restart
Меня интересует часть команды random_delay
.
sleep $((random % $MAXWAIT))
, где $MAXWAIT — это максимальная желаемая задержка в секундах.
sleep $((RANDOM))
RANDOM
вернет значение между 0 и 32767.
Если вам нужно установить нижний и верхний предел для задержки, вы должны определить еще две переменные следующим образом:
MINWAIT=10
MAXWAIT=30
sleep $((MINWAIT+RANDOM % (MAXWAIT-MINWAIT)))
Мне очень нравится инновационное, но не совсем идеальное решение S19N. Я говорю, что оно не совсем идеальное, так как в значительной мере остается неясным, когда именно произойдут события. Я бы предпочел иметь возможность гарантировать, когда события произойдут и какие именно события произойдут.
Оркестрация Puppet на самом деле является сложной задачей.
Одно из решений “лучших практик” — использовать MCollective, который позволит не только настроить, когда puppet будет запускаться на вашем кластере машин, но его также можно использовать для других подобных задач оркестрации.
0 */12 * * * root perl -e 'sleep int(rand(43200))' && service puppet restart
Это будет генерировать случайную задержку от 0 секунд до 12 часов (43200 = 12 x 60 x 60) каждые 12 часов.
Ответ или решение
Теория
При управлении ИТ-инфраструктурой, особенно в больших организациях, часто возникает необходимость исполнения одних и тех же команд на множестве серверов. В такой ситуации, когда серверы совершают одинаковые действия одновременно, может возникнуть распределенная нагрузка на сетевые или другие ресурсы, такие как, например, Puppet Master. Чтобы избежать таких перегрузок, можно использовать задержки, позволяющие рандомизировать выполнение задач. Эта стратегия позволяет равномерно распределить запросы и снизить риски отказов и производственных сбоев.
Одним из простейших и эффективных способов реализации рандомной задержки в Linux является использование команды sleep
в сочетании с генератором случайных чисел RANDOM
. Это позволяет задавать рандомные временные интервалы между выполнением команд на разных серверах.
Пример
Вот примеры использования рандомной задержки в командной строке:
- Основной пример:
sleep $(( RANDOM % MAXWAIT ))
Здесь MAXWAIT
— максимальная желаемая задержка в секундах.
- Пример с диапазоном:
MINWAIT=10
MAXWAIT=30
sleep $(( MINWAIT + RANDOM % (MAXWAIT - MINWAIT) ))
Этот фрагмент задает минимальную и максимальную задержку, необходимую для более точного контроля над временем выполнения.
- Использование в CRON:
0 */12 * * * root perl -e 'sleep int(rand(43200))' && service puppet restart
Эта запись показывает, как можно настроить CRON для выполнения команды каждые 12 часов с рандомной задержкой до 12 часов, рассчитанной в секундах (43200 секунд = 12 часов).
Применение
Для более организованного управления запуском команд на кластере серверов, следует учитывать несколько аспектов:
-
Проблема координации:
При одновременном рестарте услуги Puppet на всех серверах, нагрузка резко возрастает на Puppet Master. Используя рандомную задержку между запусками команд, можно предотвратить такие нагрузочные пики, распределив время выполнения команд более равномерно. Это особенно важно при неправильной конфигурации сервера или аппаратных сбоях.
-
Стабильность системы:
Равномерное распределение запросов в сети улучшает стабильность, так как снижает шанс одновременного истощения ресурсов сервера. Это также приводит к повышению надежности системы и уменьшению числа сбоев.
-
Лучшие практики:
Учитывая, что задача оркестрации, особенно с использованием Puppet, является сложной, рекомендуется использовать более продвинутые инструменты, такие как MCollective. Этот инструмент позволяет более гибко управлять расписанием выполнения задач и корректно распределять нагрузку.
Таким образом, управление запуском задач в сетях серверов с помощью рандомной задержки — важный компонент в арсенале системного администратора для достижения более стабильной и предсказуемой эксплуатации серверной инфраструктуры. Dля крупных организаций и систем с высоким уровнем нагрузки стоит проанализировать и внедрить ещё более продвинутые инструменты оркестрации для повышения эффективности.