В чем отличия стриминг и логической репликации в PostgreSQL
Что проверяют
Понимаете ли вы, что механизмы решают разные задачи: один даёт горячую копию всего кластера для отказоустойчивости, другой переносит изменения отдельных таблиц. Следом обычно спрашивают, как бы вы сделали мажорное обновление PostgreSQL с минимальным простоем.
Как отвечать
- физическая потоковая (streaming): реплика получает WAL и воспроизводит его, это блочная копия всего кластера. Реплика доступна только на чтение, мажорная версия и архитектура должны совпадать. Поднимается через
pg_basebackup,primary_conninfoи файлstandby.signal, синхронный режим включаетsynchronous_standby_names; - логическая: требует
wal_level = logical, на источникеCREATE PUBLICATION, на приёмникеCREATE SUBSCRIPTION. Передаются изменения строк выбранных таблиц, приёмник остаётся обычной базой, в которую можно писать, и может быть другой мажорной версии.
Отсюда сценарии. Streaming берут для отказоустойчивости и разгрузки чтения, с Patroni для автоматического переключения. Логическую берут для мажорного обновления почти без простоя, переноса части данных в другой сервис и выгрузки изменений в Kafka через Debezium.
Ограничения логической:
- DDL не реплицируется, схему на приёмнике создают и меняют сами;
- для
UPDATEиDELETEтаблице нужен первичный ключ или настроенныйREPLICA IDENTITY; - значения последовательностей не синхронизируются непрерывно, их выравнивают перед переключением, large objects не реплицируются;
- конфликт на приёмнике, например нарушение уникальности, останавливает применение до ручного вмешательства.
Где спотыкаются
Считают логическую репликацию заменой физической для отказоустойчивости. Приёмник не знает про DDL и последовательности, и после переключения на него вылезут расхождения.
Забывают про неактивные слоты. Слот держит WAL, пока подписчик его не прочитает, и отвалившийся приёмник может заполнить диск основного сервера. Помогают мониторинг pg_replication_slots и параметр max_slot_wal_keep_size.
Требуют для streaming полностью одинаковых версий. Совпадать должна мажорная, минорные могут различаться, и реплики обновляют первыми.