2 台の Postgresql 9.2.1.4 マシン (マスターとスレーブ) で同期レプリケーションを実行しています。
構成は次のとおりです。
マスター パラメータ
synchronous_commit=on
synchronous_standby_names = '*'
no synchronous_replication_timeout parameter, so 10 sec by default
no synchronous_replication parameter, so async by default
wal_level = hot_standby
max_wal_senders = 5
wal_keep_segments = 32
hot_standby = on
スレーブ パラメータ
no synchronous_commit, so by default on
no synchronous_replication_service parameter, so by default async
max_wal_senders = 5
wal_keep_segments = 32
hot_standby = on
アプリケーションは、マスターにレコードを挿入し、pgpool を使用してマスターまたはスレーブからレコードを読み取ります。レコードを挿入した直後に、アプリケーションが挿入されたレコードを認識しないことがありますが (おそらく、別の db ホストから挿入されたものを読み取ったため)、後で確認すると、データベースにレコードが存在します。
http://wiki.postgresql.org/wiki/Synchronous_replication#SYNCHRONOUS_REPLICATION_OVERVIEW で、次のことがわかりました。
私の質問
- a) マスターの synchronous_replication_timeout (デフォルトでは 10 秒) を超えた場合、および次の 3 つのケースのいずれかで、それは本当に意味しますか?
- データがスレーブに届かなかった、または
- トランザクションがスレーブでコミットされていないか、
- トランザクションはスレーブでロールバックされました。
マスターはトランザクションをコミットしますが、スレーブはまったくコミットしませんか?
もしそうなら、トランザクションは本当に同期していないようです...
- b) マスターに synchronous_replication_timeout=0 を設定するとどうなりますか? マスターは、スレーブがコミットまたはロールバックするのを無限に待ちますか?
どの値を設定すればよいですか
synchronous_replication (マスター上) = async (def) | 受信 | fsync | 申し込み
と
synchronous_replication_service (on Slave)
= async (def) | recv | fsync | apply
適切な同期レプリケーションのセットアップを確実に行うため (したがって、データが両方のサーバーでコミットされているか、両方でロールバックされていると確信しています)
両方とも適用するように設定する必要がありますか?
- PosgreSQL 9.1.4 で同期レプリケーションを使用して、データがマスターとスレーブの両方で同時にコミットされるようにするオプションはありますか?