25.2. Резервные серверы для журналирования передачи#
25.2. Резервные серверы для журналирования передачи #
- 25.2.1. Планирование
- 25.2.2. Операция резервного сервера
- 25.2.3. Подготовка основного сервера для резервных серверов
- 25.2.4. Настройка резервного сервера
- 25.2.5. Потоковая репликация
- 25.2.6. Слоты репликации
- 25.2.7. Каскадная репликация
- 25.2.8. Синхронная репликация
- 25.2.9. Непрерывное архивирование в режиме ожидания
Непрерывная архивация может использоваться для создания конфигурации кластера с высокой доступностью (HA) с одним или несколькими резервными серверами, готовыми взять на себя операции, если основной сервер выходит из строя. Эта возможность широко известна как теплый резерв или отгрузка журналов.
Основной и резервный серверы работают вместе, чтобы обеспечить эту возможность, хотя серверы связаны не очень тесно. Основной сервер работает в режиме непрерывной архивации, в то время как каждый резервный сервер работает в режиме непрерывного восстановления, считывая WAL-файлы с основного сервера. Для включения этой возможности не требуется внесение изменений в таблицы базы данных, поэтому она имеет низкую административную нагрузку по сравнению с некоторыми другими решениями репликации. Эта конфигурация также имеет относительно низкое влияние на производительность основного сервера.
Перемещение записей WAL непосредственно с одного сервера баз данных на другой обычно описывается как логическое копирование. Tantor BE реализует логическое копирование на основе файлов путем передачи записей WAL одним файлом (сегментом WAL) за раз. Файлы WAL (16 МБ) могут быть легко и недорого переданы на любое расстояние, будь то смежная система, другая система на том же сайте или другая система на другом конце земного шара. Пропускная способность, необходимая для этой техники, варьируется в зависимости от скорости транзакций на основном сервере. Логическое копирование на основе записей более детализировано и потоково передает изменения WAL по сетевому соединению (см. Раздел 25.2.5).
Следует отметить, что логическая репликация является асинхронной, то есть WAL-записи отправляются после метки транзакции. В результате, при катастрофическом сбое основного сервера может возникнуть потеря данных; транзакции, еще не отправленные, будут потеряны. Размер окна потери данных при репликации на основе файлов можно ограничить с помощью параметра archive_timeout
, который может быть установлен на очень низкое значение, даже несколько секунд. Однако такая низкая настройка значительно увеличит пропускную способность, необходимую для передачи файлов. Потоковая репликация (см. Раздел 25.2.5) позволяет сократить окно потери данных до минимума.
Восстановление производительности достаточно хорошее, что резервный сервер обычно находится на полной готовности всего в нескольких моментах после активации. В результате этого, такая конфигурация называется горячим резервным сервером, который обеспечивает высокую доступность. Восстановление сервера из архивной базовой резервной копии и последующее восстановление займет значительно больше времени, поэтому эта техника предлагает решение только для восстановления после катастрофы, а не для обеспечения высокой доступности. Резервный сервер также может использоваться для выполнения запросов только на чтение, в этом случае он называется горячим резервным сервером. См. Раздел 25.4 для получения дополнительной информации.
25.2.1. Планирование #
Обычно рекомендуется создавать основной и резервный серверы таким образом, чтобы они были максимально похожи, по крайней мере с точки зрения сервера баз данных. В частности, имена путей, связанные с табличными пространствами, будут переданы без изменений, поэтому как основной, так и резервный серверы должны иметь одинаковые пути монтирования для табличных пространств, если используется данная функция. Имейте в виду, что если на основном сервере выполняется команда CREATE TABLESPACE, то необходимо создать новую точку монтирования на основном и всех резервных серверах перед выполнением этой команды. Аппаратное обеспечение не обязательно должно быть точно таким же, но опыт показывает, что поддерживать две идентичные системы проще, чем поддерживать две разные в течение срока службы приложения и системы. В любом случае аппаратная архитектура должна быть одинаковой - перенос, скажем, с 32-битной на 64-битную систему не будет работать.
Обычно, передача журналов между серверами, работающими на разных основных версиях Tantor BE, невозможна. Политика Глобальной группы разработки PostgreSQL состоит в том, чтобы не вносить изменения в форматы диска во время обновления минорных версий, поэтому вероятно, что работа с разными минорными версиями на основном и резервном серверах будет успешной. Однако, формальная поддержка этого не предоставляется, и вам рекомендуется держать основные и резервные серверы на одном уровне версии насколько это возможно. При обновлении до новой минорной версии, наиболее безопасной политикой является обновление резервных серверов в первую очередь - новая минорная версия, скорее всего, сможет прочитать WAL-файлы из предыдущей минорной версии, чем наоборот.
25.2.2. Операция резервного сервера #
Сервер переходит в режим ожидания, если
standby.signal
файл существует в каталоге данных при запуске сервера.
В режиме ожидания сервер непрерывно применяет WAL, полученные от основного сервера. Резервный сервер может считывать WAL из архива WAL (см. restore_command) или непосредственно из основного сервера через TCP-соединение (потоковая репликация). Резервный сервер также попытается восстановить любой WAL, найденный в каталоге pg_wal
резервного кластера. Это обычно происходит после перезапуска сервера, когда резервный сервер повторно воспроизводит WAL, переданный с основного сервера перед перезапуском, но вы также можете вручную копировать файлы в pg_wal
в любое время, чтобы их воспроизвести.
При запуске резервный сервер начинает с восстановления всех доступных WAL из
архива, вызывая restore_command
. Как только он
достигает конца доступного там WAL и restore_command
не удается, он пытается восстановить любой доступный WAL из директории pg_wal
.
Если это не удается, и настроена потоковая репликация, резервный сервер
пытается подключиться к основному серверу и начать потоковую передачу WAL
с последней действительной записи, найденной в архиве или pg_wal
. Если это не удается
или потоковая репликация не настроена, или если соединение
позже разрывается, резервный сервер возвращается к шагу 1 и пытается
снова восстановить файл из архива. Этот цикл повторных попыток из
архива, pg_wal
и через потоковую репликацию продолжается до тех пор, пока сервер
не будет остановлен или повышен.
Режим ожидания завершается, и сервер переключается в нормальный режим
при запуске pg_ctl promote
или
вызове pg_promote()
. Перед переключением на резервный сервер
любой WAL, немедленно доступный в архиве или в pg_wal
,
будет восстановлен, но попыток подключиться к основному серверу не предпринимается.
25.2.3. Подготовка основного сервера для резервных серверов #
Настройте непрерывное архивирование на основном сервере в каталог архива, доступный со вторичного сервера, как описано в разделе Раздел 24.3. Местоположение архива должно быть доступно со вторичного сервера даже в случае отключения основного сервера, то есть оно должно находиться на самом вторичном сервере или на другом доверенном сервере, а не на основном сервере.
Если нужно использовать потоковую репликацию, настройте аутентификацию на
основном сервере для разрешения подключений репликации от резервного
сервера(-ов); то есть, создайте роль и предоставьте соответствующую запись или
записи в pg_hba.conf
с полем базы данных, установленным в
replication
. Также убедитесь, что max_wal_senders
установлен
на достаточно большое значение в файле конфигурации основного
сервера. Если будут использоваться слоты репликации,
также убедитесь, что max_replication_slots
установлен на
достаточно высокое значение.
Сделайте базовую резервную копию, как описано в Раздел 24.3.2, чтобы настроить резервный сервер.
25.2.4. Настройка резервного сервера #
Для настройки резервного сервера восстановите базовую резервную копию, взятую с основного сервера (см. Раздел 24.3.4). Создайте файл
standby.signal
в каталоге данных кластера резервного сервера. Установите restore_command в простую команду для копирования файлов из архива WAL. Если вы планируете использовать несколько резервных серверов для обеспечения высокой доступности, убедитесь, что recovery_target_timeline
установлено в latest
(по умолчанию), чтобы резервный сервер следовал изменению временной шкалы, которое происходит при переключении на другой резервный сервер.
Примечание
restore_command должно немедленно вернуться, если файл не существует; сервер повторит команду снова, если необходимо.
Если нужно использовать потоковую репликацию, заполните primary_conninfo строкой подключения libpq, включая имя хоста (или IP-адрес) и любые дополнительные данные, необходимые для подключения к основному серверу. Если для аутентификации требуется пароль для основного сервера, пароль также должен быть указан в primary_conninfo.
Если вы настраиваете резервный сервер для обеспечения высокой доступности, настройте архивирование WAL, соединения и аутентификацию так же, как на основном сервере, потому что резервный сервер будет работать как основной сервер после сбоя.
Если вы используете архив WAL, его размер можно уменьшить с помощью параметра archive_cleanup_command, который удаляет файлы, которые больше не требуются серверу-резервной копии.
Утилита pg_archivecleanup предназначена специально для использования с archive_cleanup_command
в типичных конфигурациях с одним резервным сервером, см. pg_archivecleanup.
Однако обратите внимание, что если вы используете архив для резервного копирования, необходимо сохранить файлы, необходимые для восстановления хотя бы последней базовой копии, даже если они больше не нужны резервному серверу.
Простой пример конфигурации:
primary_conninfo = 'host=192.168.1.50 port=5432 user=foo password=foopass options=''-c wal_sender_timeout=5000''' restore_command = 'cp /path/to/archive/%f %p' archive_cleanup_command = 'pg_archivecleanup /path/to/archive %r'
Вы можете иметь любое количество резервных серверов, но если вы используете потоковую репликацию, убедитесь, что вы установили max_wal_senders
достаточно высоким на основном сервере, чтобы позволить им быть подключенными одновременно.
25.2.5. Потоковая репликация #
Потоковая репликация позволяет резервному серверу быть более актуальным, чем это возможно с помощью передачи журналов на основе файлов. Резервный сервер подключается к основному серверу, который передает записи WAL на резервный сервер по мере их генерации, без ожидания заполнения файла журнала предзаписи.
Воспроизведение потока данных по умолчанию асинхронно (см. Раздел 25.2.8), в этом случае есть небольшая задержка между коммитом транзакции на основном сервере и появлением изменений на резервном сервере. Однако эта задержка намного меньше, чем при передаче журналов на основе файлов и обычно составляет менее одной секунды, если резервный сервер достаточно мощный для обработки нагрузки. При использовании воспроизведения потока данных, archive_timeout
не требуется для сокращения окна потери данных.
Если вы используете потоковую репликацию без непрерывного архивирования на основе файлов, сервер может перерабатывать старые сегменты WAL до того, как они будут получены стендбаем. Если это происходит, стендбай должен быть повторно инициализирован с новым базовым резервным копированием. Вы можете избежать этого, установив значение wal_keep_size
достаточно большим, чтобы гарантировать, что сегменты WAL не будут перерабатываться слишком рано, или настроив слот репликации для стендбая. Если вы настроили архив WAL, доступный из стендбая, эти решения не требуются, поскольку стендбай всегда может использовать архив для догоняния, при условии, что он сохраняет достаточное количество сегментов.
Для использования потоковой репликации настройте резервный сервер с доставкой журналов на основе файлов, как описано в разделе Раздел 25.2. Шагом, превращающим резервный сервер с доставкой журналов на основе файлов в резервный сервер с потоковой репликацией, является установка параметра primary_conninfo
для указания на основной сервер. На основном сервере установите параметры listen_addresses и параметры аутентификации (см. файл pg_hba.conf
), чтобы резервный сервер мог подключиться к псевдо-базе данных replication
на основном сервере (см. раздел Раздел 25.2.5.1).
На системах, которые поддерживают опцию сокета keepalive, установка параметров tcp_keepalives_idle, tcp_keepalives_interval и tcp_keepalives_count помогает основному серверу быстро обнаружить разорванное соединение.
Установите максимальное количество одновременных соединений от резервных серверов (см. max_wal_senders для получения подробной информации).
Когда резервный сервер запускается и primary_conninfo
установлен
правильно, резервный сервер подключится к основному серверу после воспроизведения всех
доступных WAL-файлов в архиве. Если подключение установлено
успешно, вы увидите процесс walreceiver
на резервном сервере и
соответствующий процесс walsender
на основном сервере.
25.2.5.1. Аутентификация #
Очень важно настроить привилегии доступа для репликации таким образом, чтобы только доверенные пользователи могли читать поток WAL, поскольку из него легко извлечь привилегированную информацию. Резервные серверы должны аутентифицироваться на основном сервере от имени учетной записи, имеющей привилегию REPLICATION
или суперпользователя. Рекомендуется создать отдельную учетную запись пользователя с привилегиями REPLICATION
и LOGIN
для репликации. Хотя привилегия REPLICATION
предоставляет очень высокие разрешения, она не позволяет пользователю изменять данные на основной системе, что позволяет привилегия SUPERUSER
.
Аутентификация клиента для репликации контролируется записью pg_hba.conf
, в которой указывается replication
в поле database
. Например, если резервный сервер работает на хосте с IP-адресом 192.168.1.100
, а имя учетной записи для репликации - foo
, администратор может добавить следующую строку в файл pg_hba.conf
на основном сервере:
# Allow the user "foo" from host 192.168.1.100 to connect to the primary # as a replication standby if the user's password is correctly supplied. # # TYPE DATABASE USER ADDRESS METHOD host replication foo 192.168.1.100/32 md5
Имя хоста и номер порта основного сервера, имя пользователя подключения и пароль указываются в primary_conninfo. Пароль также может быть установлен в файле ~/.pgpass
на резервном сервере (указывается replication
в поле database
). Например, если основной сервер работает на хосте с IP-адресом 192.168.1.50
, портом 5432
, имя учетной записи для репликации - foo
, а пароль - foopass
, администратор может добавить следующую строку в файл postgresql.conf
на резервном сервере:
# The standby connects to the primary that is running on host 192.168.1.50 # and port 5432 as the user "foo" whose password is "foopass". primary_conninfo = 'host=192.168.1.50 port=5432 user=foo password=foopass'
25.2.5.2. Мониторинг #
Важным показателем состояния потоковой репликации является количество записей WAL, сгенерированных на основном сервере, но еще не примененных на резервном сервере. Эту задержку можно рассчитать, сравнивая текущую позицию записи WAL на основном сервере с последней полученной позицией записи WAL на резервном сервере. Эти позиции можно получить с помощью функции pg_current_wal_lsn
на основном сервере и функции pg_last_wal_receive_lsn
на резервном сервере (см. разделы Таблица 9.91 и Таблица 9.92 для получения подробной информации).
Последняя полученная позиция записи WAL на резервном сервере также отображается в статусе процесса приемника WAL, который можно просмотреть с помощью команды ps
(см. раздел Раздел 26.1 для получения подробной информации).
Вы можете получить список процессов отправки WAL с помощью представления pg_stat_replication
. Большие различия между функцией pg_current_wal_lsn
и полем sent_lsn
представления могут указывать на то, что основной сервер перегружен, в то время как различия между полем sent_lsn
и функцией pg_last_wal_receive_lsn
на резервном сервере могут указывать на задержку в сети или на то, что резервный сервер перегружен.
На горячем резервном сервере статус процесса приемника WAL можно получить через представление pg_stat_wal_receiver
. Большая разница между функцией pg_last_wal_replay_lsn
и значением flushed_lsn
представления указывает на то, что WAL принимается быстрее, чем может быть воспроизведено.
25.2.6. Слоты репликации #
Репликационные слоты обеспечивают автоматический способ гарантировать, что основной сервер не удаляет сегменты WAL, пока они не будут получены всеми резервными серверами, и что основной сервер не удаляет строки, которые могут вызвать конфликт восстановления, даже когда резервный сервер отключен.
Вместо использования слотов репликации можно предотвратить удаление старых сегментов WAL с помощью параметра wal_keep_size, или сохранить сегменты в архиве с помощью команды archive_command или библиотеки archive_library. Однако эти методы часто приводят к сохранению большего количества сегментов WAL, чем требуется, в то время как слоты репликации сохраняют только известное количество сегментов. С другой стороны, слоты репликации могут сохранять так много сегментов WAL, что они заполняют выделенное пространство для pg_wal
; параметр max_slot_wal_keep_size ограничивает размер сохраняемых слотами репликации файлов журнала предзаписи.
Аналогично, hot_standby_feedback сам по себе, без использования слота репликации, обеспечивает защиту от удаления соответствующих строк с помощью vacuum, но не обеспечивает защиту в течение любого периода времени, когда резервный сервер не подключен. Слоты репликации преодолевают эти недостатки.
25.2.6.1. Запросы и манипуляции слотами репликации #
Каждый слот репликации имеет имя, которое может содержать строчные буквы, цифры и символ подчеркивания.
Все существующие слоты репликации и их состояние можно увидеть в представлении pg_replication_slots
.
Воспользуйтесь протоколом потоковой репликации (см. Раздел 52.4) или SQL-функциями (см. Раздел 9.27.6) для создания и удаления слотов.
25.2.6.2. Пример конфигурации #
Вы можете создать слот репликации следующим образом:
postgres=# SELECT * FROM pg_create_physical_replication_slot('node_a_slot'); slot_name | lsn -------------+----- node_a_slot | postgres=# SELECT slot_name, slot_type, active FROM pg_replication_slots; slot_name | slot_type | active -------------+-----------+-------- node_a_slot | physical | f (1 row)
Для настройки резервной копии для использования этого слота, primary_slot_name
должен быть настроен на резервной копии. Вот простой пример:
primary_conninfo = 'host=192.168.1.50 port=5432 user=foo password=foopass' primary_slot_name = 'node_a_slot'
25.2.7. Каскадная репликация #
Функция каскадной репликации позволяет резервному серверу принимать соединения для репликации и передавать записи WAL другим резервным серверам, действуя как ретранслятор. Это может быть использовано для сокращения количества прямых соединений с основным сервером и также для минимизации издержек на межсайтовую пропускную способность.
Стендбай, который действует как получатель и отправитель одновременно, называется каскадным стендбаем. Стендбаи, которые более прямо связаны с основным сервером, называются восходящими серверами, тогда как те стендбаи, которые находятся дальше, называются нисходящими серверами. Каскадная репликация не накладывает ограничений на количество или расположение нисходящих серверов, хотя каждый стендбай подключается только к одному восходящему серверу, который в конечном итоге связывается с одним основным сервером.
Каскадный резервный сервер отправляет не только записи WAL, полученные от основного сервера, но и те, которые были восстановлены из архива. Таким образом, даже если соединение репликации с каким-либо сервером выше в иерархии прерывается, потоковая репликация продолжается вниз по цепочке, пока имеются новые записи WAL.
В настоящее время каскадная репликация является асинхронной. Настройки синхронной репликации (см. Раздел 25.2.8) в настоящее время не влияют на каскадную репликацию.
Горячая резервная связь передается вверх по цепочке, независимо от каскадного расположения.
Если восходящий резервный сервер будет повышен до нового основного, нижестоящие серверы будут продолжать потоковую передачу данных с нового основного, если значение recovery_target_timeline
установлено на 'latest'
(по умолчанию).
Для использования каскадной репликации настройте каскадный резервный сервер так, чтобы он мог принимать соединения для репликации (то есть установите параметры max_wal_senders и hot_standby, а также настройте аутентификацию на основе хоста). Вам также потребуется установить primary_conninfo
на резервном сервере нижнего уровня, чтобы он указывал на каскадный резервный сервер.
25.2.8. Синхронная репликация #
Tantor BE потоковая репликация по умолчанию асинхронная. Если основной сервер выйдет из строя, то некоторые транзакции, которые были подтверждены, могут не быть тиражированы на резервный сервер, что приведет к потере данных. Величина потери данных пропорциональна задержке репликации на момент переключения.
Синхронная репликация предлагает возможность коммита того, что все изменения, внесенные транзакцией, были переданы одному или нескольким синхронным резервным серверам. Это расширяет стандартный уровень надежности, предлагаемый коммитом транзакции. Этот уровень защиты называется "2-надежной репликацией" в теории компьютерных наук и "групповой-1-надежной" (групповой-надежной и 1-надежной), когда synchronous_commit
установлен в remote_write
.
Когда запрашивается синхронная репликация, каждый коммит записи транзакции будет ожидать коммита о том, что коммит был записана в журнал предварительной записи на диске как на основном, так и на резервном сервере. Единственная возможность потери данных возникает, если и основной, и резервный серверы выйдут из строя одновременно. Это может обеспечить гораздо более высокий уровень надежности, но только если системный администратор осторожно размещает и управляет двумя серверами. Ожидание коммита увеличивает уверенность пользователя в том, что изменения не будут потеряны в случае сбоев сервера, но также неизбежно увеличивает время ответа для запрашивающей транзакции. Минимальное время ожидания - это время прохождения сообщения между основным и резервным серверами.
Транзакции только для чтения и откаты транзакций не требуют ожидания ответов от резервных серверов. коммиты подтранзакций не ожидают ответов от резервных серверов, в отличие от коммитов верхнего уровня. Длительные операции, такие как загрузка данных или построение индексов, не ожидают окончательного сообщения о коммите. Все действия двухфазного коммита требуют ожидания коммита, включая подготовку и коммит.
Синхронный резервный сервер может быть физическим резервным сервером или логическим подписчиком репликации. Он также может быть любым другим потребителем потока физической или логической репликации WAL, который знает, как отправлять соответствующие сообщения обратной связи. Помимо встроенных систем физической и логической репликации, это включает специальные программы, такие как pg_receivewal
и pg_recvlogical
, а также некоторые сторонние системы репликации и пользовательские программы. Проверьте соответствующую документацию для получения подробной информации о поддержке синхронной репликации.
25.2.8.1. Основная конфигурация #
После настройки потоковой репликации, настройка синхронной репликации требует только одного дополнительного шага конфигурации: synchronous_standby_names должно быть установлено в непустое значение. synchronous_commit
также должно быть установлено в on
, но поскольку это значение по умолчанию, обычно не требуется никаких изменений. (См. Раздел 18.5.1 и Раздел 18.6.2). Эта конфигурация заставит каждый коммит ждать коммита о том, что резервная копия записала коммит в надежное хранилище. synchronous_commit
может быть установлено отдельными пользователями, поэтому его можно настроить в файле конфигурации для конкретных пользователей или баз данных, а также динамически приложениями, чтобы контролировать гарантию сохранности на уровне каждой транзакции.
После записи записи коммита на диск на основном сервере, WAL-запись затем отправляется на резервный сервер. Резервный сервер отправляет ответные сообщения каждый раз, когда новая порция данных WAL записывается на диск, если параметр wal_receiver_status_interval
на резервном сервере не установлен в ноль. В случае, если параметр synchronous_commit
установлен в remote_apply
, резервный сервер отправляет ответные сообщения, когда запись коммита воспроизводится, делая транзакцию видимой. Если резервный сервер выбран в качестве синхронного резервного сервера в соответствии с настройкой synchronous_standby_names
на основном сервере, ответные сообщения от этого резервного сервера будут учитываться вместе с ответными сообщениями от других синхронных резервных серверов для принятия решения о том, когда освободить транзакции, ожидающие коммита о получении записи коммита. Эти параметры позволяют администратору указать, какие серверы резервного копирования должны быть синхронными резервными серверами. Обратите внимание, что конфигурация синхронной репликации в основном осуществляется на основном сервере. Именованные резервные серверы должны быть прямо подключены к основному серверу; основной сервер ничего не знает о резервных серверах нижнего уровня, использующих каскадную репликацию.
Установка параметра synchronous_commit
в значение remote_write
приведет к тому, что каждый коммит будет ожидать коммита о том, что реплика получила запись о коммите и записала ее в свою операционную систему, но не будет ожидать записи данных на диск на реплике. Этот параметр обеспечивает более слабую гарантию надежности, чем параметр on
: в случае сбоя операционной системы реплики данные могут быть потеряны, но не будет потерян сам Tantor BE. Однако, на практике этот параметр полезен, так как он может сократить время отклика для транзакции. Потеря данных возможна только в случае сбоя как на основном сервере, так и на реплике, и одновременной коррупции базы данных на основном сервере.
Установка значения synchronous_commit
в remote_apply
приведет к тому, что каждый коммит будет ожидать, пока текущие синхронные реплики не сообщат о воспроизведении транзакции, что делает ее видимой для пользовательских запросов. В простых случаях это позволяет балансировать нагрузку с причинной согласованностью.
Пользователи перестанут ждать, если будет запрошено быстрое завершение работы. Однако, как и при использовании асинхронной репликации, сервер не будет полностью завершать работу, пока все незавершенные записи WAL не будут переданы текущим подключенным резервным серверам.
25.2.8.2. Несколько синхронных стендбаев #
Синхронная репликация поддерживает один или несколько синхронных резервных серверов; транзакции будут ожидать, пока все резервные серверы, которые считаются синхронными, не подтвердят получение своих данных. Количество синхронных резервных серверов, от которых транзакции должны ожидать ответа, указывается в параметре synchronous_standby_names
. Этот параметр также указывает список имен резервных серверов и метод (FIRST
и ANY
), для выбора синхронных резервных серверов из перечисленных.
Метод FIRST
определяет приоритетную синхронную репликацию и заставляет фиксировать транзакции, ожидая, пока их записи WAL будут тиражированы на запрошенное количество синхронных резервных серверов, выбранных на основе их приоритетов. Резервные серверы, имена которых появляются раньше в списке, имеют более высокий приоритет и считаются синхронными. Другие резервные серверы, появляющиеся позже в этом списке, представляют потенциальные синхронные резервные серверы. Если какой-либо из текущих синхронных резервных серверов отключается по любой причине, он будет немедленно заменен следующим резервным сервером с более высоким приоритетом.
Пример synchronous_standby_names
для множественных синхронных резервных копий на основе приоритета:
synchronous_standby_names = 'FIRST 2 (s1, s2, s3)'
В этом примере, если четыре сервера-резервные s1
, s2
,
s3
и s4
работают, два резервных сервера
s1
и s2
будут выбраны в качестве синхронных резервных серверов,
потому что их имена появляются раньше в списке имен резервных серверов.
s3
является потенциальным синхронным резервным сервером и возьмет на себя
роль синхронного резервного сервера, когда один из серверов s1
или
s2
выйдет из строя. s4
является асинхронным резервным сервером, так как
его имя не находится в списке.
Метод ANY
определяет синхронную репликацию на основе кворума и заставляет фиксировать транзакции, пока их записи WAL не будут тиражированы как минимум на запрошенное количество синхронных резервных узлов из списка.
Пример synchronous_standby_names
для множественных синхронных резервных копий на основе кворума:
synchronous_standby_names = 'ANY 2 (s1, s2, s3)'
В этом примере, если работают четыре сервера резервного копирования s1
, s2
,
s3
и s4
, коммит транзакций будет ожидать ответов от как минимум двух серверов резервного копирования из списка s1
,
s2
и s3
. s4
является асинхронным
сервером резервного копирования, так как его имя не входит в список.
Состояние синхронизации резервных серверов можно просмотреть с помощью представления pg_stat_replication
.
25.2.8.3. Планирование для повышения производительности #
Синхронная репликация обычно требует тщательно спланированных и размещенных резервных серверов, чтобы гарантировать приемлемую производительность приложений. Ожидание не использует системные ресурсы, но блокировки транзакций продолжают действовать до подтверждения передачи. В результате, небрежное использование синхронной репликации приведет к снижению производительности баз данных из-за увеличения времени отклика и повышенной конкуренции.
Tantor BE позволяет разработчику приложений указывать требуемый уровень надежности с помощью репликации. Это можно указать для всей системы в целом, а также для конкретных пользователей, соединений или даже отдельных транзакций.
Например, рабочая нагрузка приложения может состоять из: 10% изменений, касающихся важных данных клиента, в то время как 90% изменений относятся к менее важным данным, которые бизнес может более легко восстановить, если они потеряются, например, чат-сообщения между пользователями.
С указанными на уровне приложения параметрами синхронной репликации (на основном сервере) можно предложить синхронную репликацию для наиболее важных изменений, не замедляя основную часть общей нагрузки. Параметры на уровне приложения являются важным и практичным инструментом для обеспечения преимуществ синхронной репликации для высокопроизводительных приложений.
Необходимо учитывать, что пропускная способность сети должна быть выше скорости генерации данных WAL.
25.2.8.4. Планирование для обеспечения высокой доступности #
synchronous_standby_names
указывает количество и
имена синхронных резервных серверов, от которых будут ожидаться ответы при фиксации транзакций,
когда synchronous_commit
установлен в on
,
remote_apply
или remote_write
. Такие фиксации транзакций могут никогда не завершиться,
если любой из синхронных резервных серверов выйдет из строя.
Лучшим решением для обеспечения высокой доступности является сохранение необходимого количества синхронных резервных копий. Это можно достичь, указав несколько потенциальных синхронных резервных копий с помощью synchronous_standby_names
.
В приоритетной синхронной репликации, стендбаи, имена которых появляются раньше в списке, будут использоваться в качестве синхронных стендбаев. Стендбаи, перечисленные после них, возьмут на себя роль синхронного стендбая, если один из текущих стендбаев откажет.
В кворумной синхронной репликации все резервные копии, указанные в списке, будут использоваться в качестве кандидатов для синхронных резервных копий. Даже если одна из них откажет, другие резервные копии продолжат выполнять роль кандидатов для синхронной резервной копии.
Когда резервный экземпляр впервые подключается к основному, он еще не будет полностью синхронизирован. Это описывается как режим catchup
. Как только задержка между резервным экземпляром и основным достигает нуля впервые, мы переходим в режим реального времени streaming
. Продолжительность catch-up может быть длительной сразу после создания резервного экземпляра. Если резервный экземпляр выключен, то период catch-up увеличится в соответствии с продолжительностью времени, в течение которого резервный экземпляр был выключен. Резервный экземпляр может стать синхронным резервным экземпляром только после достижения состояния streaming
. Это состояние можно просмотреть с помощью представления pg_stat_replication
.
Если основной сервер перезапускается во время ожидания коммита коммита, ожидающие транзакции будут помечены как полностью подтвержденные, как только основной сервер восстановится. Нет способа быть уверенным, что все резервные серверы получили все незавершенные данные WAL на момент сбоя основного сервера. Некоторые транзакции могут не отображаться как подтвержденные на резервном сервере, даже если они отображаются как подтвержденные на основном сервере. Гарантия, которую мы предлагаем, заключается в том, что приложение не получит явного коммита успешного коммита транзакции, пока данные WAL не будут известно получены всеми синхронными резервными серверами.
Если вы действительно не можете сохранить столько синхронных резервных копий, сколько запрошено, то вам следует уменьшить количество синхронных резервных копий, ожидание ответов от которых должны ждать коммиты транзакций, в synchronous_standby_names
(или отключить его) и перезагрузить файл конфигурации на основном сервере.
Если первичный сервер отделен от остальных резервных серверов, вы должны переключиться на наилучшего кандидата из оставшихся резервных серверов.
Если вам нужно повторно создать резервный сервер во время ожидания транзакций, убедитесь, что команды pg_backup_start() и pg_backup_stop() выполняются в сессии с synchronous_commit
= off
, иначе эти запросы будут бесконечно ожидать появления резервного сервера.
25.2.9. Непрерывное архивирование в режиме ожидания #
Когда используется непрерывная архивация WAL на резервном сервере, существуют два различных сценария: архив WAL может быть общим для основного сервера и резервного сервера, или резервный сервер может иметь свой собственный архив WAL. Когда у резервного сервера есть свой собственный архив WAL, установите archive_mode
в always
, и резервный сервер будет вызывать команду архивации для каждого полученного сегмента WAL, будь то восстановление из архива или потоковая репликация. Общий архив может быть обработан аналогичным образом, но команда archive_command
или archive_library
должна проверять, существует ли уже архивируемый файл, и если существующий файл имеет идентичное содержимое. Это требует более тщательного подхода в команде archive_command
или archive_library
, так как она должна быть осторожна, чтобы не перезаписать существующий файл с другим содержимым, но вернуть успех, если точно такой же файл архивируется дважды. И все это должно быть выполнено без гонок, если два сервера пытаются архивировать один и тот же файл одновременно.
Если параметр archive_mode
установлен в значение on
, то архиватор не будет работать в режиме восстановления или режиме ожидания. Если резервный сервер будет повышен до основного, то после этого он начнет архивирование, но не будет архивировать WAL-файлы или файлы истории таймлайна, которые не были сгенерированы им самим. Чтобы получить полный набор WAL-файлов в архиве, необходимо убедиться, что все WAL-файлы архивируются до того, как они достигнут резервного сервера. Это справедливо для логической репликации на основе файлов, так как резервный сервер может восстановить только те файлы, которые находятся в архиве, но не справедливо для потоковой репликации. Когда сервер не находится в режиме восстановления, нет разницы между режимами on
и always
.