Infrastruktur-Optimierung und Lastenverteilung

mysqlnd_ms 1.5 bietet neue Funktionen zum Load Balancing
Kommentare

In seiner jüngsten Version liefert der Load-Balancer mysqlnd_ms neue Funktionen, die insbesondere auf die neuen Features in PHP 5.5 und MySQL 5.6 eingehen. MySQL-Senior-Entwickler Ulf Wendel erklärt uns, wie man das Potenzial des Tools nutzt.

MySQL Replikation wird häufig verwendet, um PHP MySQL Anwendungen zu
skalieren. Dabei teilen sich ein Master-Datenbankserver (Primary) und
mehrere Slaves (Copy) die Anfragelast. Die Slaves replizieren die Daten
asynchron vom Master. Schreibzugriffe dürfen nur auf dem Master
ausgeführt werden. Lesezugriffe sollten auf den Slaves ausgeführt werden.

Für den PHP Programmierer bedeutet dies mehr Arbeit: Er muss Anfragen
gezielt im Cluster verteilen. Read/Write-Splitting, Lastverteilung, und
Failover sollten beachtet werden. Doch damit nicht genug. Nicht jede
Leseanfrage kann von jedem Slave korrekt beantwortet werden, weil Daten
asynchron repliziert werden und read-your-writes (Session Konsistenz)
nicht garantiert ist. Und sofern ein Slave benutzt wird, gibt es noch
einen MySQL 5.6 Trick [1], der doppelte Geschwindigkeit verspricht –
mehr unten.

All diese Aufgaben abstrahiert und übernimmt das von MySQL entwickelte,
freie PECL/mysqlnd_ms. Es arbeitet mit allen PHP MySQL APIs zusammen und
versucht, die Umstellung einer Anwendung von einem einzelnen MySQL Server
auf einen beliebigen Cluster von MySQL Servern (auch von Drittanbietern)
ohne Applikationsänderungen möglich zu machen.

In der aktuellen Entwicklungsversion 1.5 des client-seitigen Load
Balancers gibt es zwei Hauptänderungen:

Um Load Balancing während einer Transaktion zu unterbinden, überwacht
PECL/mysqlnd_ms API-Aufrufe. In PHP 5.5 wurde die mysqli-API um neue
API-Funktionen erweitert, damit die Notwendigkeit zur Verwendung von SQL
zur Transaktionskontrolle entfällt. Die neuen bislang undokumentierten
Funktionen sind: mysqli_begin_transaction(), msqli_savepoint(), mysqli_release_savepoint(), mysqli_rollback().

MySQL 5.6 und mysqli_begin_transaction() unterstützen Read-Only
Transaktionen beispielsweise mittels mysqli_begin_transaction(MYSQLI_TRANS_START_READ_ONLY). Messungen [1]
zeigen, dass InnoDB eine Read-Only Transaktion doppelt so schnell
ausführen kann wie eine normale Transaktion.

PECL/mysqlnd_ms 1.5 führt außerdem einen neuen Filter ein, der es
erlaubt Nodes in einem Cluster logisch zu gruppieren und unter einem
Gruppennamen per SQL-Hint anzusprechen. Ein typischer Anwendungsfall ist
Sharding [3].

Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -