スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Slony-I同期監視

以前紹介したシステムプロパティをDBで管理するを利用して、Slony-Iの同期を監視してみます。
マスターのシステムプロパティを変更して、しばらく待ってからスレーブのシステムプロパティを確認して、同じ値ならばSlony-Iの同期が正しく行われていると判断します。

まずは初期値を設定します。

select set_property('sync_count', '0');

次にこの値を更新するPL/pgSQLを用意します。
この関数を呼ぶたびに、sync_countの値がインクリメントされます。

CREATE OR REPLACE FUNCTION up_sync_count(
) RETURNS text AS $$
DECLARE
w_result text;
BEGIN
w_result := get_property('sync_count');
w_result := (w_result::bigint + 1)::text;
PERFORM set_property('sync_count', w_result);
RETURN w_result;
END;
$$ LANGUAGE plpgsql;

最後は監視のためのbashスクリプトです。
流れとしては、まずマスターでカウントアップの関数を呼びます。しばらくsleepした後、スレーブの値を読みます。一致していればOKですが、一致していなければ指定回数スレーブの値を取り直します。指定回数を超えた場合、メールで不一致していることを通知します。
私はcronで一時間に一回実行しています。

#!/bin/bash
REPEAT=3
REPEAT_SLEEP=2
SLEEP_TIME=60
MAIL=system@example.com
PRIMARY=192.168.0.1
SLAVE=192.168.0.2
USER=user
DB=test

function check_once() {
DST=`/opt/postgresql/bin/psql -t -A -h $SLAVE -U $USER $DB <<_EOF
select
get_property('sync_count')
_EOF`
if [ "$SRC" != "$DST" ];
then
return 1
else
return 0
fi
}

function check() {
count=1
while [ $count -le $1 ]
do
if check_once;
then
return 0
fi
if [ $count -eq $1 ];
then
return 1
fi
sleep $2
count=`expr $count + 1`
done
return 1
}

SRC=`/opt/postgresql/bin/psql -t -A -h $PRAMARY -U $USER $DB <<_EOF
select
up_sync_count()
_EOF`

sleep $SLEEP_TIME

check $REPEAT $REPEAT_SLEEP
if [ $? -eq 1 ];
then
echo sync unmatch $SRC $DST|mail -s sync-alert $MAIL
fi


一行入魂サイトにまとめがあります。
スポンサーサイト

COMMENTS

COMMENT FORM

TRACKBACK


この記事にトラックバックする(FC2ブログユーザー)

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。