Skip to main content

Обновление HA платформы (1+1)

Страница перенесена в Confluence

Опционально

Создание резервных копий: 

Сделайте бэкап файлов конфигурации в /etc/wimark:

sudo cp -r /etc/wimark/ /tmp/

Сделайте бэкап базы данных, например с помощью скрипта:

Wimark Storage

#!bin/bash collections=$(docker exec one-db-1 mongo --quiet --eval "db.getCollectionNames()" test | grep -v stat | tr -d "[]\",\n' '") for collection in $collections do docker exec one-db-1 mongodump --collection=$collection --db=test -o /data/db/backup done

Дополнительно сохраняем бэкап в другой директории:

cp -r /usr/share/wimark/volumes/mongo/backup/test /tmp/

Сделайте бэкап контейнеров, например с помощью скрипта:

Wimark Storage

IMAGES=$(docker-compose -f /etc/wimark-backup/master/docker-compose.yml config | grep image | awk '{print $2;}') mkdir /tmp/backup/ docker save -o /tmp/backup/images.tar $IMAGES

Обязательно

Действия выполняем от root на двух (master/backup) машинах.

  1. Создаём папки и копируем в них конфиги .env

mkdir -p /etc/wimark-backup/master mkdir -p /etc/wimark-backup/backup cp /etc/wimark/master/.env /etc/wimark-backup/master/.env cp /etc/wimark/backup/.env /etc/wimark-backup/backup/.env

2. Скачиваем билд на сервер

wget <url> -O name.run

3. Выключаем платформу 

docker stop $(docker ps -aq)

4. Устанавливаем платформу

bash name.run

5. Восстанавливаем конфиг .env

cp /etc/wimark-backup/master/.env /etc/wimark/master/.env cp /etc/wimark-backup/backup/.env /etc/wimark/backup/.env

6. Рестартим keepalived 

service keepalived restart

Обновление на 1.10

Создание бэкапов для переноса данных

  1. Сделать бэкап базы данных на одном из хостов

    1. Узнать, какой хост и порт у Вашей БД.
      Эту информацию можно найти в списке работающих контейнеров


      docker ps | grep mongo

    2. Войти в контейнер с БД.
      Его название можно узнать из вывода команды docker ps. После этого ввести команду с указанием имени контейнера с БД


      docker exec -ti ИМЯ_КОНТЕЙНЕРА_С_БД bash

    3. Сделать дамп БД.
      Для этого отредактируйте адрес и порт хоста (аргументы --host и --port) в команде и введите её


      mongodump --host IP_ХОСТА --port ПОРТ_ХОСТА --db test

    4. Скопировать папку с дампом БД из контейнера в систему командой


      docker cp ИМЯ_КОНТЕЙНЕРА_С_БД:/dump/ /tmp/Wimark_Backup/DB

      Желательно сделать несколько резервных копий дампа БД

  2. Сделать бэкап статических данных из папки /usr/share/wimark/static командой


    cp -r /usr/share/wimark/static /tmp/Wimark_Backup/static

