PostgreSQLフェイルオーバー-どのツールを使用する必要がありますか?


8

ここにシナリオがあります:

CentOS 6.2を実行しているマシンが2つあります-machine0とmachine1

どちらにもPostgreSQL 9.1がインストールされています。

それらの1つはマスターシステムとしてアクティブでなければならず、非同期ストリーミングレプリケーションを介して他のマシンを介して、スタンバイはマスターシステムからデータベースに変更をコピーする必要があります。

最初はmachine0がマスターで、machine1がスタンバイであると想定します。

マスター(machine0など)に障害が発生した場合(ここでの障害とは、postgresqlサーバーがクラッシュしたことを意味します)、スタンバイはマスターから引き継ぎ、新しいマスターになる必要があります。

machine1は、新しいマスターがすべてのデータベース操作を処理し、machine0のpostgresqlサーバーがオンラインに戻ると、スタンバイになり、machine1との接続を失った時点から同期を開始し、すべての変更をデータベースにコピーしてスタンバイモードのままにします。

machine1に障害が発生すると、サイクル全体が繰り返されます。

スタンバイに障害が発生してオンラインに戻ると、マスターからの読み取りが開始され、データが同期されます。

PostgreSQLはデフォルトではフェイルオーバーを備えていないことを理解しているので、これを設定するために使用する必要があるツールについて混乱しています。

誰かが私が私がしようとしていることをする方法を説明するスレッド/ページに私をリンクできれば、私は本当に感謝します。


VIPにpingを送信できないときにUCARPに問題があります

CentOを使用してUCARPを構成するためのソリューションがあります

あなたは何をしたいのためのステップのHOWTOで数ステップをあなたが望んで成功したが、ここにいるかどうかを知りません:howtoforge.com/... library.linode.com/linux-ha/...希望を、このことができます。
Dragan Matic、2012年

回答:


5

同期DBレプリケーションとフェイルオーバーに興味がある場合は、私が提案します。次の2つのツールの使用を検討できます。

  • DRBD(ディスク複製ブロックデバイス)は、2つの異なるサーバー上のディスク間でディスクレベルのレプリケーション(同期)を提供します。ディスクの変更はネットワークを介して複製されます。192.168.xxネットブロックを使用するNICには、eth2でクロスケーブルを使用するのが最適です。

  • ucarpは、2つの異なるサーバー間のDBVIP管理とフェイルオーバーを可能にします。

次のように組み合わせて使用​​できます。

  • 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サーバーがプライマリになるスプリットブレインシナリオの処理などが含まれます。


更新:DRBDのWebサイトへの素早いアクセスといくつかの読書は私の私の上記の質問に答えました。そして、あなたが言及した設定は完璧なツールのようです。私は週末にそれを学ぶつもりなので、上記の素敵なレッスン/チュートリアルにリンクしていただければ幸いです:)
wingedrhino

こんにちは、postgresサーバー(サービス)のみが失敗した場合、これは考慮されません。マシンはまだ稼働しており、仮想IPがありますが、サービスはそのマシンで実行されていません。
GypsyCosmonaut
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.