Переход на раздельные кластеры Docker Swarm для режима отказоустойчивости¶
В версии 6.9.0 изменено устройство отказоустойчивости: основной и резервный серверы больше не объединяются в общий кластер Docker Swarm. Для обновления серверов потребуется отключение текущей отказоустойчивости.
Предупреждение
С начала обновления и до завершения повторной настройки отказоустойчивости резервный сервер не работает: если в это время основной сервер выйдет из строя, переключения на резервный не произойдёт. Длительность работ зависит от объёма баз данных, поэтому рекомендуем выполнять обновление в период наименьшей нагрузки.
Во время работы скрипта update.py приложение может быть недоступно для пользователей в течение нескольких минут.
Перед началом убедитесь, что основной сервер является активным - VIP находится на нём. Если VIP находится на резервном сервере, сначала переключите его на основной в соответствии с инструкцией по ручному переключению.
Команды ниже используют переменные - их значения подставляются из конфигурационных файлов на первом шаге. Переменные действуют только в текущем сеансе терминала: если вы переподключились к серверу, перейдите в директорию установщика и выполните первый шаг заново.
Этап 1. Отключение отказоустойчивости¶
На обоих серверах перейдите в директорию установщика и задайте переменные:
Убедитесь, что все значения заполнены, а значение «второй сервер» на основном сервере совпадает со значением «этот сервер» на резервном и наоборот.
Примечание
В
BACKUP_DIRуказан каталог для копии баз данных, которая понадобится на этапе повторной настройки. Каталог можно изменить, но путь должен быть одинаковым на обоих серверах.Проверьте, что основной сервер является активным. На основном сервере выполните:
Ожидаемый результат: сообщение «Данный сервер является активным мастер сервером»,
service_label: primary,master_service_label: primaryи строка с VIP.Выполните ту же команду на резервном сервере. Ожидаемый результат: сообщение «Данный сервер НЕ является активным мастер сервером»,
service_label: reserve,master_service_label: primary, строки с VIP нет.На резервном сервере остановите keepalived:
Предупреждение
На основном сервере keepalived не останавливайте: он удерживает VIP, и приложение остаётся доступным по домену на протяжении всего обновления.
На основном сервере очистите метку и идентификатор сервера в конфигурационном файле
configs/replication.yaml:Проверьте результат:
Ожидаемый результат:
service_label: ""иmysql_server_id: 0.На основном сервере сохраните идентификатор ноды резервного сервера:
Ожидаемый результат: один идентификатор — ноды резервного сервера.
На основном сервере понизьте уровень ноды резервного сервера и выведите её из работы:
Проверьте, что у ноды резервного сервера статус
Drain:На резервном сервере выведите сервер из кластера Docker Swarm:
На основном сервере проверьте, что у ноды резервного сервера статус
Down:Если статус ещё
Ready, подождите несколько секунд и повторите проверку. Затем удалите ноду из кластера:На основном сервере разверните приложение без меток:
Примечание
При запуске скрипта появится предупреждение, что при смене
service_labelприложение будет недоступно для пользователей. Необходимо подтвердить дальнейшее выполнение.Дождитесь завершения обновления.
На основном сервере выполните обновление
manticoreдля корректной работы поиска:Ожидаемый результат: непустой идентификатор контейнера и сообщение
Service ... converged.Проверьте, что отказоустойчивость отключена. На основном сервере выполните:
Ожидаемый результат: в списке одна нода, значения
service_labelиmaster_service_labelпустые, строка с VIP на месте.На резервном сервере выполните:
Ожидаемый результат:
inactiveиinactive.
Этап 2. Обновление основного сервера¶
На основном сервере обновите установщик:
Запустите обновление:
Дождитесь завершения обновления.
Этап 3. Повторная настройка отказоустойчивости¶
На резервном сервере создайте собственный кластер Docker Swarm:
Команда выведет подсказку, как подключить к кластеру другие ноды, - выполнять её не нужно.
На основном сервере заполните конфигурационный файл
configs/replication.yaml:Проверьте результат:
Ожидаемый результат:
service_label: "primary",mysql_server_id: 1, вpeer_host— внутренний IP резервного сервера,master_state_changed_disable: true.Примечание
Параметр
peer_hostпоявился в версии 6.9.0 — это внутренний IP-адрес второго сервера. Параметр обязателен, если заполненservice_label.На основном сервере примените изменения:
Примечание
При запуске скрипта снова появится предупреждение о смене
service_label. Необходимо подтвердить дальнейшее выполнение.Дождитесь завершения обновления.
На основном сервере создайте mysql-пользователя для репликации баз данных:
Если у вас больше одного пространства — выберите пункт «Все».
На основном сервере запустите репликацию данных Manticore:
На основном сервере проверьте доступ к резервному серверу от имени пользователя
rider:Ожидаемый результат: имя резервного сервера без запроса пароля. От имени пользователя
riderработает синхронизация файлов, через него же на резервный сервер будет передана копия баз данных.Проверьте, что для копии баз данных достаточно места. На основном сервере выполните:
На резервном сервере выполните:
Свободного места на каждом сервере должно быть больше двух значений
totalс основного сервера. Пример вывода на основном сервере:3.1G /home/compass/monolith/database 8.4G /home/compass/db_company 512M /home/compass/manticore 12G total Filesystem Size Used Avail Use% Mounted on /dev/sda1 100G 30G 70G 30% /
В этом примере
totalравен12G, значит в колонкеAvailна каждом сервере должно быть больше24G. Если места не хватает, укажите вBACKUP_DIRна обоих серверах каталог на другом разделе диска и повторите проверку.На основном сервере создайте копию баз данных:
Если скрипт завершился сообщением «Свободное место на диске превышает указанный порог для создания бэкапа», сверьтесь с проверкой места на предыдущем шаге и снизьте порог:
На основном сервере передайте копию на резервный сервер:
При первом подключении может появиться запрос на подтверждение ключа сервера — ответьте
yes.На резервном сервере проверьте, что копия получена:
Ожидаемый результат: одна папка с копией, в которой находятся файлы
control.json,configs.tgz,mysql.tgzиmysql_company_*.tgz.На резервном сервере обновите установщик:
Примените миграции конфигурационных файлов и проверьте версию установщика:
Ожидаемый результат:
6.9.0.На резервном сервере заполните конфигурационный файл
configs/replication.yaml:Проверьте результат:
Ожидаемый результат:
service_label: "reserve",mysql_server_id: 2, вpeer_host— внутренний IP основного сервера, вhost_ip— внутренний IP резервного сервера.Перенесите ключ-секрет шифрования базы данных на резервный сервер.
Примечание
Если на серверах не включено шифрование сообщений, этот шаг нужно пропустить.
Перенос ключа-секрета шифрования базы данных
Ключ-секрет хранится в кластере Docker Swarm основного сервера и на резервный автоматически не переносится.
Проверьте, включено ли шифрование. На основном сервере выполните:
Если команда вернула
mode: "none", шифрование выключено — пропустите этот шаг.На основном сервере сохраните ключ-секрет в файл:
Передайте файл на резервный сервер и удалите его на основном:
На резервном сервере создайте ключ-секрет из файла и удалите файл:
Ожидаемый результат: в списке есть
compass_database_encryption_secret_key.На резервном сервере восстановите базы данных из копии.
Добавьте сертификат в список доверенных и обновите системное хранилище доверенных сертификатов:
Запустите восстановление:
Скрипт предложит выбрать копию из списка и подтвердить остановку приложения. Копия в списке одна — выберите
1, затем ответьтеy.Дождитесь завершения скрипта и проверьте состояние развёртывания:
На резервном сервере обновите порты в сервисе
go_database:Инвалидируйте порты, на которых были созданы пространства:
Скрипт предложит выбрать идентификатор сервера с базой данных — выберите
d1— и порты для инвалидации. Если скрипт сообщает, что порты с нужным статусом отсутствуют, пропустите эту команду.Восстановите пространства:
Проверьте, что базы данных пространств запущены:
Ожидаемый результат: количество пространств плюс один — основная база данных.
На резервном сервере создайте mysql-пользователя для репликации баз данных:
Если у вас больше одного пространства — выберите пункт «Все».
На резервном сервере сбросьте состояние репликации:
Запустите репликацию баз данных с позиции, сохранённой в копии:
Запустите репликацию данных Manticore:
На резервном сервере проверьте состояние репликации:
Ожидаемый результат по каждой базе данных:
Slave_IO_Running: Yes,Slave_SQL_Running: Yes,Seconds_Behind_Master: 0, вMaster_Host— внутренний IP основного сервера.На обоих серверах проверьте кластер Manticore:
Ожидаемый результат на обоих серверах:
primary,2иsynced. Если на резервном сервере результат другой, повторите на основном сервере запуск репликации Manticore с параметром--type master, затем на резервном — с параметром--type reserve.
Этап 4. Настройка keepalived¶
На обоих серверах добавьте в конфигурационный файл
/etc/keepalived/keepalived.confпроверку состояния баз данных. Сначала сохраните копию файла:Добавьте блок
vrrp_script chk_mysqlи строкуchk_mysql weight -30в блокtrack_script:Проверьте результат:
Ожидаемый результат: блок
vrrp_script chk_mysqlс путём к установщику этого сервера и строкаchk_mysql weight -30в блокеtrack_script. Актуальный вид конфигурационного файла приведён в статье «Настройка keepalived».Команду можно выполнить повторно — блок не будет продублирован. Если что-то пошло не так, верните исходный файл из копии:
На основном сервере перечитайте конфигурацию keepalived:
Проверьте, что keepalived работает и VIP остался на сервере:
Примечание
Используйте именно
reload: при перечитывании конфигурации VIP остаётся на сервере, и приложение продолжает работать. ПриrestartVIP ненадолго пропадёт.На резервном сервере запустите keepalived:
Этап 5. Задания cron¶
На обоих серверах замените задания отказоустойчивости в crontab. Сначала сохраните текущее расписание:
Замените задания синхронизации файлов и мониторинга репликации и добавьте автоматическое восстановление репликации. Остальные задания останутся без изменений:
На обоих серверах проверьте задания:
Ожидаемый результат: задания
sync_files.py,show_slave_replication_status.pyиensure_replication.pyс путём к установщику этого сервера.
Этап 6. Проверка результата¶
На обоих серверах проверьте, что кластеры Docker Swarm раздельные:
Ожидаемый результат:
nodes=1на каждом сервере и разные значенияcluster.На обоих серверах проверьте состояние сервисов:
Ожидаемый результат: у всех сервисов в колонке
REPLICASзначение1/1, кромеdefault-file-pivotиjitsi-custom-jitsi— для них штатно отображается0/1.Проверьте, что VIP находится только на основном сервере. На обоих серверах выполните:
Ожидаемый результат: на основном сервере строка с VIP есть, на резервном вывод пустой.
На резервном сервере проверьте состояние репликации:
Ожидаемый результат — такой же, как при проверке репликации на этапе повторной настройки отказоустойчивости.
Напишите нам в пространстве поддержки On-premise, Telegram или на почту support@getcompass.ru, чтобы получить индивидуальную демонстрацию функционала и помощь по вопросам интеграции мессенджера в вашей компании.