При эксплуатации Почты вам может понадобиться выключить сервера или ВМ, на которых расположены сервисы Почты. Перед тем как выключить сервера, нужно корректно остановить сервисы Почты. Выключение серверов без остановки Почты может привести к некорректной работе Почты в будущем.
В документе описана процедура остановки и запуска Почты: какие контейнеры и в каком порядке нужно остановить, как вывести из работы один из серверов для обслуживания.
Нужно на сервере с Почтой последовательно выполнить следующие команды:
systemctl stop onpremise-mail.targetsystemctl stop onpremise-container-*docker ps -q | xargs -r docker stop
Нужно на сервере с Почтой последовательно выполнить следующие команды:
systemctl start onpremise-mail.targetsystemctl start onpremise-container-*
Рассмотрим процесс остановки кластерной инсталляции на 8 машин:
- 1 ВМ отводится под мониторинг;
- 2 ВМ — под фронты;
- 2 ВМ — под базы данных;
- 3 ВМ — под хранилища.
При кластерной установке Почты нет универсального алгоритма остановки сервисов. Конкретные действия зависят от того, как распределены контейнеры по ВМ и серверам в вашем кластере. Есть 3 важных правила:
- Контейнеры infraetcd* отключаются в самом конце.
- Контейнеры mailetcd*, orchestrator* и consul* отвечают за репликацию БД и не могут быть выключены раньше баз данных. То есть сначала должны быть отключены контейнеры на ВМ, отведенных под базы данных (кроме infraetcd*).
- Если один из контейнеров в двух предыдущих правилах должен остаться включенным, то нельзя отключать контейнеры calico-libnetwork*, calico-node* и bind*. Эти контейнеры отвечают за работу сети.
Чаще всего алгоритм выглядит следующим образом:
- Остановить все контейнеры и сервисы на ВМ, отведенных под фронты.
- На ВМ, отведенных под хранилища, остановить все контейнеры кроме mailetcd*, orchestrator* и consul*. При этом не отключать контейнеры calico-libnetwork*, calico-node* и bind*.
- На ВМ, отведенных под базы данных, остановить все контейнеры кроме infraetcd*. При этом не отключать контейнеры calico-libnetwork*, calico-node* и bind*.
- Остановить все контейнеры и сервисы на ВМ, отведенных под хранилища.
- Остановить все контейнеры и сервисы на ВМ, отведенных под базы данных.
- Остановить все контейнеры и сервисы на ВМ, отведенных под мониторинг.
Перед началом остановки Почты рекомендуем остановить установщик:
systemctl stop deployer
Все контейнеры останавливаются следующей командой:
systemctl stop onpremise-container-*
Чтобы контейнеры не перезапускались, нужно выполнить команду:
systemctl stop onpremise-mail.target
Чтобы не останавливать определенные контейнеры можно использовать следующую команду:
systemctl stop $(systemctl list-units --no-legend | grep onpremise-container | grep -v infraetcd | grep -v consul | grep -v mailetcd | grep -v bind | grep -v calico | grep -v orchestrator | awk '{print $1}' | tr '\n' ' ')
list-units --no-legend— убирает служебные символы вывода systemctl: «●». Они появляются при выводе больших списков.awk '{print $1}'— выводит первый столбец в результатах вывода команды systemctl. В первом столбце находятся названия контейнеров.tr '\n' ' '— заменяет перенос строк на пробелы. Это нужно, чтобы терминал не воспринимал названия контейнеров как отдельные команды.- Флаг
-vобозначает, что нужно исключить из вывода systemctl контейнеры, содержащие указанную строку.
Перед тем как останавливать контейнеры на ВМ рекомендуем выполнить команду:
echo "systemctl stop $(systemctl list-units --no-legend | grep onpremise-container | grep -v infraetcd | grep -v consul | grep -v mailetcd | grep -v bind | grep -v calico | grep -v orchestrator | awk '{print $1}' | tr '\n' ' ')"
Она выведет окончательный вид команды, которая находится внутри кавычек:
systemctl stop <список контейнеров>
Скопируйте эту команду в текстовый редактор и с помощью поиска в редакторе убедитесь, что в списке нет контейнеров, которые должны работать.
Ситуация А: на ВМ, отведенных под фронты, не расположено контейнеров mailetcd* и infraetcd*.
Тогда выполните следующие команды:
systemctl stop onpremise-mail.targetsystemctl stop onpremise-container-*docker ps -q | xargs -r docker stop
Ситуация Б: на ВМ, отведенной под фронт, установлены контейнеры mailetcd* или infraetcd*. Не выключайте контейнеры, отвечающие за работу сети: calico-libnetwork*, calico-node*, bind*. Не выключайте контейнеры mailetcd* и infraetcd*.
Чтобы выключить все контейнеры, кроме указанных, выполните команду:
systemctl stop $(systemctl list-units --no-legend | grep onpremise-container | grep -v infraetcd | grep -v consul | grep -v mailetcd | grep -v bind | grep -v calico | grep -v orchestrator | awk '{print $1}' | tr '\n' ' ')
Обычно на ВМ, отведенных под хранилища, располагаются контейнеры mailetcd*, orchestrator* и consul*. Эти контейнеры отвечают за репликацию баз данных, поэтому их можно выключить только после Шага 3. Также нельзя останавливать контейнер infraetcd*, он отключается последним.
Итого:
- На ВМ есть контейнеры mailetcd*, orchestrator* и consul* — не выключайте эти контейнеры. Их нужно будет выключить на шаге 3.
- Контейнеры infraetcd* должны остаться включенными.
- Не останавливайте контейнеры, отвечающие за работу сети: calico-libnetwork*, calico-node*, bind*.
Чтобы выключить все контейнеры, кроме указанных, выполните команду:
systemctl stop $(systemctl list-units --no-legend | grep onpremise-container | grep -v infraetcd | grep -v consul | grep -v mailetcd | grep -v bind | grep -v calico | grep -v orchestrator | awk '{print $1}' | tr '\n' ' ')
Достаточно часто на ВМ, отведенных под базы данных, располагаются контейнеры infraetcd*. Они отключаются последними, поэтому нам нужно выключить все контейнеры кроме infraetcd*.
Если на ВМ установлен infraetcd*, то нельзя останавливать контейнеры, отвечающие за работу сети: calico-libnetwork*, calico-node*, bind*.
Итого:
- Не выключаем infraetcd*.
- Не выключаем mailetcd*, orchestrator* и consul*.
- Не выключаем calico-libnetwork*, calico-node* и bind*.
Чтобы выключить все контейнеры, кроме указанных, выполните команду:
systemctl stop $(systemctl list-units --no-legend | grep onpremise-container | grep -v infraetcd | grep -v consul | grep -v mailetcd | grep -v bind | grep -v calico | grep -v orchestrator | awk '{print $1}' | tr '\n' ' ')
К шагу 4 инсталляция Почты должна иметь следующее состояние:
- Все контейнеры infraetcd* включены.
- Все контейнеры mailetcd*, orchestrator* и consul* включены.
- На ВМ где находятся infraetcd*, mailetcd*, orchestrator* и consul* включены контейнеры calico-libnetwork*, calico-node*, bind*.
После того как мы остановили контейнеры на ВМ, отведенных под базы данных, можно останавливать контейнеры, отвечающие за репликацию БД. Обычно контейнеры mailetcd*, orchestrator* и consul* располагаются на ВМ, отведенных под хранилища.
Чтобы остановить контейнеры выполните команду:
systemctl stop $(systemctl | grep onpremise-container | grep -E -i "consul|mailetcd|orchestrator" | awk '{print $1}' | tr '\n' ' ')
Если на ВМ нет контейнера infraetcd*, то можно последовательно выполнить следующие команды, чтобы остановить все контейнеры на ВМ:
systemctl stop onpremise-mail.targetsystemctl stop onpremise-container-*docker ps -q | xargs -r docker stop
К шагу 5 инсталляция Почты должна иметь следующее состояние:
- Все контейнеры infraetcd* включены.
- На ВМ где находятся infraetcd* включены контейнеры calico-libnetwork*, calico-node*, bind*.
- Выключены все контейнеры mailetcd*, orchestrator* и consul*.
Теперь можно останавливать все контейнеры на ВМ, отведенных под базы данных:
systemctl stop onpremise-mail.targetsystemctl stop onpremise-container-*docker ps -q | xargs -r docker stop
В самом конце нужно остановить все контейнеры на ВМ с контейнером infraetcd* и на ВМ, отведенной под мониторинг:
systemctl stop onpremise-mail.targetsystemctl stop onpremise-container-*docker ps -q | xargs -r docker stop
После этого можно выключить сервера и виртуальные машины, на которых установлена Почта.
-
Проверьте, что нет работающих сервисов Почты:
systemctl | grep onpremise-container | grep run -
Проверьте, что нет работающих контейнеров:
docker ps -a | grep Up
-
На всех ВМ выполните команду:
systemctl start onpremise-mail.target -
Выполните следующую команду на сервере с установщиком:
systemctl start deployer -
Перейдите в веб-интерфейс установщика
http://server-address:8888. Здесь можно посмотреть на каких ВМ располагаются нужные для запуска контейнеры. -
Определите, на каких ВМ располагаются контейнеры infraetcd*, и выполните на них команду:
systemctl start $(systemctl | grep onpremise-container-infraetcd | awk '{print $1}' | tr '\n' ' ') -
Определите, на каких ВМ располагаются контейнеры mailetcd*, и выполните на них команды:
systemctl start $(systemctl | grep onpremise-container-mailetcd | awk '{print $1}' | tr '\n' ' ') -
Определите, на каких ВМ располагаются контейнеры consul*, и выполните на них команды:
systemctl start $(systemctl | grep onpremise-container-consul | awk '{print $1}' | tr '\n' ' ') -
Запустите все контейнеры на ВМ, отведенных под базы данных:
systemctl start onpremise-container-* -
Запустите все контейнеры на ВМ, отведенных под хранилища:
systemctl start onpremise-container-* -
Запустите все контейнеры на ВМ, отведенных под мониторинг и фронты:
systemctl start onpremise-container-*
Технический писатель: Груздев Никита