mybpm!
Скачать в формате: PDF pdf DOCX word

Пошаговый how to восстановления данных из MongoDB

Зачем этот how to

Нередки ситуации когда появляется необходимость восстановить данные из бэкапа Базы данных. В системе MyBPM основной Базой данных является MongoDB, но она не единственный сервис, который хранит данные. Данные так же хранятся в kafka, Elasticsearch, postgresql и zookeeper. Так же следует учесть, что данное руководство показывает как восстановить данные внутри системы, но для полного бэкапирования лучше всего подходят другие инструменты. Например snapshot виртуальной машины и подобные. Если все-таки mongo используется для бэкапа , то помимо монго так же требуется сохранить конфиги из zookeeper.

Изначальные условия перед началом

Порядок действий

1) Деплой - остановка сервисов. 2) Зачистка и загрузка дампа в БД монго. 3) Загрузка конфигов zookeeper. 4) Деплой сервисов - подготовка к миграции. 5) Настройка миграции/ 6) Запуск миграции. 7) Проверка миграции.

1 - Деплой - остановка сервисов.

Первым делом необходимо запустить систему, для того чтобы создались все необходимые таблицы в БД , они в этот момент не будут содержать информации.

Cоздаем namesapce

 kubectl create ns tcore2

В данном случае неймспейс “tcore2”, у вас будет другой, подсмотреть его можно в любом из yaml с которых разворачивается система в одноименном параметре.

Далее переходим в директорию в которой находятся yaml файлы. И запускаем-деплоим yaml-ы, в этот момент сервисы создают структуры данных и таблицы.

 cd soft/Stand-test/

Производим логин в регистр MyBPM

 docker login hub.mybpm.kz

Вводим свои данные для авторизации в регистре MyBPM/

При удачном логине Docker сгенерирует файл-конфиг. В домашней директории пользователя под кем происходил логин.

На основе полученного конфига docker создаем pullImageSecret

kubectl create secret generic -n tcore2 mybpm-docker-hub \
  --from-file=.dockerconfigjson=~/.docker/config.json \
  --type=kubernetes.io/dockerconfigjson

И деплоим манифесты в последовательности возрастания нумерации директорий и файлов в них.

kubectl apply -f ./01-pg/10-pg.yaml  -f ./02-mongo/00-configmap-init.yaml  -f ./02-mongo/10-mongo-main.yaml  -f ./02-mongo/20-mongo-express-main.yaml  -f ./03-elastic/10-elastic.yaml  -f ./04-zookeeper/10-zookeeper.yaml  -f ./04-zookeeper/20-zoo-navigator.yaml   -f 05-kafka/10-kafka.yaml  -f 05-kafka/20-kui.yaml   -f ./07-mybpm-api/10-mybpm-api.yaml  -f ./08-mybpm-web/10-mybpm-web.yaml

Проверяем все ли корректно задеплоилось.

kubectl get pods -n tcore2

Вывод команды должен быть таким :

Вывод команды

Статус везде должен быть READY 1/1

Далее останавливаем задеплоенные сервисы системы

kubectl delete -f ./01-pg/10-pg.yaml  -f ./02-mongo/00-configmap-init.yaml  -f ./02-mongo/10-mongo-main.yaml  -f ./02-mongo/20-mongo-express-main.yaml  -f ./03-elastic/10-elastic.yaml  -f ./04-zookeeper/10-zookeeper.yaml  -f ./04-zookeeper/20-zoo-navigator.yaml   -f 05-kafka/10-kafka.yaml  -f 05-kafka/20-kui.yaml   -f ./07-mybpm-api/10-mybpm-api.yaml  -f ./08-mybpm-web/10-mybpm-web.yaml

проверяем что все остановлено

kubectl get pods -n tcore2

Нужно дождаться пока вывод команды не станет таким

Вывод команды

2 - Зачистка и загрузка дампа в БД монго.

