swaro
@swaro
Nice code - awesome bugs

Как обеспечить консистентность данных между БД и поисковым движком?

Мне нужно индексировать данные в реальном времени, т.е. одновременно внести изменения и в базу данных (например, PostgreSQL) и в поисковый движок (например, ElasticSearch). Но если во время выполнения скрипта что-то случится (например, отключение электричества), то в каком то из узлов данных будет не хватать (в зависимости от того куда первее запишем данные). Как этого можно избежать?
  • Вопрос задан
  • 121 просмотр
Пригласить эксперта
Ответы на вопрос 2
vabka
@vabka
Токсичный шарпист
В программировании есть только две проблемы - именование переменных и инвалидация кэша.


Ну тут несколько вариантов:
1. Пытаться одновременно записать в обе базы.
2. Сначала писать в Postgres, как в единственный источник истины, а параллельно копировать в эластик (по расписанию или ещё как)
3. Писать в какую-нибудь брокер сообщений типа кафки, а в Postgres и ES записывать из него.

По соотношению сложность/надёжность второй вариант лучше всего
Если нужно, чтобы в Pg и ES данные попадали гарантированно и при этом как можно быстрее - вариант с брокером сообщений.
Если нужна максимальная скорость и минимальные гарантии - первый вариант.
Ответ написан
Комментировать
mayton2019
@mayton2019
Bigdata Engineer
В любой информационной системе я-бы выделял single-source-of-truth (типа главный источник правды) и этот главный источник должен быть согласован сам с собой всегда. Будет ли это дисковый файл. Kafka, или база PG - неважно. Важно что он будет арбитром в спорных ситуациях.

В ситуации с потерей электричества что вы описали - совершенно невозможно правильно восстановить обе системы. Одна из ник полюбому будет опережать другую. В high-load системах она будет опережать не на 1 на на сотню транзакций например. Честно я даже не могу придумать алгоритм восстановления. Особенно если часы где-то разошлись на милисекунду и одна из систем сделала update на уже вставленные данные.

Мне нравится вариант когда мы сразу пишем информацию в Postgres и делаем commit (по правилам которые нужны бизнесу) и дальше уже индексируем содержимое базы эластиком. После аварийного ребута я будут знать что PG содержит именно то что было закоммичено. То что нужно тоесть. Эластик будет просто догонять.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы