Master/Slave

Mit der Version 5.0 wurde die Skalierbarkeit des OXID eShop Enterprise Edition vergrößert. Der Shop kann nun mit mehreren Datenbanken betrieben werden. Dabei ist eine Datenbank die Master-Datenbank, die hauptsächlich Schreibzugriffe verarbeitet. Die Slave-Datenbanken enthalten gespiegelte Daten und bedienen die Lesezugriffe. Ein Load-Balancer verteilt die Datenbankzugriffe nach dieser grundsätzlichen Unterscheidung auf die Master-Datenbank und auf die Slave-Datenbanken.

Konfiguration

Master/Slave wird über zwei Einträge in der config.inc.php aktiviert und konfiguriert.

$this->aSlaveHosts = null;
$this->iMasterSlaveBalance = 0;

Im ersten Eintrag werden alle Server-Adressen der Slave-Datenbanken als Array angegeben. Soll die Balance zwischen Master und Slave genutzt werden, muss auch der Hostname oder die IP des Servers mit der Master-Datenbank im Array stehen.

Der zweite Eintrag definiert die Balance zwischen Master/Slave mit einem Wert zwischen 0 und 100. Der Wert 0 bedeutet, dass die Slave-Datenbanken alle SELECT-Abfragen bearbeiten. Wird der Wert auf 100 gesetzt, übernimmt die Master-Datenbank komplett alle SELECT-Abfragen. Im Beispiel werden zwei Slave-Datenbanken verwendet. Die Datenbankanfragen werden zu 50% auf die Master-Datenbank und zu 50% auf die Slave-Datenbanken verteilt.

$this->aSlaveHosts = array('slave1host', '10.2.3.12', 'masterhost');
$this->iMasterSlaveBalance = 50;

Master/Slave im Quellcode

Die nachfolgend genannten Methoden aus der Klasse oxLegacyDb, welche Daten selektieren, haben einen zusätzlichen Parameter $blType. Mit diesem kann angegeben werden, ob die Daten aus der Master- oder der Slave-Datenbank gelesen werden sollen. Der Standardwert ist"true"und bewirkt, dass alle Daten aus der Slave-Datenbank kommen. Methoden: getOne(), getArray(), getRow(), getAll(), select(), getAssoc(), getCol() und selectLimit().

Das Beispiel zeigt, wie Daten aus der Slave-Datenbank und aus der Master-Datenbank gelesen werden. Wenn Master/Slave nicht eingerichtet ist, werden die Daten in beiden Fällen aus der Master-Datenbank gelesen.

$oDb = oxDb::getDb();

// from slave
$oDb--> getOne(\"select oxid from oxcountry\");

// from master
$oDb--> getOne(\"select oxid from oxcountry\", false, false );