Подробности воспроизведения журнала подчиненного сервера Postgres

Postgres поддерживает репликацию главного ведомого через файлы WAL(Write Ahead Log).

На главном сервере внутренний процесс называется WALSender отправит файлы журнала (записи) на подчиненный сервер, а на подчиненном сервере - внутренний процесс, называемый WALReceiver получит файлы журнала (записи), а данные блока вместо запросов SQL будут храниться в файлах WAL. (я прав??)

Тогда как подчиненный сервер применяет обновления журналов в случаях репликации на основе файлов и потоковой репликации? Я имею в виду подробно, какой процесс это обрабатывает и как он это делает?

Заранее спасибо.

1 ответ

Решение

Ваше описание - разумное резюме, да. Есть примерно три уровня:

  • SQL-запросы высокого уровня, такие как "UPDATE mytable SET a=nextval('some_sequence'), b=current_timestamp WHERE id=$1"

  • изменения логической строки, например, "в таблице abc со значением первичного ключа id=42 кортеж обновлен до нового значения (a=11, b=12314234321)". Они не записаны на диске в этой форме, но являются промежуточной стадией, производимой внутри исполнителя, которая затем превращается в:

  • изменения уровня блока записываются в xlog, а затем в кучу, например: "в связи с relfilenode 12312.1 в dboid 9191, хранящемся в табличном пространстве 1, смещение байта блока 41231 0x0012 изменено на 0xde 0xad 0xbe 0xef 0x01"

(все номера полностью составлены)

Репликация на основе WAL происходит на самом низком уровне, блок записи изменяется на файлы в базе данных. Хорошо, так что это не так просто, но это поможет понять репликацию.

На автономном мастере выполняется SQL, производящий изменения строк, которые записываются в WAL и shared_buffers, Затем WAL воспроизводится, чтобы применить изменения к куче базы данных. (Опять же, это не так просто из-за грязной обратной записи со стороны bgwriter и т. Д., Но это пока подойдет).

При репликации на основе WAL мастер сохраняет WAL- отправляет его в реплики или архивирует его. Реплики вместо того, чтобы создавать собственный WAL, а затем воспроизводить его, просто воспроизводят WAL с главного устройства в другом месте, используя его для обновления кучи базы данных и их shared_buffers,

Тогда как подчиненный сервер применяет обновления журнала в обоих случаях репликации на основе файлов

Реплика запускает restore_command запросить следующий архив WAL, когда он достигнет конца предыдущего архива. Затем процесс восстановления начинает чтение архива WAL, обрабатывая его по записи.

Посмотрите, как restore_command используется в источнике, чтобы увидеть, как он вызывается.

а потоковая репликация?

Walreceiver реплики подключается к Walsender вверх по течению и получает записи Wal. Они записываются в файл, который затем читает процесс восстановления.

Часть восстановления одинакова в обоих случаях, разница только в том, как WAL принимается от восходящего потока. Восстановление также очень похоже на восстановление после сбоя на главном компьютере; это просто повторяет WAL тоже.

Я имею в виду подробно, какой процесс это обрабатывает и как он это делает?

Лучшая ссылка на это - исходный код, а именно комментарии и файлы README.

Я настоятельно рекомендую вам использовать pg_xlogdump чтобы увидеть, что на самом деле содержит WAL. Затем прочитайте документацию для соответствующих записей WAL, чтобы понять, что делает каждый тип записи.

Также начните с чтения src/backend/access/transam/README а также src/backend/access/transam/xlog.c,

Я не собираюсь повторять то, что уже есть в соответствующих файлах README, которые, скорее всего, будут точнее, чем мое описание.

Другие вопросы по тегам