Установка платформы

  1. Остановить и удалить контейнеры, относящиеся к платформе Wimark на обоих хостах!

  2. Запустить скрипт установки новой платформы


    # Для первой машины: FIRST_IP={IP-1} SECOND_IP={IP-2} VIP={VIP} NEIGHBOR_IP={IP-2} ./WiMark-Platform-ha-*-installer.run # Для второй машины: FIRST_IP={IP-1} SECOND_IP={IP-2} VIP={VIP} NEIGHBOR_IP={IP-1} ./WiMark-Platform-ha-*-installer.run

  3. После завершения работы скрипта установки создать файлы /opt/wimark/checker.sh и /opt/wimark/set_state.sh

    1. /opt/wimark/checker.sh


      #!/bin/bash STATE="$(cat /opt/wimark/ha_state)" LOG_STR="$(date) $STATE" WORKDIR="/opt/wimark" case $STATE in "MASTER") cd $WORKDIR/master bash start.sh LOG_STR="$LOG_STR: start master" ;; "BACKUP") cd $WORKDIR/backup bash start.sh LOG_STR="$LOG_STR: start backup" ;; "FAULT") LOG_STR="$LOG_STR: fault" ;; *) LOG_STR="$LOG_STR: unknown" ;; esac echo $LOG_STR >> /var/log/wimark-keepalived.log

    2. /opt/wimark/set_state.sh


      #!/bin/bash TYPE=$1 NAME=$2 STATE=$3 LOG_STR="$(date) $STATE" WORKDIR="/opt/wimark" LOCK_FILE="ha_state" case $STATE in "MASTER") echo "$STATE" > $WORKDIR/$LOCK_FILE LOG_STR="$LOG_STR: start primary" ;; "BACKUP") echo "$STATE" > $WORKDIR/$LOCK_FILE LOG_STR="$LOG_STR: start secondary" ;; *) echo "$STATE" > $WORKDIR/$LOCK_FILE LOG_STR="$LOG_STR: nothing" ;; esac

    3. Сделать файлы исполняемыми


      chmod +x /opt/wimark/checker.sh chmod +x /opt/wimark/set_state.sh

  4. Изменить конфигурационный файл /etc/keepalived/keepalived.conf (На двух хостах он отличается)

    1. /etc/keepalived/keepalived.conf на первом хосте


      global_defs { script_user root #enable_script_security } # VRRP instance name WI2 vrrp_instance WIM1 { # iface for listeting interface: eth0 # ПОМЕНЯТЬ ИМЯ ИНТЕРФЕЙСА НА ТОТ, КОТОРЫМ СОЕДЕНИНЫ МАШИНЫ!!! interface eth0 # state of current server: MASTER or BACKUP state MASTER # id for unique VRRP segment virtual_router_id 67 # preempt - for change MASTER always to first node (if up) # nopreempt - stay in position after reconnecting # nopreempt # some other needed parameters garp_master_delay 1 priority 200 advert_int 1 # authentication method and password to use authentication { auth_type PASS auth_pass {RANDOMPASSWORD} } # virtual address to promote virtual_ipaddress { # ПОМЕНЯТЬ IP И ИМЯ ИНТЕРФЕЙСА НА ТЕ, КОТОРЫЕ БЫЛИ УКАЗАННЫ КАК VIP ПРИ УСТАНОВКЕ!!! {VIP}/24 dev eth0 } # script to run when STATE is changing -- main logic, DO NOT change notify /opt/wimark/set_state.sh }

    2. /etc/keepalived/keepalived.conf на втором хосте


      global_defs { script_user root #enable_script_security } # VRRP instance name WI2 vrrp_instance WIM2 { # iface for listeting interface: eth0 # ПОМЕНЯТЬ ИМЯ ИНТЕРФЕЙСА НА ТОТ, КОТОРЫМ СОЕДЕНИНЫ МАШИНЫ!!! interface eth0 # state of current server: MASTER or BACKUP state BACKUP # id for unique VRRP segment virtual_router_id 67 # preempt - for change MASTER always to first node (if up) # nopreempt - stay in position after reconnecting # nopreempt # some other needed parameters garp_master_delay 1 priority 200 advert_int 1 # authentication method and password to use authentication { auth_type PASS auth_pass {RANDOMPASSWORD} } # virtual address to promote virtual_ipaddress { # ПОМЕНЯТЬ IP И ИМЯ ИНТЕРФЕЙСА НА ТЕ, КОТОРЫЕ БЫЛИ УКАЗАННЫ КАК VIP ПРИ УСТАНОВКЕ!!! {VIP}/24 dev eth0 } # script to run when STATE is changing -- main logic, DO NOT change notify /opt/wimark/set_state.sh }

  5. Запустить контейнеры на обеих машинах.


    # Для MASTER cd /opt/wimark/master/; bash start.sh # Для BACKUP cd /opt/wimark/backup/; bash start.sh

  6. Дождаться запуска контейнеров и после этого принудительно остановить контейнер wimark-one-backend-1.


    docker stop wimark-one-backend-1

  7. Дождаться остановки wimark-one-backend-1 и восстановить БД в контейнер wimark-one-db-ha-1.
    Для корректной работы восстановить БД достаточно на одном хосте.

    1. Войти в оболочку mongo


      docker exec -ti wimark-one-db-ha-1 mongosh --port 30001

    2. Выбрать БД test


      use test

    3. Стереть все автоматически сгенерированные данные


      db.dropDatabase()

    4. Выйти из оболочки mongo


      exit

    5. Скопировать бэкап БД в контейнер wimark-one-db-ha-1


      docker cp /tmp/Wimark_Backup/DB wimark-one-db-ha-1:/

    6. Войти в bash оболочку контейнера wimark-one-db-ha-1


      docker exec -ti wimark-one-db-ha-1 bash

    7. Записать данные из бэкапа в новую БД


      mongorestore --host IP_ХОСТА --port 30001 --db test /DB/test/

    8. Выйти из bash оболочки контейнера wimark-one-db-ha-1


      exit

  8. Перенести файлы static
    Эти файлы должны находиться на обоих хостах, поэтому нужно копировать их с хоста, на котором делались бэкапы на второй хост.


    # Удалить автоматически сгенерированные файлы rm -r /opt/wimark/static # Скопировать бэкапы в новую папку cp -r /tmp/Wimark_Backup/static /opt/wimark/

  9. Запустить контейнер wimark-one-backend-1


    docker start wimark-one-backend-1

  10. Создать задачу для cron на обеих машинах


    # Открыть список задач cron для пользователя root: crontab -u root -e # Записать в него задачи для запуска /opt/wimark/checker.sh * * * * * bash /opt/wimark/checker.sh * * * * * sleep 10 && bash /opt/wimark/checker.sh * * * * * sleep 20 && bash /opt/wimark/checker.sh * * * * * sleep 30 && bash /opt/wimark/checker.sh * * * * * sleep 40 && bash /opt/wimark/checker.sh * * * * * sleep 50 && bash /opt/wimark/checker.sh # Сохранить изменения в списке задач и проверить его crontab -u root -l

  11. Перезапустить службу keepalived


    service keepalived restart