Ik probeer een postgresql cluster te maken met 1 master en 1 slave node. Reads zullen over de nodes gebalanced worden, master krijgt de writes voor z'n kiezen en repliceert deze naar de slave.
Hierbij heb ik synchrone replicatie (commit) ingeschakeld met 'synchronous_commit = remote_write' op de master. Dit werkt, als ik de slave uitzet dan blijft een insert hangen totdat ik de slave terug aanzet.
De balancing zou via pgpool moeten gaan lopen, maar voor een test heb ik het volgende script:
De postgresql server heeft overigens niets meer dan alleen een database test01 met een tabel test01. De verwachting is dat altijd de data die net op de master ingevoerd is aanwezig is op de slave. De commit zou moeten wachten tot deze op de slave ook weggeschreven is.
Dit is niet het geval.
Wanneer het verkeerd gaat varieert ook, laatste testen binnen 10x, eerdere testen vandaag pas na 20.000x
Doe ik hier iets verkeerd? Heb ik verkeerd idee bij synchronous replication bij postgresql?
Het probleem is (vanzelfsprekend) niet als de 2 queries in 1 commit gaan, pgpool (wat ik ook wil gebruiken) zal de queries in een commit alleen op de master doen. Echter de applicatie die er gebruik van gaat maken doet dit niet en staat hier buiten discussie.
Hierbij heb ik synchrone replicatie (commit) ingeschakeld met 'synchronous_commit = remote_write' op de master. Dit werkt, als ik de slave uitzet dan blijft een insert hangen totdat ik de slave terug aanzet.
De balancing zou via pgpool moeten gaan lopen, maar voor een test heb ik het volgende script:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| <?php $pdo1 = new PDO("pgsql:dbname=test01;host=postgres1", "testuser", ""); $pdo2 = new PDO("pgsql:dbname=test01;host=postgres2", "testuser", ""); $pdo1->query("TRUNCATE test01"); $i=0; while(true) { echo "loop $i\n"; //$pdo1->beginTransaction(); $pdo1->query("INSERT INTO test01 VALUES ($i)"); //$pdo1->commit(); $data = $pdo2->query("SELECT * FROM test01 WHERE col1 = $i"); $fetched = $data->fetchAll(); $count = count($fetched); if ($count !== 1) { echo "OH NOEEEESS $i (count was $count)\n"; var_dump($fetched); sleep(1); var_dump($pdo2->query("SELECT * FROM test01 WHERE col1 = $i")->fetchAll()); exit; } $i++; } |
De postgresql server heeft overigens niets meer dan alleen een database test01 met een tabel test01. De verwachting is dat altijd de data die net op de master ingevoerd is aanwezig is op de slave. De commit zou moeten wachten tot deze op de slave ook weggeschreven is.
Dit is niet het geval.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| keiichi@linux:~# php postgres.php loop 0 loop 1 OH NOEEEESS 1 (count was 0) array(0) { } array(1) { [0] => array(2) { 'col1' => int(1) [0] => int(1) } } |
Wanneer het verkeerd gaat varieert ook, laatste testen binnen 10x, eerdere testen vandaag pas na 20.000x
Doe ik hier iets verkeerd? Heb ik verkeerd idee bij synchronous replication bij postgresql?
Het probleem is (vanzelfsprekend) niet als de 2 queries in 1 commit gaan, pgpool (wat ik ook wil gebruiken) zal de queries in een commit alleen op de master doen. Echter de applicatie die er gebruik van gaat maken doet dit niet en staat hier buiten discussie.
Solar @ Dongen: http://solar.searchy.net/ - Penpal International: http://ppi.searchy.net/