2017-03-10 3 views
0

ich benutze lesen und MySQL Verbindungsaufbau in meinem Laravel 5.2 App schreiben:Laravel lesen und schreiben Verbindung nicht synchron

'mysql' => [ 
    'write' => ['host' => env('DB_HOST_WRITE', 'localhost'),], 
    'read' => ['host' => env('DB_HOST_READ', 'localhost'),], 
    'driver' => 'mysql', 
    'port' => env('DB_PORT', '3306'), 
    'database' => env('DB_DATABASE', 'forge'), 
    'username' => env('DB_USERNAME', 'forge'), 
    'password' => env('DB_PASSWORD', ''), 
    'charset' => 'utf8', 
    'collation' => 'utf8_unicode_ci', 
    'prefix' => '', 
    'strict' => false, 
    'engine' => null 
] 

Die Website läuft auf mehreren Servern mit einem Load-Balancer.

Nun gibt es in der App Fälle von Lese- und Schreiboperationen nacheinander, z.

  1. neue Datensätze einfügen in die Datenbank

Mit dem aktuellen Verbindungsaufbau einige der neu eingefügten Datensätze auswählen, kann es vorkommen, dass die Auswahl nichts zurück, auch wenn die Datensätze eingefügt wurden korrekt.

Was können die Gründe dafür sein?

+0

Okay, wie viele Datenbanken Knoten, die Sie verwenden, welcher Algorithmus oder Software, die Sie für die Synchronisation verwenden .. Datenbanken Sync kann aufgrund der Netzwerk-Latenz nicht sofort, Verarbeitungsverzögerungen oder absichtlich. –

+0

Wir haben 2 Knoten. Als Software verwenden wir Amazon Aurora. Wie stelle ich sicher, dass wir eine stabile Synchronisierung haben? – lesssugar

+0

Nun, ich bin kein Experte in Aurora, aber nach ihrer Website gibt es etwa Latenz von 100 ms für die Replikation. versuchen, Verzögerung zwischen der Einfügung und der Auswahl Operationen ca. 200 ms einfügen und sehen, ob dies löst es .. Dann Sie müssen tiefer in Aurora selbst graben –

Antwort

2

Dies ist kein Laravel-spezifisches Problem. Dies wird Master-Slave-Replikationsverzögerung genannt.

Es gibt mehrere Techniken Prävention, sondern nur eine Technik, die „heilt“ das Problem

Zuerst werden die Kuren: Vermeiden Sie lesen Schreib Combos:

Sie einen Auswahlvorgang unmittelbar nach einem Einsatz nicht durchführen (Lese-Schreib-Kombination). Das mag zunächst verrückt klingen, aber wenn du es vermeiden kannst, vermeide es!

Wenn Sie kippt dies tun, aber man kann erkennen, wo die Lese-Schreib-Combos in Ihrem Code passieren würden, nur für den Master verwenden sowohl lesen als auch schreiben ops

Prevention-Techniken (wenn Heilung nicht möglich ist)

  1. aktivieren slave compressed protocol
  2. Disable Binärlogging auf Slave
  3. optimieren mySQL-Abfragen (zB Indizes hinzufügen, etc.)
  4. Andere Möglichkeiten: manuell Schlaf zwischen Einsatz und Auswahlabfragen, beiden Einsätze und wählt in einer einzigen Transaktion Einwickeln (wieder die Master-Verbindung würden geschehen, während Slave kostenlos)
+0

Die Verwendung von Master für beide ist der einzige wirkliche Weg nach vorne. Das Polling auf den Slaves führt zu mehr Lese-Traffic als es wert ist und der Einsatz von Präventions-Techniken könnte weitere Probleme verursachen, da die Lese-Replikate nicht immer schnell genug sind, nur manchmal. Debugging-Probleme werden entsetzlich sein, wenn mehrstufige Datenbankarbeit geleistet wird. –

2

In Laravel 5.5 Ich habe einen erfolgten PR für das, das eine "klebrige" Option einführt.

Es bedeutet, dass Ihre Anwendung wann immer möglich die "Lese" -Verbindung verwendet, aber wenn Sie ein "Schreiben" machen, dann kommen alle nachfolgenden "Lesevorgänge" im selben Anfragezyklus auch von der Schreibverbindung.

Dies gewährleistet die Datenintegrität.

https://github.com/laravel/framework/pull/20445

+0

Sieht vielversprechend aus. Ich werde das testen, sobald wir auf 5.5 upgraden. Danke für die wertvolle PR und lass es uns wissen. – lesssugar

+2

Danke. Der Grund, dass dies eine Konfigurationsoption ist und nicht Standard ist, ist nur dann cafeful, wenn Sie ein kleines "Schreiben" gefolgt von einem langen großen "Lesen" machen. Es bedeutet, dass der große Lesevorgang in Ihrer Schreibdatenbank erfolgt. Es ist ein Balanceakt - und sollte in den meisten Situationen in Ordnung sein. Aber pass einfach darauf auf. – Laurence

+0

Das ist eine fantastische Idee. –