Я пытаюсь понять, как лучше всего использовать репликацию PostgreSQL и как она работает, чтобы я мог устранять неполадки в производственной среде.
Мне трудно понять различия между этими 2 типами репликации с точки зрения (1) Конфигурации (2) Как работают два сервера Master / Slave в каждом сценарии
Репликация на PostgreSQL (9.2+) - это, по сути, файлы XLOG размером 16 МБ (в зависимости от настроек частоты для создания каждого файла), которые создаются на Master и отправляются каким-либо способом на Slave.
Моя настройка (для целей этого вопроса)
Конфигурация Postgresql.conf на Master
архив_команда = 'rsync -av% p postgres @ [SlaveIP]: [wal_archive_folder] /% f'
Конфигурация Recovery.conf на
подчиненном устройстве для чтения файлов журнала
restore_command = 'cp [wal_archive_folder] /% f \ "% p \"'
primary_conninfo = 'host = [MasterIP] port = 5432 user = postgres'
Мой вопрос: какая часть этой конфигурации делает эту «потоковую» репликацию по сравнению с «доставкой журналов»? Мой мастер настроен на использование rsync для отправки журналов на подчиненное устройство (это доставка журналов?) Мой подчиненный настроен на возможность подключения к мастеру в recovery.conf (это потоковая передача?)
Вторая часть вопроса: что происходит? Я понимаю, что есть другой протокол на PostgreSQL через WAL_sender & WAL_receiver. Но мне не ясно, используется ли это только для потоковой передачи, и если да, то как Rsync используется в Master?
:) Спасибо!! И извините, если это очевидный вопрос. Я много читал блоги / книги, но с трудом понимал. Postgres wiki настолько глубока, что требуется много времени, чтобы пройти через все это (и у меня есть сроки)
Ответы:
«Потоковая репликация» относится к непрерывной отправке записей WAL по TCP / IP-соединению между ведущим и репликой с использованием протокола Walsender по
replication
соединениям. Мастер считывает свой собственный WALpg_xlog
и отправляет его в реплику по требованию. Он настроен с помощьюprimary_conninfo
директивы inrecovery.conf
иpg_hba.conf
записей на ведущем устройстве, чтобы разрешитьreplication
соединения. Вам также понадобятсяwal_keep_segments
и некоторые другие варианты, описанные в документах.«Доставка журналов» означает периодическую отправку записей WAL как целых архивов WAL по протоколу передачи файлов в местоположение архива, откуда реплика может затем извлечь их. Это настроено с
restore_command
директивой вrecovery.conf
иarchive_command
в мастере. PostgreSQL не волнует, где находятся файлы и как они передаются, только то, что они помещаютarchive_command
их туда иrestore_command
извлекают необходимый архив; это позволяет создавать такие системы, как PgBarman и WAL-E.Потоковая репликация не имеет такой большой задержки, поскольку записи отправляются по мере их генерации. Однако для этого требуется, чтобы и мастер, и реплика были подключены к сети и могли напрямую общаться. Также требуется, чтобы реплика поддерживалась достаточно хорошо, чтобы мастер по-прежнему имел на диске копии WAL, необходимые для реплики, и, как правило, требует, чтобы вы тратили дополнительное
pg_xlog
пространство на сохранение дополнительного WAL для реплики.Репликация доставки журналов имеет большую задержку, потому что реплика видит WAL только после отправки всего архива. Однако он может работать даже тогда, когда мастер и реплика не могут напрямую взаимодействовать по TCP / IP с использованием общего хранилища. Он продолжает работать, даже если реплика не работает некоторое время, потому что мастер отменит WAL
pg_xlog
только после его архивирования, поэтому WAL все еще находится в архиве и может использоваться репликой, даже если мастер не может отправить его потоковым больше. Обратите внимание, чтоarchive_command
никогда не сдается, поэтомуpg_xlog
может заполниться, если архивирование не удается; по этой причине лучше архивировать в надежное место, а затем получить сервер реплики из этого места.В общем, вы фактически комбинируете два, то есть используете оба. В этом случае потоковая репликация используется, когда все идет хорошо. Если реплика слишком сильно отстает, и мастер отбросил необходимые ей xlogs, возникнут проблемы с подключением и т. Д., То реплика переключится на чтение архивированной WAL, пока не будет захвачена. Он будет периодически повторять попытку возврата к потоковой передаче, пока это не удастся.
Если вы собираетесь использовать только один, используйте доставку журналов, потому что потоковая репликация без резервирования доставки журналов (до PostgreSQL 9.4) потенциально склонна к задержке репликации, вызывая сбои, которые вынуждают повторную сборку реплики.
PostgreSQL 9.4 немного меняет это, потому что потоковая репликация теперь может использовать «слоты репликации». Это позволяет мастеру отслеживать, сколько WAL нужно реплике, и избегать его выбрасывания, пока реплика не воспроизведет его. Так что больше нет необходимости,
wal_keep_segments
если вы используете слот репликации (не по умолчанию).Смотрите мою статью о слотах потоковой репликации в PostgreSQL 9.4 .
9.4 также представляет основы потоковой логической репликации , которая является еще одним механизмом, разработанным для использования системами логической репликации, такими как Londiste, Slony-I, и новой функцией двунаправленной асинхронной репликации с несколькими хозяевами .
источник
hot_standby
режиме. Кроме того, потоковая передача и доставка журналов используют WAL, это просто разные способы передачи. Вы можете и должны использовать доставку журналов для дополнения потоковой репликации. В целом, статья в порядке, но не особенно поучительна и немного устарела; официальные документы - лучший ресурс.synchronous_standby_names
параметр в непустое значение, например:standby_1
. Вы делаете это наprimary
сервере. Затем наstandby
сервере, изменитьprimary_conninfo
настройку, добавив ,application_name=standby_1
например:primary_conninfo = 'host=x port=y user=z application_name=standby_1'
. Это из postgresql.org/docs/9.6/static/warm-standby.html , раздел 26.2.8.