Назад | Перейти на главную страницу

Какой самый удобный способ убедиться, что горячая репликация PostgreSQL 9.x по-прежнему работает правильно?

Предполагая, что у меня это есть горячая репликация сервера все настроено правильно, какие самые простые или наиболее удобные шаги я могу периодически предпринимать, чтобы убедиться, что горячая репликация сервера по-прежнему работает нормально и должным образом.

Я подумал о сравнении SELECT txid_current_snapshot(); на обоих серверах. Достаточно ли это хорошо и безопасно, чтобы предположить, что репликация работает нормально, если 2 txidматч?

Вики PostgreSQL содержит эту информацию на своем страница о потоковой репликации:

Вы можете рассчитать задержку репликации, сравнив текущее расположение записи WAL на первичном сервере с последним расположением WAL, полученным / воспроизведенным резервным. Их можно получить с помощью pg_current_xlog_location на первичном и pg_last_xlog_receive_location / pg_last_xlog_replay_location в режиме ожидания соответственно.

В PostgreSQL версии 10 эти функции были переименованы в pg_current_wal_lsn, pg_last_wal_receive_lsn и pg_last_wal_replay_lsn, поэтому приведенные выше имена теперь действительны только для версий 9.6 и старше.

Эти функции возвращают строку вида id/offset где id и offset шестнадцатеричные числа. Чтобы преобразовать их в 64-битные числа для сравнения, вы можете использовать эту формулу, взятую из check_postgres Плагин Nagios:

0xff000000 * from_hex(id) + from_hex(offset)

В сценарии bash это можно сделать с помощью этой функции:

xlog_location_to_64bits()
{
  id="${1%%/*}"
  offset="${1##*/}"
  echo $((0xFF000000 * 0x$id + 0x$offset))
}

Вычитание значения на ведомом устройстве из значения на ведущем дает задержку репликации в байтах.

Для меня наиболее удобным способом будет то, что указано на шаг 12 этой страницы:

# The displayed LSNs indicate the byte position that the standby server has
# written up to in the xlogs.
[primary] $ ps -ef | grep sender
postgres  6879  6831  0 10:31 ?        00:00:00 postgres: wal sender process postgres    127.0.0.1(44663) streaming 0/2000000

[standby] $ ps -ef | grep receiver
postgres  6878  6872  1 10:31 ?        00:00:01 postgres: wal receiver process   streaming 0/2000000