5
марта
2

Мониторинг репликации в postgresql90-server



Встроенная репликация в PostgreSQL 9 реализована благодаря журналу опережающей записи (WAL — Write-Ahead Log) с помощью пересылки XLOG-ов с главного сервера на подчиненный. При настроенной репликации на мастере и слейве запускаются дополнительные процессы: «postgres: wal sender process» и «postgres: wal receiver process», соответственно.

Судить о времени отставания slave-сервера от master-сервера можно сопоставляя текущие позиции записей журнала WAL: текущей на мастере и принятой/примененной на слейве. Их можно получить используя pg_current_xlog_location и pg_last_xlog_receive_location/pg_last_xlog_replay_location, соответственно.

На главном сервере:

psql -c "SELECT pg_current_xlog_location()" -Upgsql postgres
<!--more-->pg_current_xlog_location
--------------------------
0/B8C45908
(1 row) 

На подчиненном:

psql -c "select pg_last_xlog_replay_location()" -Upgsql postgres
pg_last_xlog_replay_location
------------------------------
0/B8C45908
(1 row) 

Для анализа от полученных результатов нужно взять только шестнадцатиричное (HEX) значение, которое после слеша ‘/’ и перевести в десятичный (DEC) формат. Разница этих чисел даст некоторое значение от которого можно отталкиваться при подсчете отставания слейва от мастера. Для перевода HEX to DEC, т.е. шестнадцатиричного в десятичное число можно воспользоваться, к примеру, такими утилитами:

echo "ibase=16; FF"|bc
255
printf "%d\n" 0xff
255 

Пример скрипта для получения состояния репликации (можно использовать в системе мониторинга nagios):

#!/bin/sh
master_hex=`psql -c "SELECT pg_current_xlog_location()" -h masterhost.ua
-Upgsql postgres | grep '/' | awk -F "/" {'print $2'}`
master=`echo "ibase=16; $master_hex" | bc`
slave_hex=`psql -c "select pg_last_xlog_replay_location()" -h slavehost.ua
-Upgsql postgres | grep '/' | awk -F "/" {'print $2'}`
slave=`echo "ibase=16; $slave_hex" | bc`
ms=`echo "${master}-${slave}" | bc`

# проверяем, что строка со значением разницы не «пустая», т.е. не имеет
#нулевую длину с помощью «-z»
if test ! -z "$ms" ; then

# и если она меньше определенных значений
if test $ms -gt '5000';then
echo "Critical. Lag = $ms !"
exit 2
fi

if test $ms -gt '500';then
echo "Warning. Lag = $ms !"
exit 1
fi

# то выводим данное сообщение и выходим с кодом «0»
echo "Replication status is OK!"
exit 0

else
echo "status critical! Unexpected error — need check replication."
exit 2
fi 
Понравилась статья?
Подписаться на RSS feed
2 комментария:
  1. capone212 29 мая, 2016

    it seems that there are BYTES not milliseconds and, two values actually represents one 64 bit value
    http://blog.supplyframe.com/2013/05/09/monitoring-wal-lag-in-postgresql-9-x/

  2. capone212 29 мая, 2016

    And in newer versions you actually should use pg_xlog_location_diff

Оставить комментарий