2013-05-14 8 views
7

これは、特に、データ損失なしに他のサーバにフェイルオーバーできるさまざまなレプリケーションソリューションを使用することに対する自信を維持することです。または、データベースの1つが同期しなくなった場合に、合理的な時間内に知ることができるマスター/マスター状態です。2つのpostgresqlデータベース間のデータの整合性を確認する

このためのツールはありますか、一般的には、レプリケーションシステム自体に矛盾を警告するためのツールがありますか?私は現在、マスタースタンバイ設定でのpostgresql WALの配布に最も精通していますが、PgPoolなどのマスターマスター設定を検討しています。しかし、その解決策はPostgreSQL自体に直接関係していません(私の基本的な理解は、アプリケーションが使用する接続を提供し、さまざまなSQL文を傍受し、プール内のどのサーバにでも送信するということです)実際にデータの一貫性を検証することについて、私は考えました。

具体的な要件:

  1. 私はちょうどテーブル構造の話ではありません。私は実際のレコードのデータが同じであることを知りたいので、レコードが破損していないかどうかを知ることができます(その場合、最近のバックアップ+ WALファイルで悪いデータベースを再初期化して戻しますプールに入れる)

  2. データベースのサイズは30-50 GBです。私は生のSELECTクエリがうまくいくかどうかは疑問だ。

  3. 私はリアルタイムチェックの必要性は見当たりません(しかし、それはもちろんいいかもしれませんが)。毎時または毎日は何よりも良いでしょう。

  4. ブロックレベルのチェックは機能しません。独立したストレージを持つ2つのデータベースになります。

また、このタイプの検証は単純に現実的ではありませんか?

+0

最初に考えた私の心に来るデータベースはとらわれない両側に列をハッシュし、DB2にDB1に行ごとにハッシュを比較する方法を見つけ出すことです。これの最初の負荷は遅くなりますが、これを行うと徐々に前進していくことが悪くないかもしれません。 – Kuberchaun

+0

ここに私の前のコメントを拡張する興味のあるリンクがあります。 http:// stackoverflow。com/questions/9607063 /チェックサムフィールドのpostgresqlとコンテンツの比較 – Kuberchaun

答えて

0

あなたが全体のテーブルを探している場合は、この(非常に簡単にRAMに収まるのテーブルを想定)のような何かを行うことができるはず:

SELECT md5(array_to_string(array_agg(mytable), ' ')) 
    FROM mytable order by id; 

あなたのタプル表現上のハッシュを与えますテーブルの上に。

これを範囲などで分割することができます。レプリケーションの種類によっては、ページ範囲(ストリーミングレプリケーション用)で分割することもできます。

+0

もちろん、ORDER BYはarray_agg()内に入る必要があります。そうでないと、このクエリはまったく機能しません。 – intgr

3

あなたがマシンの両方で、現在のWALの場所を確認することができます... 彼らはあなたの基盤となるデータベースが互いに矛盾している意味と同じ値を表す場合...

$ psql -c "SELECT pg_current_xlog_location()" -h192.168.0.10 (do it on primary host) 
pg_current_xlog_location 
-------------------------- 
0/2000000 
(1 row) 

$ psql -c "select pg_last_xlog_receive_location()" -h192.168.0.20 (do it on standby host) 
pg_last_xlog_receive_location 
------------------------------- 
0/2000000 
(1 row) 

$ psql -c "select pg_last_xlog_replay_location()" -h192.168.0.20 (do it on standby host) 
pg_last_xlog_replay_location 
------------------------------ 
0/2000000 
(1 row) 

あなたもチェックすることができますwalsenderとwalreceiverプロセスの助けを借りて、この:

[do it on primary] $ ps -ef | grep sender 
postgres 6879 6831 0 10:31 ?  00:00:00 postgres: wal sender process postgres 127.0.0.1(44663) streaming 0/2000000 

[ do it on standby] $ ps -ef | grep receiver 
postgres 6878 6872 1 10:31 ?  00:00:01 postgres: wal receiver process streaming 0/2000000 
関連する問題