Вступление
Процесс поэтапной разработки программного обеспечения требует стратегии поэтапной миграции баз данных.
Я помню, как работал над корпоративным приложением, где hibernate.hbm2ddl.auto был инструментом переноса данных по умолчанию.
Обновление производственной среды требовало интенсивной подготовки, а сценарии миграции создавались только на месте. Непредвиденная ошибка могла привести к повреждению производственных данных.
Добавочные обновления для спасения
Инкрементное обновление базы данных — это техническая функция, которая должна решаться на самых первых итерациях разработки приложений.
Мы использовали для разработки наших собственных реализаций миграции данных, и время, затрачиваемое на написание / поддержку сред, всегда работает против вашего текущего бюджета проекта.
Проект должен быть заполнен как кодом приложения, так и всеми связанными сценариями базы данных / сценариями обновления данных. Использование сценариев инкрементной миграции позволяет нам автоматизировать процесс развертывания и использовать преимущества непрерывной доставки .
В настоящее время вам не нужно внедрять инструменты переноса данных, Flyway работает лучше, чем все наши предыдущие пользовательские платформы. Все изменения схемы базы данных и данных должны быть записаны в сценарии инкрементного обновления в соответствии с четко определенным соглашением об именах .
План миграции СУБД учитывает изменения как схемы, так и данных. Всегда хорошо разделять схему и изменения данных. Интеграционные тесты могут использовать сценарии переноса схемы только в сочетании с данными, относящимися ко времени тестирования.
Flyway поддерживает все основные системы баз данных отношений, но для NoSQL (например, MongoDB) вам нужно искать в другом месте.
Mongeez
Mongeez — это проект с открытым исходным кодом, направленный на автоматизацию миграции данных MongoDB. MongoDB не содержит схем, поэтому сценарии миграции предназначены только для обновлений данных.
Интеграция Монгез
Сначала вы должны определить файл конфигурации mongeez:
mongeez.xml
|
1
2
3
4
|
<changeFiles> <file path="v1_1__initial_data.js"/> <file path="v1_2__update_products.js"/></changeFiles> |
Затем вы добавляете фактические сценарии миграции:
v1_1__initial_data.js
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
|
//mongeez formatted javascript//changeset system:v1_1db.product.insert({ "_id": 1, "name" : "TV", "price" : 199.99, "currency" : 'USD', "quantity" : 5, "version" : 1});db.product.insert({ "_id": 2, "name" : "Radio", "price" : 29.99, "currency" : 'USD', "quantity" : 3, "version" : 1}); |
v1_2__update_products.js
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
//mongeez formatted javascript//changeset system:v1_2db.product.update( { name : 'TV' }, { $inc : { price : -10, version : 1 } }, { multi: true }); |
И вам нужно добавить MongeezRunner тоже:
|
1
2
3
4
5
6
|
<bean id="mongeez" class="org.mongeez.MongeezRunner" depends-on="mongo"> <property name="mongo" ref="mongo"/> <property name="executeEnabled" value="true"/> <property name="dbName" value="${mongo.dbname}"/> <property name="file" value="classpath:mongodb/migration/mongeez.xml"/></bean> |
Бегущий Монжез
При первом запуске приложения инкрементные сценарии анализируются и запускаются только при необходимости:
|
1
2
3
|
INFO [main]: o.m.r.FilesetXMLReader - Num of changefiles 2INFO [main]: o.m.ChangeSetExecutor - ChangeSet v1_1 has been executedINFO [main]: o.m.ChangeSetExecutor - ChangeSet v1_2 has been executed |
Mongeez использует отдельную коллекцию MongoDB для записи ранее запущенных скриптов:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
db.mongeez.find().pretty();{ "_id" : ObjectId("543b69eeaac7e436b2ce142d"), "type" : "configuration", "supportResourcePath" : true}{ "_id" : ObjectId("543b69efaac7e436b2ce142e"), "type" : "changeSetExecution", "file" : "v1_1__initial_data.js", "changeId" : "v1_1", "author" : "system", "resourcePath" : "mongodb/migration/v1_1__initial_data.js", "date" : "2014-10-13T08:58:07+03:00"}{ "_id" : ObjectId("543b69efaac7e436b2ce142f"), "type" : "changeSetExecution", "file" : "v1_2__update_products.js", "changeId" : "v1_2", "author" : "system", "resourcePath" : "mongodb/migration/v1_2__update_products.js", "date" : "2014-10-13T08:58:07+03:00"} |
Вывод
Для автоматизации процесса развертывания необходимо создать самодостаточные пакеты, содержащие как байт-код, так и все связанные с ним конфигурации (файлы XML, пакеты ресурсов и сценарии переноса данных). Перед тем, как начать писать свою собственную платформу, вы всегда должны исследовать доступные альтернативы с открытым исходным кодом.
- Код доступен на GitHub .
| Ссылка: | Сценарии пошаговой миграции MongoDB от нашего партнера по JCG Влада Михалча в блоге Влада Михалча . |