4.8 KiB
aliases | tags | date | zero-link | parents | linked | |||||
---|---|---|---|---|---|---|---|---|---|---|
|
|
|
|
Тезисы
- Реализуется на основе журнала WAL.
- Репликация упирается в диск, а не в процессор.
- Реплика это точная бинарная копия мастера.
- Работает по push модели
- При физической репликации фильтрация не возможна
PostgreSQL реплика – это бинарная копия мастера. Т.е. буквально – если вы остановите запись на мастер, дадите репликации доехать до конца на слэйве, остановите процесс на мастере и слэйве и сделаете бинарное сравнение PostgreSQL-мастера и PostgreSQL-слэйва, вы увидите, что они одинаковы. Реплика получает WAL и просто меняют данные физически на указанные в WAL.
Добавление реплики требует остановки работы приложения, чтобы никакие записи не менялись в БД. Хотя, если данные пишутся не так часто, то новая реплика может просто догнать отставание в мастер, которое образуется за время подключения слейва.
Logical Log Streaming Replication – это способ трансформировать Write-Ahead Log. Например, мы не хотим реплицировать все таблицы из данной базы, а хотим реплицировать только часть. Logical Log Streaming Replication позволяет мастеру объяснить, что из таблиц будет уезжать на слэйв.
Logical Decoding – способ визуализировать то, что находится в PostgreSQL Write-Ahead Log. На самом деле, если мы можем напечатать в каком-то виде то, что у нас происходит на слэйве, точнее, что нам пришло через Write-Ahead Log, это значит, что мы можем программно реализовать все то, что делает libslave. Получили insert, update, delete, у нас “дернулся” нужный callback, мы узнали про изменения. Это и есть Logical Decoding.
Синхронизация
Async:
- synchronus_commit =
- off - не будет дожидаться даже локального подтверждения, нет гарантии что данные дошли до бд
- local - происходит локальный коммит и в этот же момент отправляется подтверждение
Sync/Semi-symc:
- synchronus_commit = remote_write / on / remote_apply
- remote_write - транзакция подтверждается только если получено подтверждение со всех реплик
- synchronus_standby_names = [FIRST / ANY] N (replicas_list)
- позволяет настроить от скольких реплик ожидается ответ
Логическая репликация
Конфликты:
- Нужно идентифицировать запись для update/delete (по первичному ключу/по уникальному ненуллабельному индексу/по всем столбцам).
- В случае возникновения конфликта требуется вручную исправить данные.