Postgresql 9.6 - Synchronus Commit funktioniert nicht

Konfiguration des PostgreSQL Datenbankservers.
Antworten
Phoboz
Neuer Benutzer
Beiträge: 2
Registriert: Di 7. Feb 2017, 07:02

Postgresql 9.6 - Synchronus Commit funktioniert nicht

Beitrag von Phoboz »

Hi,

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

postgresql.conf parameter:

Code: Alles auswählen

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:

Code: Alles auswählen

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

Code: Alles auswählen

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

Code: Alles auswählen

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
<code>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:

Code: Alles auswählen

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

akretschmer
Erfahrener Benutzer
Beiträge: 7733
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Re: Postgresql 9.6 - Synchronus Commit funktioniert nicht

Beitrag von akretschmer »

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.
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

castorp
Erfahrener Benutzer
Beiträge: 1209
Registriert: Sa 27. Jun 2009, 22:24
Wohnort: Bayern

Re: Postgresql 9.6 - Synchronus Commit funktioniert nicht

Beitrag von castorp »

akretschmer hat geschrieben:
Di 7. Feb 2017, 07:36
Die Replikation ist erst einmal asynchron. Wenn Du synchrone Replikation willst, dann stelle das noch passend ein, synchronous_standby_names ist Dein Freund.
Hat er doch:

Code: Alles auswählen

synchronus_commit = remote_apply
synchronous_standby_names = '*'
A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'

Phoboz
Neuer Benutzer
Beiträge: 2
Registriert: Di 7. Feb 2017, 07:02

Re: Postgresql 9.6 - Synchronus Commit funktioniert nicht

Beitrag von Phoboz »

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.

akretschmer
Erfahrener Benutzer
Beiträge: 7733
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Re: Postgresql 9.6 - Synchronus Commit funktioniert nicht

Beitrag von akretschmer »

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.
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

Antworten