Встроенная (нативная) репликация версий PostgreSQL 9 и старше, реализована с помощью журнала опережающей записи WAL - Write-Ahead Log, посредством пересылки XLOG-ов с главного сервера (master) на подчиненный (slave). При настроенной репликации на мастере и слейве запускаются процессы «postgres: wal sender process» и «postgres: wal receiver process», соответственно.
О времени отставания slave от master можно понять сопоставляя текущие позиции записей журнала Write-Ahead Log (WAL). Текущую позицию на мастере можно получить используя запрос pg_current_xlog_location. Принятую/примененную позицию на слейве можно получить используя запрос pg_last_xlog_receive_location/pg_last_xlog_replay_location.
Например:
На master сервере
$psql -c "select pg_current_xlog_location()" -h localhost -Uuser1 template1 pg_current_xlog_location -------------------------- 0/178BFF0 (1 row) |
На slave
$psql -c "select pg_last_xlog_replay_location()" -h localhost -Uuser1 template1 pg_last_xlog_replay_location ------------------------------ 0/178BFF0 (1 row) |
Для анализа, от полученных результатов нужно отрезать слэш и то, что до него, далее конвертировать из HEX в нормальное число — результатом будет некое абстрактное значение, критический порог которого будет индивидуален для каждого случая.
Пусть у нас имеется репликация с одним master сервером и тремя slave серверами. Рассмотрим как написать пробник проверки репликации для Nagios.
Master: 10.26.5.11
Slave: 10.26.5.12,10.26.5.13,10.26.5.14
#!/bin/sh #в переменную PGPASSWORD сохраним пароль к БД, т.к. у postgres нет опции подстановки пароля export PGPASSWORD='password' master_wal=`psql -c "SELECT pg_current_xlog_location()" -h 10.26.5.11 -Unagios template1 | grep '/' | awk -F "/" {'print $2'}` master=`echo "ibase=16; $master_wal" | bc` slave_wal1=`psql -c "SELECT pg_last_xlog_replay_location()" -h 10.26.5.12 -Unagios template1 | grep '/' | awk -F "/" {'print $2'}` slave1=`echo "ibase=16; $slave_wal1" | bc` slave_wal2=`psql -c "SELECT pg_last_xlog_replay_location()" -h 10.26.5.13 -Unagios template1 | grep '/' | awk -F "/" {'print $2'}` slave2=`echo "ibase=16; $slave_wal2" | bc` slave_wal3=`psql -c "SELECT pg_last_xlog_replay_location()" -h 10.26.5.14 -Unagios template1 | grep '/' | awk -F "/" {'print $2'}` slave3=`echo "ibase=16; $slave_wal3" | bc` export PGPASSWORD='' res_master_slave1=`echo "${master}-${slave1}" | bc` res_master_slave2=`echo "${master}-${slave2}" | bc` res_master_slave3=`echo "${master}-${slave3}" | bc` #проверим, что строка разницы значений позиция мастер-слейв не пустышка if test ! -z "$res_master_slave1" && test ! -z $res_master_slave2 && test ! -z $res_master_slave3; then if test $res_master_slave1 -gt '6200' || test $res_master_slave2 -gt '6200' || test $res_master_slave3 -gt '6200';then echo "Critical! Lag is 10.26.5.12=$res_master_slave1, 10.26.5.13=res_master_slave2, 10.26.5.14=$res_master_slave3" exit 2 fi if test $res_master_slave1 -gt '450' || test $res_master_slave2 -gt '450' || test $res_master_slave3 -gt '4500';then echo "Warning! Lag is 10.26.5.12=$res_master_slave1, 10.26.5.13=res_master_slave2, 10.26.5.14=$res_master_slave3" exit 1 fi echo "Replication is OK! " exit 0 else echo "Replicatio is CRITICAL! Error - check replication!" exit 2 fi |
Обновлено 05.04.2016 12:34