Задать вопрос
swaro
@swaro
Nice code - awesome bugs

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

Мне нужно индексировать данные в реальном времени, т.е. одновременно внести изменения и в базу данных (например, PostgreSQL) и в поисковый движок (например, ElasticSearch). Но если во время выполнения скрипта что-то случится (например, отключение электричества), то в каком то из узлов данных будет не хватать (в зависимости от того куда первее запишем данные). Как этого можно избежать?
  • Вопрос задан
  • 172 просмотра
Подписаться 2 Простой Комментировать
Ответ пользователя mayton2019 К ответам на вопрос (2)
mayton2019
@mayton2019
Bigdata Engineer
В любой информационной системе я-бы выделял single-source-of-truth (типа главный источник правды) и этот главный источник должен быть согласован сам с собой всегда. Будет ли это дисковый файл. Kafka, или база PG - неважно. Важно что он будет арбитром в спорных ситуациях.

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

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