Отказоустойчивость:
Подготовка серверов#
Эта статья описывает необходимые действия и подготовку перед настройкой отказоустойчивости для серверной части мессенджера Compass.
Предварительные требования#
Перед настройкой отказоустойчивости убедитесь, что:
У вас есть два сервера:
основной
— подготовленный в соответствии с инструкцией по подготовке сервера и
с развернутым Compass on-premise в соответствии с инструкцией по установке;резервный
— подготовленный в соответствии с инструкцией по подготовке сервера.
Оба сервера находятся в одной сети и им доступно минимум 3 адреса:
один внутренний IP-адрес для основного сервера;
один внутренний IP-адрес для резервного сервера;
один внешний и внутренний IP-адрес, используемый как виртуальный IP (VIP).
Пример схемы размещения серверов и использования VIP:
основной сервер: внутренний IP —
192.168.1.4
;резервный сервер: внутренний IP —
192.168.1.5
;виртуальный IP (VIP) —
192.168.1.6
, на который настроен DST-NAT с внешнего адреса188.124.51.150
.
Примечание
Виртуальный IP (VIP) — это дополнительный IP-адрес, который используется для балансировки и автоматического переключения трафика между основным и резервным серверами. VIP должен быть выделен в вашей внутренней сети. В процессе настройки Отказоустойчивости VIP будет привязан к вашему домену, используемому для доступа к Compass.
Предупреждение
Если у вас ранее уже был установлен сервер, подключать домен к внешнему IP VIP на этом шаге не требуется.
Для сценария отказоустойчивости Compass использует встроенные базы данных в Docker. Подключение к внешним базам данных в этом режиме не поддерживается.
Настройка Docker#
Если ваша версия Compass on-premise ниже 6.1.0, то обновите окружение в соответствии с инструкцией по обновлению.
На основном и резервном серверах проверьте, что версия Docker совпадает:
На основном сервере выполните команду для создания токена присоединения:
Добавьте указанный в полученной команде <port> в список разрешённых для фаервола на обоих серверах:
Список IP нод можно получить с помощью команды:
Примечание
Пример:
Имеются две ноды node-1 (IP 192.168.0.1) и node-2 (IP 192.168.0.2).
Таким образом команда добавления в разрешённые фаервола для node-1 выглядит следующим образом:
sudo ufw allow from 192.168.0.2 to any port 2377
На обоих серверах добавьте следующие порты в список разрешённых фаервола для корректной работы нод:
На резервном сервере необходимо покинуть Docker Swarm:
Настройка репликации баз данных#
На основном сервере откройте конфигурационный файл
configs/replication.yaml
для редактирования любым текстовым редактором и заполните поля:На основном сервере получите текущий список нод:
В полученном списке скопируйте ID той ноды, рядом с которой стоит отметка
*
и добавьте лейблprimary
для выбранного ID ноды.Примечание
Установите лейбл, который добавляли в конфигурационный файл
configs/replication.yaml
в полеservice_label
.Проверить результат можно командой:
Дальнейшие действия зависят от того, первая ли это установка приложения Compass на серверах или выполняете обновление имеющегося приложения.
Если это первая установка основного сервера с нуля (ранее сервер не поднимался для установки приложения)
На резервном сервере подключите сервер как вторую ноду к основному серверу.
Выполните команду, полученную ранее при выполненииsudo docker swarm join-token manager
:Далее необходимо добавить лейбл
reserve
для ID резервной ноды.На резервном сервере получите список нод:
Затем выполните команду для резервной ноды с отметкой
*
:На основном сервере выполните установку приложения:
Дождитесь завершения установки приложения на основном сервере.
Если ранее приложение уже было установлено
Выполните обновление основного сервера, чтобы применить изменения конфигурационного файла
configs/replication.yaml
:Примечание
При запуске скрипта появится предупреждение, что приложение будет недоступно для пользователей некоторое время. Необходимо подтвердить дальнейшее выполнение.
Дождитесь завершения обновления основного сервера.
Далее подключите резервный сервер как вторую ноду к основному серверу.
Выполните на резервном сервере команду, полученную ранее при выполненииsudo docker swarm join-token manager
:Далее необходимо добавить лейбл
reserve
для ID резервной ноды.На резервном сервере получите список нод:
Затем выполните команду для резервной ноды с отметкой
*
:На основном сервере создайте mysql-пользователя для репликации баз данных:
Если у вас больше одной компании - выберете пункт «Все».
На основном сервере запустите скрипт для старта репликации данных Manticore:
Примечание
В параметре master-mysql-server-id укажите значение поля mysql_server_id из конфигурационного файла
configs/replication.yaml
основного сервераСкопируйте данные баз данных основного сервера на резервный.
Для переноса данных на другой сервер требуется прокинуть ключ без passphrase с основного сервера на резервный.
На основном сервере сгенерируйте ключ доступа, оставив passphrase пустым:
Затем на основном сервере выполните команду, чтобы скопировать созданный ключ на другой сервер, где:
remote_server_user — логин для подключения к резервному серверу;
remote_server_ip — IP-адрес резервного сервера.
Для сохранения и отправки данных приложения на основном сервере необходимо выполнить скрипт
script/backup_all_data.py
из директории установщика.В скрипт передается параметр -dst, в котором:
remote_server_user — логин для подключения к резервному серверу;
remote_server_ip — IP-адрес резервного сервера;
remote_backup_folder — абсолютный путь до папки на резервном сервере, в которую необходимо сохранить копию данных (например,
/home/compass_backup
).
Предупреждение
Убедитесь, что директория
remote_backup_folder
имеет права для сохранения файлов от лицаremote_server_user
.После выполнения скрипта резервная копия данных будет сохранена по пути remote_backup_folder на резервном сервере.
На резервном сервере добавьте пользователя
www-data
, если тот отсутствует:На резервном сервере скопируйте данные приложения в новую директорию:
И поменяйте права для директорий:
Скопируйте инсталлятор по новому пути (например,
/home/on-premise/onpremise-installer
) и перейдите в новую директорию с ним:Подготовьте скопированные конфигурационные файлы для дальнейшей работы:
На резервном сервере в
configs/global.yaml
замените внутренний IP основного сервера на внутренний IP резервного:Удалите файл с лейблом, скопированный с основного сервера:
В
configs/global.yaml
на резервном сервере замените порты, которые уже используются на основном сервере:Добавьте порты
31111 и 31112
в разрешённые для фаервола:На резервном сервере откройте конфигурационный файл
configs/replication.yaml
для редактирования любым текстовым редактором и заполните поля:Примечание
Установите лейблы, которые ранее добавляли в шаге установки лейблов для нод: «primary» (на основном сервере) и «reserve» (на резервном).
Замените значения в файле
src/values.compass.yaml
:Примечание
В команду ниже подставьте те значение, которые указали в конфигурационном файле
На резервном сервере запустите скрипт для восстановления данных.
При запуске скрипта вам будет предложено:
Выбрать нужный бэкап из списка доступных копий.
Подтвердить удаление текущих данных и завершение работы приложения. Если на резервном сервере не было установлено приложение Compass, то ничего удалено не будет.
Дождитесь завершение выполнение скрипта. После этого проверьте состояние развертывания с помощью команды:
Запустите скрипт для обновления портов в сервисе
go_database
на резервном сервере:На резервном сервере инвалидируйте порты, на которых были созданы компании:
При запуске скрипта вам будет предложено:
Выбрать идентификатор сервера с базой данных. Если используется односерверная установка, выберите d1.
Выбрать порты, которые необходимо инвалидировать (выберите все по очереди).
Примечание
Если скрипт показывает, что порты с нужным статусом отсутствуют — пропустите этот пункт.
Восстановите компании на резервном сервере:
Запустите на резервном сервере скрипты для создания mysql-пользователя для репликации баз данных:
Предупреждение
Скрипты репликации баз данных НЕ работают с пользовательскими базами данных.
Если у вас больше одной компании - выберете пункт «Все».
Перед началом запуска репликации на резервном сервере выполните сброс репликации:
Если у вас больше одной компании - выберете пункт «Все».
Далее на резервном сервере запустите скрипты для старта репликации:
Если у вас больше одной компании - выберете пункт «Все».
Дождитесь завершения репликации.
Если в выводе скрипта получаете «No» для одной из позиций (IO, SQL, или другое),
значит репликация не может завершиться успешно. В этом случае рекомендуется использовать скрипты из раздела управление процессом отказоустойчивости.Затем на резервном сервере запустите скрипт для старта репликации данных
Manticore
:Примечание
В параметре master-mysql-server-id укажите значение поля mysql_server_id из конфигурационного файла
configs/replication.yaml
основного сервера.Для проверки состояния репликации на резервном сервере запустите команды:
Внимание
Перед выполнением переключения необходимо убедиться, что репликация завершила синхронизацию данных.
Критерием готовности является значение поляSeconds_Behind_Master
равное нулю, что указывает на отсутствие отставания реплики от мастера.На резервном сервере добавьте удалённый репозиторий к новому инсталлятору:
Примечание