Создание резервной копии и восстановление
Для создания резервной копии инсталляции платформы, необходимо сделать бэкапы:
- Состояния кластера и Persistent Volumes
- MongoDB
- PostgreSQL
Создание резервной копии для баз данных MongoDB и PostgreSQL не требуется, если восстановление будет осуществляться в то же окружение, с теми же параметрами:
- такие же имена ресурсов
- такой же namespace
- те же credentials
В этом случае достаточно резервной копии состояния кластера с Persistent Volumes
Создание резервной копии
Состояние кластера и Persistent Volumes
По умолчанию, вместе с платформой устанавливается оператор Velero, который путем создания Custom Resource может создавать резервные копии кластера и Persistent Volume как по требованию, так и по расписанию. По умолчанию настраивается ежедневное бэкапирование состояния кластера. Резервные копии сохраняются во внешнем S3-совместимом хранилище.
Для бэкапирования ресурсов кластера k8s и PV используется инструмент Velero
Исполнение процедуры бэкапирования осуществляется с помощью bash-скрипта размещенного на инстансе в k8s-кластере.
Для корректной работы bash-скрипта техническим администратором системы определяются следующие переменные:
- NAMESPACE - Namespace который необходимо бэкапировать.
Путь по которому сохраняется бэкап кластера задается при конфигурировании Velero.
Скрипт бэкапирования должен запускаться ежедневно с помощью утилиты cron.
Далее представлен пример скрипта используемый для бэкапирования:
# Определение пользовательских переменных
NAMESPACE=yournamespace # Namespace для бэкапирования
# Определение технических переменных
BACKUP_NAME=backup-$(date +%Y%m%d%H%M) # Временная метка бэкапа
velero backup create $BACKUP_NAME --include-namespaces $NAMESPACE
База данных MongoDB
Бэкапирование MongoDB осуществляется стандартными средствами, предусмотренными MongoDB. Исполнение процедуры бэкапирования и размещение бэкапа в постоянное хранилище осуществляется с помощью bash-скрипта размещенного на инстансе в k8s-кластере.
Для корректной работы bash-скрипта техническим администратором системы определяются следующие переменные:
- NAMESPACE - Имя namespace котором развернута MongoDB
- BACKUP_HOST_DIR - Путь до постоянного места хранения бэкапа.
В переменную BACKUP_HOST_DIR возможно указывать любой путь доступный с хоста на котором исполняется скрипт, в т.ч. удаленные хосты, S3-совместимые хранилища и т.д.
Скрипт бэкапирования должен запускаться ежедневно с помощью утилиты cron.
Скрипт реализует следующий сценарий:
- Стандартными средствами MongoDB создаются архивы схем MongoDB, внутри контейнера MongoDB
- Полученные архивы копируются в директорию указанную в переменной BACKUP_HOST_DIR
- Архивы созданные внутри контейнера MongoDB удаляются, чтобы избежать переполнения памяти постоянного хранилища сервера, на котором расположен контейнер с MongoDB
Далее представлен пример скрипта используемый для бэкапирования:
# Определение пользовательских переменных
NAMESPACE=yournamespace # Namespace в котором развернута MongoDB
BACKUP_HOST_DIR=~/backups/mongodb # Путь до постоянного места хранения бэкапа
# Определение технических переменных
# Временная метка "сейчас"
NOW=$(date +%Y%m%d%H%M)
# Название pod'а MongoDB в кластере
POD_NAME=$(kubectl -n $NAMESPACE get pod -l \
app.kubernetes.io/instance=agg-ext,app.kubernetes.io/name=aggregion-externals-mongo-agg-ext \
--no-headers -o custom-columns=":metadata.name")
mkdir -p $BACKUP_HOST_DIR # Создание директории для бэкапа
# создание бэкапа схемы Back-end API внутри pod'а MongoDB в кластере
kubectl -n $NAMESPACE exec -it $POD_NAME -- sh -c "mongodump --db=dmp --gzip --archive=/tmp/backup_dmp.gzip"
# создание бэкапа схемы DataService внутри pod'а MongoDB в кластере
kubectl -n $NAMESPACE exec -it $POD_NAME -- sh -c "mongodump --db=ds --gzip --archive=/tmp/backup_ds.gzip"
# копирование бэкапа из pod'а в директорию хоста хранилища бэкапа
kubectl cp $NAMESPACE/$POD_NAME:/tmp/backup_dmp.gzip $BACKUP_HOST_DIR/backup_dmp_$NOW.gzip
# копирование бэкапа из pod'а в директорию хоста хранилища бэкапа
kubectl cp $NAMESPACE/$POD_NAME:/tmp/backup_ds.gzip $BACKUP_HOST_DIR/backup_ds_$NOW.gzip
#удаление бэкапов из pod'а
kubectl -n $NAMESPACE exec -it $POD_NAME -- sh -c "rm -rf /tmp/*.gzip"
ESP
Так как ESP поднят в докере и у него свой инстанс MongoDB, то процедура бекапа будет отличаться от представленной выше, но логика такая же.
ESP_MONGODB_CONTAINER_ID=$(docker ps --filter "name=session-provider.*mongodb" --format "{{.ID}}") # Определяем идентификатор контейнера с MongoDB
BACKUP_HOST_DIR=~/backups/mongodb # Путь до постоянного места хранения бэкапа
NOW=$(date +%Y%m%d%H%M)
mkdir -p $BACKUP_HOST_DIR
docker exec -ti $ESP_MONGODB_CONTAINER_ID sh -c "mongodump --db=sessionProvider --gzip --archive=/tmp/backup_esp.gzip"
docker cp $ESP_MONGODB_CONTAINER_ID:/tmp/backup_esp.gzip $BACKUP_HOST_DIR/esp.$NOW.gzip
docker exec -ti $ESP_MONGODB_CONTAINER_ID sh -c "rm -f /tmp/backup_esp.gzip"
База данных PostgreSQL
Бэкапирование PostgreSQL осуществляется стандартными средствами, предусмотренными PostgreSQL. Исполнение процедуры бэкапирования и размещение бэкапа в постоянное хранилище осуществляется с помощью bash-скрипта размещенного на инстансе в k8s-кластере.
Для корректной работы bash-скрипта техническим администратором системы определяются следующие переменные:
- DC_NAMESPACE - Имя namespace котором развернута PostgreSQL;
- BACKUP_HOST_DIR - Путь до постоянного места хранения бэкапа.
В переменную BACKUP_HOST_DIR возможно указывать любой путь доступный с хоста на котором исполняется скрипт, в т.ч. удаленные хосты, S3-совместимые хранилища и т.д.
Скрипт бэкапирования должен запускаться ежедневно с помощью утилиты cron.
Скрипт реализует следующий сценарий:
- Стандартными средствами PostgreSQL создается .dump файл всех баз данных PostgreSQL, внутри pod'а PostgreSQL
- Полученные .dump файлы копируются в директорию указанную в переменной BACKUP_HOST_DIR
- .dump файлы созданные внутри pod'а PostgreSQL удаляются, чтобы избежать переполнения памяти постоянного хранилища кластера, на котором расположен pod с PostgreSQL
Далее представлен пример скрипта используемый для бэкапирования:
# Определение пользовательских переменных
DC_NAMESPACE=aggregion-dc # Namespace в котором развернута PostgreSQL
BACKUP_HOST_DIR=~/backups/postgres # Путь до постоянного места хранения бэкапа
# Определение технических переменных
NOW=$(date +%Y%m%d%H%M) # Временная метка "сейчас"
# Название pod'а PostgreSQL в кластере
POD_NAME=$(kubectl -n $DC_NAMESPACE get pod -l \
app.kubernetes.io/instance=deploy-controller,app.kubernetes.io/name=aggregion-externals-postgres-deploy-controller \
--no-headers -o custom-columns=":metadata.name")
# создание бэкапа внутри pod'а PostgreSQL в кластере
kubectl -n $DC_NAMESPACE exec -it $POD_NAME -- sh -c "pg_dumpall -U postgres > /tmp/postgres.dump"
# копирование бэкапа из pod'а в директорию хоста хранилища бэкапа
kubectl cp $DC_NAMESPACE/$POD_NAME:/tmp/postgres.dump $BACKUP_HOST_DIR/postgres.$NOW.dump
#удаление бэкапов из pod'а
kubectl -n $DC_NAMESPACE exec -it $POD_NAME -- sh -c "rm -rf /tmp/*.dump"
CAS
Т.к. CAS использует свою, проприетарную внутренню СУБД, бекап делается путём копирования данных БД этого сервиса.
NOW=$(date +%Y%m%d%H%M)
TMP_BACKUP_DIR=/tmp/cas_data_$NOW
BACKUP_DIR=~/backups/cas
CAS_CONTAINER_ID=$(docker ps --filter "name=scone.*cas" --format "{{.ID}}") # Определяем идентификатор контейнера с CAS
CAS_DATA_PATH=$(docker inspect $CAS_CONTAINER_ID | jq -r '.[0].Mounts | map(select(.Destination | contains("/data"))) | .[0].Source')
CAS_CONFIG_PATH=$(dirname $(docker inspect $CAS_CONTAINER_ID | jq -r '.[0].Mounts | map(select(.Destination | contains("/etc/cas/cas.toml"))) | .[0].Source'))
mkdir -p $BACKUP_DIR
mkdir -p $TMP_BACKUP_DIR
cp -fR $CAS_DATA_PATH $TMP_BACKUP_DIR
cp -fR $CAS_CONFIG_PATH $TMP_BACKUP_DIR
cd $TMP_BACKUP_DIR
tar -czvf $BACKUP_DIR/cas_data.$NOW.tar.gz ./
rm -rf $TMP_BACKUP_DIR
Восстановление из резервной копии
Далее описаны скрипты необходимые для восстановления из резервной копии. Этот алгоритм возможно использовать как при аварийно восстановительных работах, так и при плановом перемещении кластера на другие сервера.
В случае восстановления или переезде системы настоятельно рекомендуется иметь только 1 инстанс подключенный к Blockchain, поскольку 2 одновременно рабочих инстанса могут создавать конкурентные записи в смарт-контрактах Blockchain от лица вашей компании.
Состояние кластера и Persistent Volumes
Восстановление ресурсов k8s-кластера из бэкапа осуществляется с помощью Velero.
Для упрощения процесса восстановления ресурсов k8s-кластера из бэкапа реализован bash-скрипт предназначенный для переноса и применения бэкапов ресурсов k8s-кластера из постоянного хранилища бэкапов.
Для корректной работы bash-скрипта техническим администратором системы определяются следующие переменные:
- BACKUP_NAME - наименование бэкапа в хранилище бэкапов
- NAMESPACE - восстанавливаемый Namespace
# Определение пользовательских переменных
BACKUP_NAME=backup-202207251115 # Наименование бэкапа в хранилище бэкапов
NAMESPACE=yournamespace # восстанавливаемый Namespace
# Определение технических переменных
RESTORE_NAME=restore-$(date +%Y%m%d%H%M) # наименование оперции восстановления
# Восстановление данных
velero restore create $RESTORE_NAME --from-backup $BACKUP_NAME --namespace-mappings $NAMESPACE:$NAMESPACE-restored
MongoDB
Восстановление данных MongoDB из бэкапа предусматривается с помощью стандартных средств MongoDB. Для упрощения процесса восстановления данных из бэкапа реализован bash-скрипт предназначенный для переноса и применения бэкапов MongoDB из постоянного хранилища бэкапов.
Для корректной работы bash-скрипта техническим администратором системы определяются следующие переменные:
- NAMESPACE - Имя namespace котором развернута MongoDB;
- BACKUP_HOST_DIR - Путь до постоянного места хранения бэкапа;
- BACKUP_TIME - Временная метка которую необходимо восстановить.
В переменную BACKUP_HOST_DIR возможно указывать любой путь доступный с хоста на котором исполняется скрипт, в т.ч. удаленные хосты, S3-совместимые хранилища и т.д.
Скрипт реализует следующий сценарий:
- Копирование бэкап файла из постоянного хранилища бэкапов в pod с MongoDB;
- Восстановление данных из бэкапа стандартными средствами MongoDB.
В случае если требуется восстановления данных только одной из схем, рекомендуется восстанавливать обе схемы, поскольку данные между ними связанны и восстановление только одной схемы может привести к неконсистентности данных!
В случае восстановления данных из бэкапа рекомендуется остановить все сервисы взаимодействующие с MongoDB!
Список сервисов взаимодействующих с MongoDB возможно уточнить в описании компонентов по ссылке.
Далее представлен пример скрипта используемый для бэкапирования:
# Определение пользовательских переменных
NAMESPACE=yournamespace # Namespace в котором развернута MongoDB которую необходимо восстановить
BACKUP_HOST_DIR=~/backups/mongodb # Путь до источника бэкапа
BACKUP_TIME=202207251115 # Временная метка бэкапа, который необходимо восстановить
# Определение технических переменных
# Определение названия pod'а MongoDB в кластере
POD_NAME=$(kubectl -n $NAMESPACE get pod -l \
app.kubernetes.io/instance=agg-ext,app.kubernetes.io/name=aggregion-externals-mongo-agg-ext \
--no-headers -o custom-columns=":metadata.name")
# Копируем файлы в контейнер
# копирование бэкапа схемы для Back-end
kubectl cp $BACKUP_HOST_DIR/backup_dmp_$BACKUP_TIME.gzip $NAMESPACE/$POD_NAME:/tmp
# копирование бэкапа схемы для DataService
kubectl cp $BACKUP_HOST_DIR/backup_ds_$BACKUP_TIME.gzip $NAMESPACE/$POD_NAME:/tmp
# Восстанавливаем данные
# Восстановление данных схемы для Back-end
kubectl -n $NAMESPACE exec -it $POD_NAME sh -c "mongorestore -v --gzip --archive=/tmp/backup_dmp_$BACKUP_TIME.gzip"
# Восстановление данных схемы для DataService
kubectl -n $NAMESPACE exec -it $POD_NAME sh -c "mongorestore -v --gzip --archive=/tmp/backup_ds_$BACKUP_TIME.gzip"
ESP
Так как ESP поднят в докере и у него свой инстанс MongoDB, то процедура восстановления бекапа будет отличаться от представленной выше, но логика такая же.
BACKUP_TIME=202207251115 # Временная метка бэкапа, который необходимо восстановить
BACKUP_HOST_DIR=~/backups/mongodb # Путь до источника бэкапа
ESP_MONGODB_CONTAINER_ID=$(docker ps --filter "name=session-provider.*mongodb" --format "{{.ID}}") # Определяем идентификатор контейнера с MongoDB
docker cp $BACKUP_HOST_DIR/esp.$BACKUP_TIME.gzip $ESP_MONGODB_CONTAINER_ID:/tmp/backup_esp.gzip
docker exec -ti $ESP_MONGODB_CONTAINER_ID sh -c "mongorestore -v --gzip --archive=/tmp/backup_esp.gzip"
PostgreSQL
Восстановление данных PostgreSQL из бэкапа предусматривается с помощью стандартных средств PostgreSQL. Для упрощения процесса восстановления данных из бэкапа реализован bash-скрипт предназначенный для переноса и применения бэкапов PostgreSQL из постоянного хранилища бэкапов.
Для корректной работы bash-скрипта техническим администратором системы определяются следующие переменные:
- NAMESPACE - Имя namespace котором развернута PostgreSQL;
- BACKUP_HOST_DIR - Путь до постоянного места хранения бэкапа;
- BACKUP_TIME - Временная метка которую необходимо восстановить.
В переменную BACKUP_HOST_DIR возможно указывать любой путь доступный с хоста на котором исполняется скрипт, в т.ч. удаленные хосты, S3-совместимые хранилища и т.д.
Скрипт реализует следующий сценарий:
- Копирование бэкап файла из постоянного хранилища бэкапов в pod с PostgreSQL;
- Восстановление данных из бэкапа стандартными средствами PostgreSQL.
В случае восстановления данных из бэкапа рекомендуется остановить все сервисы взаимодействующие с PostgreSQL!
Список сервисов взаимодействующих с PostgreSQL возможно уточнить в описании компонентов по ссылке.
Далее представлен пример скрипта используемый для бэкапирования:
# Определение пользовательских переменных
NAMESPACE=yournamespace # Namespace в котором развернута PostgreSQL которую необходимо восстановить
BACKUP_HOST_DIR=~/backups/postgres # Путь до источника бэкапа
BACKUP_TIME=202207251115 # Временная метка бэкапа, который необходимо восстановить
# Определение технических переменных
# Определение названия pod'а MongoDB в кластере
POD_NAME=$(kubectl -n $DC_NAMESPACE get pod -l \
app.kubernetes.io/instance=deploy-controller,app.kubernetes.io/name=aggregion-externals-postgres-deploy-controller \
--no-headers -o custom-columns=":metadata.name")
# Копирование файлов в контейнер
kubectl cp $BACKUP_HOST_DIR/postgres.$BACKUP_TIME.dump $DC_NAMESPACE/$POD_NAME:/tmp
# Восстановление данных
kubectl -n $DC_NAMESPACE exec -it $POD_NAME sh -c "psql postgres < /tmp/postgres.$BACKUP_TIME.dump"
CAS
Т.к. CAS использует свою, проприетарную внутренню СУБД, восстановление бекапа делается путём копирования данных БД этого сервиса из заранее подготовленного бекапа.
BACKUP_HOST_DIR=~/backups/cas # Путь до источника бэкапа
BACKUP_TIME=202207251115 # Временная метка бэкапа, который необходимо восстановить
CAS_VOLUME_PATH=/PATH/TO/CAS/VOLUME # Путь до места, которое будет монтироваться в контейнер
CAS_CONTAINER_ID=$(docker ps --filter "name=scone.*cas" --format "{{.ID}}") # Определяем идентификатор контейнера с CAS
docker stop $CAS_CONTAINER_ID # Останавливаем контейнер
tar -zxf $BACKUP_HOST_DIR/cas_data.$BACKUP_TIME.tar.gz --directory $CAS_VOLUME_PATH # Распаковываем данные в нужную директорию
docker start $CAS_CONTAINER_ID # Запускаем контейнер
BlockchainNode
Скопируйте указанные ниже бинарные файлы на сервер, где поднимается копия
cd /usr/local/bin #Место копирования файлов
nodeos
cleos
Создание папки
cd /bc #Папка, где будет проводиться запись блоков BlockChain
Распакуем архив в папке /bc
tar -zxvf bc.tar.gz #Архив с другого сервера с актуальными данными BlockChain
Убеждаемся, что папки называются /bc/blockchain/
vi /usr/local/bin/blockchain #Название скрипта, который запустит процесс BlockChain
Пишем скрипт со следующим содержанием:
#/bin/bash
NODEOS=$(which nodeos)
$NODEOS --plugin eosio::chain_plugin \
--plugin eosio::chain_api_plugin \
--plugin eosio::http_plugin \
--access-control-allow-origin=* \
--http-validate-host=false \
--verbose-http-errors \
--http-server-address 0.0.0.0:8888 \
--p2p-listen-endpoint 0.0.0.0:9011 \
--p2p-peer-address 100.88.0.250:9011 \ #Обновляем данное значение, значением партнерской ноды, где доступен BlockChain
--p2p-max-nodes-per-host=30 \
--max-transaction-time=500 \
--contracts-console \
--abi-serializer-max-time-ms=1200 \
--http-max-response-time-ms=300 \
--data-dir /bc/blockchain/data \
--blocks-dir /bc/blockchain/blocks \
--config-dir /bc/blockchain/config
Скрипт для управления с помощью процесса systemd
server1:/ # vi /etc/systemd/system/blockchain.service #Путь к файлу
[Unit]
Description=Blockchain systemd service unit file.
Wants=network-online.target
After=network-online.target
[Service]
ExecStart=/bin/bash /usr/local/bin/blockchain.sh
[Install]
WantedBy=multi-user.target
Команды для запуска BlockChain
systemctl daemon-reload
systemctl enable blockchain.service #Автозапуск после рестарта BlockChain
systemctl start blockchain.service #start service
journalctl -f #check logs
После успешного запуска необходимо проверить логи в папке /bc/blockchain/data \