Предполагая, что у меня это есть горячая репликация сервера все настроено правильно, какие самые простые или наиболее удобные шаги я могу периодически предпринимать, чтобы убедиться, что горячая репликация сервера по-прежнему работает нормально и должным образом.
Я подумал о сравнении 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