0

プロジェクトのデータベースとしてPostgresを使用し、ストリーミングレプリケーションが非同期で動作するニーズに適合していることを確認しました。1台のサーバーが書き込み専用モード(MASTER)で、他のサーバーが読み取り専用モード(SLAVES)になっています。

ほとんどの場合、データをMASTERに送信し、それを忘れます。ただし、続行する前に、現在のチャンクがマスターとスレーブの間で同期されていることを確認したい場合があります。新しい行(INSERTS)の場合、それは簡単です。スクリプトは、単純なSELECTクエリによって新しい行が表示されているかどうかを確認できます。しかし、UPDATEの場合は問題になります。

それで、スレーブがマスターに追いつくかどうかをチェックする簡単で合法的な方法はありますか?すべてのレコードに独自の内部IDが必要であることは知っていますが、サーバー間で同じになるかどうかはわかりません。

このすばらしい記事で説明されている非常によく似た構成でPostgres9.2を使用します。

4

1 に答える 1

0

それで、最終的に私は自分で解決策を見つけました。これまでのところ、postgres はすべての変更を特別なログ ファイルに保存し、変更をスレーブ サーバーにレプリケートします。同時に、postgres には、さまざまな内部プロセスの状態を読み取ることができる API メソッドの豊富なセットがあります。したがって、最後に次のクエリを使用します。

-- On MASTER server current xlog location:

SELECT 
  pg_xlog_location_diff(pg_current_xlog_location(), '0/0') AS offset;

-- On SLAVE server current offset of received and applied changes

SELECT 
   pg_xlog_location_diff(pg_last_xlog_receive_location(), '0/0') AS receive,
   pg_xlog_location_diff(pg_last_xlog_replay_location(), '0/0') AS replay;

MASTER と SLAVE からこの値を取得すると、サーバー間の違いがどの程度かを判断できます。また、両方のサーバーが同じ状態であることを確認する必要がある場合は、SLAVE のオフセットが MASTER のオフセットと同じかそれ以上になるまで待つことができます。

同じ問題がある場合、おそらくこのクエリも便利です。

-- Check is current server in cluster

SELECT 
  pg_is_in_recovery() AS recovery;

-- False — server is MASTER
-- True — server is SLAVE
于 2013-01-31T03:40:26.437 に答える