Альтернатива миграции базы данных Liquibase или Flyway для Elasticsearch
Я довольно новичок в ES. Я долго пытался найти инструмент миграции БД, и я не смог его найти. Мне интересно, может ли кто-нибудь помочь указать мне в правильном направлении.
Я бы использовал Elasticsearch в качестве основного хранилища данных в моем проекте. Я хотел бы, чтобы версия всех изменений отображения и конфигурации / импорта данных / обновления данных скрипты, которые я запускаю, как я разрабатываю новые модули в моем проекте.
в прошлом я использовал инструменты управления версиями баз данных как Flyway или Liquibase.
есть ли какие-либо фреймворки / скрипты или методы, которые я мог бы использовать с ES для достижения чего-то подобного ?
есть ли у кого-нибудь опыт работы с этим вручную с помощью скриптов и запуска сценариев миграции, по крайней мере, скриптов обновления.
спасибо заранее!
1 ответов
С этой точки зрения / необходимости, ES имеют огромные ограничения:
- несмотря на наличие динамического отображения, ES является не schemaless, но схема интенсивная. Сопоставления не могут быть изменены в случае, если это изменение противоречит существующим документам (практически, если какой-либо из документов не имеет-нулевого поля, на которое влияет новое сопоставление, это приведет к исключению)
- документы в ES неизменяемы: как только вы проиндексировали один, вы можете получить / удалить только. Этот синтаксический сахар вокруг этого-частичное обновление, которое делает потокобезопасное удаление + индекс (с тем же идентификатором) на стороне ES
что это означает в контексте вашего вопроса? Вы, в принципе, не можете иметь классические инструменты миграции для ES. И вот что может сделать вашу работу с ES проще:
-
использовать строгие сопоставления (
"dynamic": "strict"и/илиindex.mapper.dynamic: false, взглянем на сопоставление документов). Это защитит ваши индексы/типы от- случайно динамически сопоставляется с неправильным типом
- получить явную ошибку в случае, если вы пропустите некоторую ошибку в отношении сопоставления данных
вы можете получить фактическое отображение ES и сравнить его с вашими моделями данных. Если ваш PL имеет достаточно высокую библиотеку уровней для ES, это должно быть довольно легко
можно использовать индекс псевдонимы для миграции
Итак, немного опыта. Для меня в настоящее время разумный поток таков:
- все структуры данных, описанные как модели в коде. Эти модели также обеспечивают абстракцию ORM.
- вызов создания индекса / отображения-это метод простой модели.
- каждый индекс имеет псевдоним (т. е.
news), который указывает на фактический индекс (т. е.news_index_{revision}_{date_created}).
каждый раз, когда код развертывается, вы
-
Попробуйте поместить отображение модели(типа). Если это сделано без ошибки, это означает, что у вас есть либо
- поместите то же отображение
- поместите отображение, которое является чистым надмножеством старого (были предоставлены только новые поля, старые остаются нетронутыми)
- никакие документы не имеют значений в полях, затронутых новым отображением
все это на самом деле означает, что вам хорошо идти с отображением / данными, которые у вас есть, просто работайте с данными как всегда
- если ES предоставляют исключение о новом сопоставлении, вы
- создать новый индекс / тип с новым отображением (с именем
name_{revision}_{date} - перенаправить псевдоним на новый индекс
- запустите миграционный код, который делает
bulkзапросы на быструю переиндексацию Во время этого переиндексирования вы можете безопасно индексировать новые документы обычно через псевдоним. Недостатком является то, что исторические данные частично имеются в переиндексирование.
- создать новый индекс / тип с новым отображением (с именем
это испытанное на производстве решение. Предостережения вокруг такого подхода:
- вы не можете сделать это, если ваши запросы на чтение требуют согласованных исторических данных
- вы должны переиндексировать весь индекс. Если у вас есть 1 Тип на индекс (жизнеспособное решение), то его штраф. Но иногда вам нужны индексы нескольких типов
- сеть передачи данных туда и обратно. Может быть боль иногда
в сумме вверх:
- попробуйте иметь хорошую абстракцию в ваших моделях, это всегда помогает
- попробуйте сохранить исторические данные / поля устаревшими. Просто создайте свой код с этой идеей в виду, это проще, чем звучит сначала
- я настоятельно рекомендую избегать использования инструментов миграции, которые используют экспериментальные инструменты ES. Они могут быть изменены в любое время, как
river-*сервис сделал.