Далее зачищаем директорию в которой хранятся данные mongo, задаем права, распаковываем архив с дампом.

sudo rm -rf /k8s-volumes/mongo-main/*
cp ./mongo-21-11-2025-core2.zip  /k8s-volumes/mongo-main/
unzip /k8s-volumes/mongo-main/mongo-21-11-2025-core2.zip
sudo chmod -R 777 /k8s-volumes/mongo-main

Командой выше предполагается, что дамп лежит в домашней директории и называется mongo-21-11-2025-core2.zip и архив копируется в k8s-volumes стандартная директория для volume монго в кластере в типовом yaml. Соответственно, если у вас другие директории то подставляйте свои.

Следующим шагом необходимо запустить БД монго . Поскольку восстановление из дампа в БД , в случае если у вас довольно объемная БД занимает достаточно много ресурсов , в особенности по оперативной памяти, то подправляю в манифесте 10-mongo-main.yaml параметр отвечающий за выделение памяти

Было resources: limits: memory: 3Gi

Выделяю всю доступную в текущий момент память resources: limits: memory: 14Gi

И запускаем Монго.

kubectl apply -f ./02-mongo/00-configmap-init.yaml -f ./02-mongo/10-mongo-main.yaml

проверяем что монго стартовала.

kubectl get pods -n tcore2

Вывод команды

Далее переходим в под mongo-main-0 и запускаем восстановление базы из дампа

переходим в pod

kubectl exec -it mongo-main-0 bash

Запускаем восстановление Бд (Внутри Pod-а директория /data/db/ ссылается на /k8s-volimes/mongo-main основного хоста, в которой находится разархивированный архив дампа монго. Это настроено с помощью volume).

mongorestore /data/db/mongo-21-11-2025-core2/

Дожидаемся окончания процесса , он может занять продолжительное время, в зависимости от размера БД.

При завершении будет вывод вида:

Компьютер

вводим для того чтоб отключиться от pod-a

exit

3 - Загрузка конфигов zookeeper.

В случае если если у вас есть бэкап zookeeper, то в в этот момент необходимо загрузить в сервис zookeeper. Когда снимается дамп конфига zookeeper системы, необходимо скопировать именно /mybpm_v1_3 , поскольку, в зависимости от настроек kafka, zookeeper может использоваться так же для синхронизации nod-ов kafka.

Пример снятия-восстановления бэкапа настроек системы из zookeeper с помощью zk-navigator.

Переходим в web интерфейс zk-navigator (адрес это будет адрес вашей control-center nod-ы ), порт посмотреть можно в yaml манифесте ./04-zookeeper/20-zoo-navigator.yaml в разделе сервиса параметр nodeport.

Выглядит этот параметр так

Вывод команды

в моем случае это порт 30106

Запускаем zookeeper

kubectl apply -f ./04-zookeeper/10-zookeeper.yaml - f ./04-zookeeper/20-zoo-navigator.yaml

После чего переходим в браузере http://XX.XX.XX.XX:30106 и попадаем в интерфейс(Где ХХ.ХХ.ХХ.ХХ ip адрес вашего master(control-centre) в kubernetes).

В интерфейсе щелкнув на 3 точки напротив интересующего каталога можно сделать бэкап выбрав пункт export, бэкап загрузится в папку “загрузки” вашего компьютера через браузер.

Вывод команды

Для восстановления в этом же интерфейсе в верхней левой части нажимаем пиктограмму облака со стрелкой вверх.

Компьютер

Затем в открывшемся диалоговом окне с помощью Browse выбираем файл с настройками для загрузки.

Вывод команды

И завершаем нажав import

У вас должен появиться сохраненный ранее каталог.

В случае если сохраняли полный дамп , то после восстановления следует удалить все каталоги до запуска системы, кроме mybpm_v1_3 , zookeeper.

4 - Деплой сервисов - подготовка к миграции.

Далее деплоим все сервисы не забыв вернуть настройки по памяти для сервиса монго.

kubectl apply -f ./01-pg/10-pg.yaml  -f ./02-mongo/00-configmap-init.yaml  -f ./02-mongo/10-mongo-main.yaml  -f ./02-mongo/20-mongo-express-main.yaml  -f ./03-elastic/10-elastic.yaml  -f ./04-zookeeper/10-zookeeper.yaml  -f ./04-zookeeper/20-zoo-navigator.yaml   -f 05-kafka/10-kafka.yaml  -f 05-kafka/20-kui.yaml   -f ./07-mybpm-api/10-mybpm-api.yaml  -f ./08-mybpm-web/10-mybpm-web.yaml

Проверяем что все корректно запустилось

kubectl get pods -n tcore2

Вывод команды, как уже говорилось раннее должен быть таким

Вывод команды

5 - Настройка миграции.

Для дальнейших действий будут необходимы учетная запись пользователя, кем создана компания (аккаунт) в системе MyBPM, этот пользователь является суперадмином для данного аккаунта.

Еще одна база данных postgresql для настройки in миграции, поскольку на ее основе и создано восстановление из mongo. База данных Postgresql может находится как на внешнем сервере БД, так и на локальном, который используется системой, но в другой БД. Описывать буду второй вариант, но принципиально настройка не отличается от внешнего сервера.

Создаем базу данных postgres , которую будем использовать для миграции .

Для этого подключаемся к pod-у pg , для создания новой БД.

kubectl -n tcore2 exec -it pg-0 bash

Внутри меняем пользователя на postgres и подключаемся к бд в консольном режиме.

su postgres
psql

Просматриваем текущие БД

\l

И видим следующие базы :

Name | Owner|Encoding|collate|Ctype|Access privileges mybpm_aux1| mybpm | UTF8| en_US.utf8 | en_US.utf8 | =Tc/mybpm | | | | | mybpm=CTc/mybpm postgres | postgres| UTF8| en_US.utf8 | en_US.utf8 | template0| postgres| UTF8| en_US.utf8 | en_US.utf8 | =c/postgres | | | | | postgres=CTc/postgres template1| postgres| UTF8| en_US.utf8 | en_US.utf8 | =c/postgres | | | | | postgres=CTc/postgres

Теперь необходимо создать Базу данных и пользователя.

Я буду создавать Базу со следующими именами и свойствами.

username: in_migration
password: g56gth65h7786jhQAZXSW234
datbaseName: in_migration
schema: in_tables

Для этого выполним в psql

 CREATE USER in_migration  WITH ENCRYPTED PASSWORD ‘g56gth65h7786jhQAZXSW234’;
 CREATE DATABASE in_migration WITH OWNER in_migration;
 GRANT ALL ON DATABASE in_migration TO in_migration ;

Далее создаем схему , для этого переключаемся на только что созданную базу

\c in_migration

И выполним

CREATE SCHEMA in_tables;
GRANT ALL ON SCHEMA in_tables TO in_migration;

Результат выполнения будет примерно таким

Вывод команды

Далее необходимо зайти в браузере в систему, под пользователем который является суперадмином который создавал аккаунт (компанию). Это нужно для того чтобы узнать код аккаунта. А также создать минимальное количество объектов для миграции, что необходимо для создания и заполнения таблиц.

Переходим в интерфейс системы, логинимся.

После логина кликаем сверху справа на пиктограмме пользователя и в выпадающем списке выбираем “О программе”, в открывшемся окне можно увидеть код аккаунта (компании) который в последующем нам понадобится. В данном случае он NIT3_1.

Компьютер

Далее нажмем 3 полосочки вверху и нажать карандашик возле пункта в меню “Бизнес Объекты”. Затем нажмем зеленый плюсик и в выпадающем списке выберем “бизнес объект”

Вывод команды

После чего введем произвольное название нового объекта и проверим,что поменялся код, для этого перейдем в шестеренку и посмотрим поле “код бизнес объекта”‘

Компьютер

Если поле “Код бизнес объекта” пустое то нажать на карандашик и добавить в поле произвольное название, затем нажать изменить. Кнопка изменить может стать активной не сразу, поскольку система смотрит не пересекается ли бизнес объект еще где-то.

Компьютер

Теперь добавляем первое текстовое поле . Для этого перетягиваем его из списка на правую часть, даем ему название и нажимаем сохранить.

Проверяем появился ли код объекта Для этого в правой части объекта нажимаем шестеренку и пиктограмму с буквой “i”.

Компьютер

В открывшемся окошке мы видим , что код для этого объекта сгенерировался

Вывод команды

Нажимаем на пиктограмму с пазлом и ставим галочку в чекбоксе “Ключевое поле в IN-миграции”

Вывод команды

Затем снизу редактора объекта нажимаем сохранить.

Компьютер

Создаём еще одно текстовое поле таким же образом , но галочку поставить на “Загружать из IN_таблиц” и сохранить

Компьютер

Переходим в zookeeper (Чуть выше написано как это сделать в разделе восстановление zookeeper). И теперь нам надо настроить подключение к БД. Как уже говорилось ранее это может быть внешний сервер баз данных , но в нашем случае мы просто создали еще одну базу данных в текущем сервере, который использует система для своих нужд.

В интерфейсе zk-navigator (web интерфейс для zookeeper) переходим в каталог и открываем /mybpm_v1_3/configs/InMigrationPostgresConfig.txt

Где добавляем информацию о своей БД которая будет использоваться в миграции

В моем случае это выглядит так

Компьютер

Не забываем после нажать на пиктограмму дискеты , для того чтоб конфиг сохранился и применился в системе.

Следующий шаг - нам надо получить ddl для создания таблиц миграции и для этого надо сделать несколько вещей/

Первым делом мы укажем пароль миграции, это нужно чтоб какой-то сервис не вызвал случайно миграцию и в целях безопасности. Давайте начнем с этого .

Переходим в /mybpm_v1_3/configs/InMigrationConfig.txt

И меняем параметр

passwordToEnableServices= 

на

passwordToEnableServices=SuperPuperPass

У вас этот пароль может быть любым удобным вам , с условием соблюдения требований(Они описаны в комментарии выше самого параметра в самом конфиге). Не забываем сохранить изменения кнопкой с пиктограммой дискеты.

Теперь получим сами ddl таблицы , для этого возвращаемся в терминал и подключаемся к pod-у mybpm-api. Чтоб узнать точное имя необходимо выполнить уже известные нам команды чтоб посмотреть имя pod-а , поскольку в нем есть рандомно генерируемая часть.

kubectl get pods -n tcore2

Вывод команды

Подключаемся к Pod-у

kubectl -n tcore2 exec -it mybpm-api-849b985458 bash 

Компьютер

Имя пода у вас будет другим.

Далее в терминале самого пода нам надо сделать запрос на получение ddl таблиц

curl 'http://localhost:8080/web/migration/generate-in-ddl?pass=SuperPuperPass&companyCode=NIT3_1'

Где companyCode это параметр который мы посмотрели ранее в “О программе”, а pass пароль , который мы задали только что на предыдущем действии в zookeeper.

После выполнения видим успешное создание ddl

Вывод команды

Следующим шагом нам необходимо загрузить ddl , чтоб на их основе создались таблицы миграции . Для этого копируем их в какой-нибудь текстовый документ , я же скопирую сюда.

create table in_tables.in_For_migration (
id bigserial primary key,
in_id varchar(100),
out_id varchar(32),
inserted_date timestamp with time zone default clock_timestamp(),
in_status varchar(100) default '' not null,
occupied_id bigint,
occupied_at timestamp with time zone,
removed bool default false,
mig2 text
);

create unique index on in_tables.in_For_migration (in_id);

create table if not exists in_tables.in_fileStorage (
file_id varchar(32) primary key,
out_id varchar(32),
file_name varchar(300),
mime_type varchar(100),
content bytea,
out_file_id varchar(32),
uploaded bool default false
);

create table if not exists in_tables.process_tracking (
id serial primary key,
oper_date date not null,
start_load_time timestamp with time zone,
end_load_time timestamp with time zone,
load_status int default 0,
start_ins_inkafka_time timestamp with time zone,
end_ins_inkafka_time timestamp with time zone,
ins_inkafka_status int default 0,
occupied_by_process bigint default 0,
migrate_cur_date date default current_date,
periodic_update_time timestamp with time zone,
inserted_at timestamp with time zone default current_timestamp
);

Теперь переходим в консоль postgres

kubectl -n tcore2 exec -it pg-0 bash
su postgres
psql -U in_migration

И теперь копируем ddl из места где вы их сохранили и создаем из них необходимые таблицы.

Результат примерно будет следующий

Вывод команды

Как видите лучше запускать отдельными блоками, но в целом можно и все ddl одним запросом запустить.

Идем далее

Теперь нам надо запустить в холостую миграцию . Для этого привести к следующему виду конфиги в zookeeper. В /mybpm_v1_3/configs/InMigrationPostgresConfig.txt - в этом конфиге необходимо параметр hasInMigration=false изменить на hasInMigration=true и сохранить изменения. В конфиге /mybpm_v1_3/logging/structure.txt необходимо параметр destination tracer_in_pg_migration to_big_file traces/in_pg_migration, точнее строки ниже него привести к следующему виду (изменить на TRACE).

Вывод команды

В конфиге /mybpm_v1_3/configs/InMigrationConfig.txt необходимо подставить код компании (аккаунта) , данные которого мы будем восстанавливать. В моем случае это NIT3_1

Вывод команды

Теперь назначаем время запуска миграции в шедуллере /mybpm_v1_3/scheduler/core/InMigrationScheduler.scheduler-config.txt

Приводим вот этот параметр

Вывод команды

К такому виду

Вывод команды

Сохраняем

Проверим , выполнилась ли миграция , создались ли таблицы.

Проверяем лог миграции.

 kubectl -n tcore2 exec -it mybpm-api-849b985458-w4cxs -- tail -n 1000 -f /var/log/mybpm/traces/in_pg_migration.log

Видим результат , который говорит, что миграция прошла успешно (Она холостая , для наполнения уже самих таблиц)

Компьютер

Заходим в postgresql, как делали это выше и выполним

\dt in_tables.*

Из вывода видно , что миграция создала дополнительные таблицы ttt , ttt_postgres и другие для нужд миграции . Все идет хорошо

Компьютер

Теперь нам надо запустить восстановление данных из mongo в остальные базы данных и сервисы , для этого надо перейти в pod mybpm-api

kubectl -n tcore2 exec -it   mybpm-api-849b985458-w4cxs -- bash

И Выполнить запрос запускающий восстановление

curl --location 'http://localhost:8080/web/migration/create-mongo-to-kafka-tasks?pass=SuperPuperPass&companyCode=NIT3_1'

Должны получить в числе прочих информационных сообщений подобный вывод , говорящий, что задачи для миграции созданы.

Вывод команды

В postgres выполняем (В базе In_migration)

\d in_tables.process_tracking

и видим, что есть запись и в записи есть значение для end_ins_inkafka_time. Что говорит о том, что миграция завершена.

Компьютер

Теперь заходим в интерфейс системы и смотрим восстановленные данные

Все восстановленные данные первое время будут с ярлыками “new”

На примере пользователей

Вывод команды

На этом восстановление можно считать успешным .

Затем, если требуется отключить миграцию в /mybpm_v1_3/configs/InMigrationPostgresConfig.

fin