Статьи

Сценарии пошаговой миграции MongoDB

Вступление

Процесс поэтапной разработки программного обеспечения требует стратегии поэтапной миграции баз данных.

Я помню, как работал над корпоративным приложением, где 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_1
db.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_2
db.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 2
INFO  [main]: o.m.ChangeSetExecutor - ChangeSet v1_1 has been executed
INFO  [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 .