同期DBレプリケーションとフェイルオーバーに興味がある場合は、私が提案します。次の2つのツールの使用を検討できます。
次のように組み合わせて使用できます。
- DBServer1にはIP 10.1.2.30があります
- DBServer2にはIP 10.1.2.40があります
- DB VIPは10.1.2.70です
2つの異なるサーバーでucarpをセットアップし、各ucarpインスタンスが仮想ルーターIDに沿って他のインスタンスと通信するようにします。
DBServer1は
/usr/local/sbin/ucarp -v 200 -p sometagname --interface=eth2 -a 10.1.2.70 -s 10.1.2.30 -b 3 -r 5 --upscript=/usr/local/sbin/vip-up.sh --downscript=/usr/local/sbin/vip-down.sh --neutral -z -B
DBServer2は
/usr/local/sbin/ucarp -v 200 -p sometagname --interface=eth2 -a 10.1.2.70 -s 10.1.2.40 -b 4 -r 5 --upscript=/usr/local/sbin/vip-up.sh --downscript=/usr/local/sbin/vip-down.sh --neutral -z -B
-b(ブロードキャスト)が1つのサーバーで3で、他のサーバーで4である理由は何ですか?両方のサーバーが再起動された場合、-bが最も小さいサーバーがucarpを最初に表示します。-rに関しては、それはデッドレシオです。したがって、DBServer1は15秒(3X5)で起動し、DBServer2は20秒(4X5)で起動します。
DBServer1がクラッシュしたとしましょう。DBServer2上のucarpは、DBServer1上のucarp間のハンドシェイクを20秒間チェックします。何も検出されない場合、DBServer2のvip-up.shスクリプトがDBVIPを制御します。
これはすべて、フェイルオーバーとDBVIP管理のためのものです。PostgreSQLデータベースはどうですか?驚いたことに、PostgreSQLは一度に1つのサーバーでのみ実行されます。DBVIPを持っている人は誰でも、DRBDをプライマリ状態にする必要があります。これはvip-upスクリプトに結びつきます。それをどのようにスクリプト化しますか?
/usr/local/sbin/vip-down.shスクリプト(概念)は次のとおりです
#! /bin/sh
exec 2> /dev/null
/sbin/drbdadm disconnect drbd0
/sbin/drbdadm primary drbd0 &&
/bin/mount postgres-data-folder /mnt/drbd0
/sbin/ip addr add 10.1.2.70/24 dev eth2
/sbin/service postgres start &&
/usr/local/sbin/vipmon.sh &
touch /tmp/vip-up
/usr/local/sbin/vip-down.shスクリプト(概念)は次のとおりです
#! /bin/sh
exec 2> /dev/null
/sbin/service postgres stop
/bin/umount -l /dev/drbd0
/sbin/drbdadm secondary drbd0
/sbin/ip addr del 10.1.2.70/24 dev eth2
/bin/rm /tmp/vip-up
/usr/bin/killall -9 ucarp
/usr/local/sbin/vip-down.sh
kill `ps auxww | grep vipmon | awk '{print $2}'`
必要なのは、pg_hba.confをセットアップして、すべてのユーザーが10.1.2.70を経由するようにすることです。
基本的に、vip-upはこのシーケンスを実行します
- DRBDをプライマリにする
- / dev / drbd0にpostgresデータフォルダをマウントする
- スタートアップpostgres
- vipmonプロセスを開始する
反対に、vip-downはこのシーケンスを実行します
- postgresのシャットダウン
- unount / dev / drbd0
- DRBDをセカンダリに移行させる
vipmon.shはどうですか?無限ループでpostgres(実行中)の状態をチェックするスクリプトを作成し、DRBDデバイスをチェックします(postsデータフォルダーに書き込むことができますか)
このセットアップでは、DRBDプライマリにpostgresがあり、他のDBServer(DRBDセカンダリ)にpostgresデータフォルダのディスクレベルのコピーがあります。postgresがDRBDセカンダリで実行されていません。
フェイルオーバーが発生した場合、ucarpがpostgresデータをマウントし、postgresを起動してvipmonスクリプトをアクティブ化するのが安全であると検出するための時間が必要です。
この設定の優れている点は、フェイルオーバーが発生した場合、DRBDプライマリになるDBサーバーに、障害が発生したサーバーの100%ディスクレベルのコピーが存在することです。したがって、postgresを開始すると、一貫した状態でレベルが上がるはずです。トランザクションログ(pg_xlog内)は完全な状態である必要があります(フェイルオーバーによる断続性が少ない)
これらの提案がお役に立てば幸いです。私はMySQL DBAですが、雇用主のWebホスティング会社でMySQLとDRBDを定期的に使用しています。上記の方法でMySQL / DRBDをインストールしました。PostgreSQL / DRBDを使用しているクライアントに対してこれを1回行いました。それは素晴らしい働きをします。オープンソースです。DRBDとucarpを学ぶためにデューデリジェンスを実行する必要があるだけです。これには、フェイルオーバー後のDRBDの再接続、両方のDBサーバーがプライマリになるスプリットブレインシナリオの処理などが含まれます。