Обновление HA платформы (1+1)
Страница перенесена в Confluence
Опционально
Создание резервных копий:
Сделайте бэкап файлов конфигурации в /etc/wimark:
sudo cp -r /etc/wimark/ /tmp/
Сделайте бэкап базы данных, например с помощью скрипта:
#!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
Дополнительно сохраняем бэкап в другой директории:
Сделайте бэкап контейнеров, например с помощью скрипта:
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) машинах.
-
Создаём папки и копируем в них конфиги .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
Создание бэкапов для переноса данных
-
Сделать бэкап базы данных на одном из хостов
-
Узнать, какой хост и порт у Вашей БД.
Эту информацию можно найти в списке работающих контейнеровdocker ps | grep mongo
-
Войти в контейнер с БД.
Его название можно узнать из вывода команды docker ps. После этого ввести команду с указанием имени контейнера с БДdocker exec -ti ИМЯ_КОНТЕЙНЕРА_С_БД bash
-
Сделать дамп БД.
Для этого отредактируйте адрес и порт хоста (аргументы --host и --port) в команде и введите еёmongodump --host IP_ХОСТА --port ПОРТ_ХОСТА --db test
-
Скопировать папку с дампом БД из контейнера в систему командой
docker cp ИМЯ_КОНТЕЙНЕРА_С_БД:/dump/ /tmp/Wimark_Backup/DB
Желательно сделать несколько резервных копий дампа БД
-
-
Сделать бэкап статических данных из папки /usr/share/wimark/static командой
cp -r /usr/share/wimark/static /tmp/Wimark_Backup/static
Установка платформы
-
Остановить и удалить контейнеры, относящиеся к платформе Wimark на обоих хостах!
-
Запустить скрипт установки новой платформы
# Для первой машины: 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
-
После завершения работы скрипта установки создать файлы /opt/wimark/checker.sh и /opt/wimark/set_state.sh
-
/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
-
/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
-
Сделать файлы исполняемыми
chmod +x /opt/wimark/checker.sh chmod +x /opt/wimark/set_state.sh
-
-
Изменить конфигурационный файл /etc/keepalived/keepalived.conf (На двух хостах он отличается)
-
/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 }
-
/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 }
-
-
Запустить контейнеры на обеих машинах.
# Для MASTER cd /opt/wimark/master/; bash start.sh # Для BACKUP cd /opt/wimark/backup/; bash start.sh
-
Дождаться запуска контейнеров и после этого принудительно остановить контейнер wimark-one-backend-1.
docker stop wimark-one-backend-1
-
Дождаться остановки wimark-one-backend-1 и восстановить БД в контейнер wimark-one-db-ha-1.
Для корректной работы восстановить БД достаточно на одном хосте.-
Войти в оболочку mongo
docker exec -ti wimark-one-db-ha-1 mongosh --port 30001
-
Выбрать БД test
use test
-
Стереть все автоматически сгенерированные данные
db.dropDatabase()
-
Выйти из оболочки mongo
exit
-
Скопировать бэкап БД в контейнер wimark-one-db-ha-1
docker cp /tmp/Wimark_Backup/DB wimark-one-db-ha-1:/
-
Войти в bash оболочку контейнера wimark-one-db-ha-1
docker exec -ti wimark-one-db-ha-1 bash
-
Записать данные из бэкапа в новую БД
mongorestore --host IP_ХОСТА --port 30001 --db test /DB/test/
-
Выйти из bash оболочки контейнера wimark-one-db-ha-1
exit
-
-
Перенести файлы static
Эти файлы должны находиться на обоих хостах, поэтому нужно копировать их с хоста, на котором делались бэкапы на второй хост.# Удалить автоматически сгенерированные файлы rm -r /opt/wimark/static # Скопировать бэкапы в новую папку cp -r /tmp/Wimark_Backup/static /opt/wimark/
-
Запустить контейнер wimark-one-backend-1
docker start wimark-one-backend-1
-
Создать задачу для 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
-
Перезапустить службу keepalived
service keepalived restart