YardalGedal
@YardalGedal
yeah boy

Можно ли гарантированно записать информацию в две базы данных?

И так, у нас есть библиотека peewee с драйвером psycopg2 для работы с postgresql и библиотека redis для работы с (ого!) Redis.
Постепенно, в процессе работы программы наполняется некий буфер для записи в postgresql и некий pipeline для записи в redis. Далее с помощью менеджера контекста для атомарной операции (.atomic() ?) и bulk_create'ом внутри данные заливаются в postgresql, а после вызывается pipeline.execute() для редиса.

Каким образом можно гарантировать, что даже при внештатной ситуации - отключение света или kill процесса, данные либо запишутся в обе базы данных, либо не запишутся ни в одну?

Да, у обеих библиотек есть какие-то транзакции, но, получается, таким образом одна должна быть вложена в другую? Как это будет выглядеть, например?
  • Вопрос задан
  • 284 просмотра
Пригласить эксперта
Ответы на вопрос 1
Melkij
@Melkij
PostgreSQL DBA
отключение света или kill процесса,

Отдельно обращаю пристальное внимание на настройки редиса. Он не запишет данные с настройкой fsync по-умолчанию. Дефолтный fsync для AOF режима лога записи у него - раз в секунду. То есть все данные до секунды работы длительности вы можете потерять при крахе ОС.

Redis не поддерживает протокол двухфазного коммита. И вы не можете сделать durable fsync в два места атомарно.
Поэтому просто это никак не сделать.
Что сделать можно - переделать логику, чтобы одна из баз могла при аварии привести данные в консистентный вид используя данные ведущей базы.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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