Вход на сайт
Яндекс.Метрика

Рейтинг@Mail.ru

Еще горстка материалов:

Мониторинг репликации PostgreSQL

Встроенная (нативная) репликация версий 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

unix-way