8
Логическое декодирование
Переупорядочивающий буфер
wal sender читает журнальные записи и накапливает их в буфере,
раскладывая по транзакциям
буфер в локальной памяти; при необходимости сбрасывается на диск
Модуль вывода
получает накопленные записи при фиксации транзакции
декодирует записи, формируя сообщения об операциях
над табличными строками в платформо-независимом формате
фильтрует сообщения, на которые подписан получатель
Слот логической репликации
гарантирует, что подписка не пропустит изменения
Полезно представлять внутреннее устройство логической репликации.
Журнальные записи читаются процессом wal sender и раскладываются
по отдельным транзакциям в специальном буфере в оперативной
памяти. Это делается для того, чтобы при фиксации транзакции можно
было взять все изменения, сделанные именно этой транзакцией,
и передать их подписчику. При превышении определенного порога
буфер начинает сбрасываться на диск (в каталог PGDATA/pg_replslots).
Заметим, что при наличии нескольких подписчиков и, следовательно,
нескольких процессов wal sender, каждый из этих процессов будет
самостоятельно читать WAL: буфер, упорядочивающий записи,
находится в локальной памяти каждого процесса wal sender.
Когда транзакция фиксируется, ее изменения передаются модулю
вывода, который декодирует их и представляет в платформо-
независимом (текстовом) формате. Процесс wal sender передает эти
декодированные сообщения подписчику (если он на них подписан)
через слот логической репликации. Этот слот похож на обычный
репликационный слот, но к нему привязан модуль вывода.
В журнал на уровне logical дополнительно записывается информация,
необходимая для логического декодирования, в частности:
- новые значения всех столбцов для UPDATE, а не только измененных;
- старые значения столбцов, входящих в логический идентификатор,
для UPDATE и DELETE;
- OID базы данных для COMMIT.