Postgresql 9.6 - Synchronus Commit funktioniert nicht

Hi,

folgendes Setup:
habe eine Streaming Replication zwischen zwei Servern eingerichtet:

postgresql.conf parameter:

tcp_keepalives_idle = 60
tcp_keepalives_interval = 30
tcp_keepalives_count = 5
wal_level = hot_standby
archive_mode = on
archive_command = '/bin/true'
hot_standby = on
wal_keep_segments = 100
max_wal_senders = 2

synchronus_commit = remote_apply
synchronous_standby_names = '*'

Habe also ein Master- und einen Slave- Server und wollte nun ausprobieren, ob die beiden Datenbanken beim INSERT in eine Tabelle auf dem Master auch immer gleich bleiben. Habe von meinem Test erwartet, dass man immer den selben Count der Reocords beim Befüllen in einer Tabelle erhält, da ich es so verstanden hab, das erst commited wird, wenn der commit auf dem Slave server abgeschlossen ist:

Befülle die Tabelle auf dem Master:

while true; do nohup su - postgres -c 'while true;do psql -c "insert into test (test)  VALUES (generate_series(1,1000));" -d test

Überprüfe mit diesem Skript, ob der Count der beiden Tabelle übereinstimmt wenn ja dann true wenn nein dann false:

trigger_master_slave.sh

MAST_VALUE=$(sh /tmp/check_master.sh &  PIDMAST=$!)
SLAVE_VALUE=$(sh /tmp/check_slave.sh &  PIDSLAV=$!)
wait $PIDMAST
wait $PIDSLAV
if [ $MAST_VALUE != $SLAVE_VALUE ]; then
        echo "false"
else
        echo "true"
fi

Hier die beiden anderen Skripts die ich aufrufe:
/tmp/check_master.sh

psql -h 192.168.2.2-d test -U postgres -c "SELECT COUNT(ID) FROM test;" | head -n 3 | tail -n 1

/tmp/check_slave.sh
psql -h 192.168.2.3 -d test -U postgres -c “SELECT COUNT(ID) FROM test;” | head -n 3 | tail -n 1[/code]

Wenn ich nun das skript ausführe, bekomme ich leider sehr viele false zurück, da der count auf dem Master höher ist:

while true; do ./trigger_master_slave.sh; sleep 0.03; done

Kann mir hier jmd weiterhelfen? Hätte sehr gerne dieses Szenario das erst commited wird wenn der Slave commited.
Oder aber ist mein Test nicht gut - funktioniert es? Und kann ich es irgendwo in einer “pg_table” z.B. nachvollziehen?


Grüße

Phoboz

Die Replikation ist erst einmal asynchron. Wenn Du synchrone Replikation willst, dann stelle das noch passend ein, synchronous_standby_names ist Dein Freund. Beachte, daß bei synch. Replikation man mindestens 2 Standbys benötigt, ansonsten steht Dein gesamter Cluster, wenn der eine Standby gread mal ned will.

Evtl. teste ich auch falsch, aber ich hatte es halt so verstanden, wenn es eine Replikation mit synchron commit ist, darf es eigentlich nie dazu kommen, dass der Master mehr Daten halt als der Slave oder?

Also die Replication scheint sychronous zu sein:
SELECT * FROM pg_stat_replication;
bei sync_state steht sync und nicht async.

Hrm. Woher willst Du wissen, daß der Count auf dem Master höher ist? Dein select count(id) wird bei größer werdenden Tabellen immer länger dauern. Ich vermute einfach mal, daß der Aufruf von check_slave.sh bereits MEHR Records liefert als der Aufruf von check_master.sh, du prüfst aber nur auf Gleichheit und bei Ungleichheit VERMUTEST Du, das auf dem Master höher sei - wissen kannst Du es nicht. Außerdem garantert Dein Vorgehen nicht, daß Du zur gleichen Zeit in die DB schaust, schon alleine der Verbindungsaufbau des psql benötigt Zeit. Schon daher sieht Dein check_slave.sh die DB zu einem SPÄTEREN Zeitpunkt.

@castorp: ja, sorry, das * hatte ich übersehen.