Hat man mehrere Slaves desselben Masterservers im Einsatz und will die Abfragen einigermaßen gleichmäßig verteilen (bzw. stärkeren Servern mehr Last zuweisen), muss man sich PHP-Technisch einen Weg einfallen lassen. Sicher, es gibt auch die Möglichkeit Hardwarebalancer zu nutzen, aber ich persönlich halte es für überflüssig zwei- bis viertausen Euro für so ein Gerät auszugeben. Folgender Code erledigt die Aufgabe für uns:
Hier werden die 2 Slaves in einem Verhältnis von 50 zu 20 angesprochen, im Beispiel wird davon ausgegangen, dass alle Server dieselben User/Passwörter/Ports haben.
/**
* clusterName
* -> master / slave[Number[0,1,n]
* --> host
* --> port (optional)
* --> prio (only for slave, >0)
*/
$databaseClusters = array(
"main" => array( /* Clustername */
"master" => array(
"host" => "10.0.0.100",
),
),
"slave1" => array(
"host" => "10.0.0.101",
"prio" => 50, /*mehr Last*/
),
),
"slave2" => array(
"host" => "10.0.0.102",
"prio" => 20, /*weniger Last*/
),
),
);
function getSlave($cluster)
{
// gibt es nur einen Server im Array, wird dieser zurückgeliefert
if(count($databaseClusters[$cluster]) == 1)
{
return "master";
}
else
{
$slaves = array();
$sum = 0;
for($i = 0; $i < count($databaseClusters[$cluster]); $i++)
{
for($h = 0; $h <= $databaseClusters[$cluster]["slave$i"]["prio"]; $h++)
{
array_push($slaves, "slave$i");
}
$sum += $databaseClusters[$cluster]["slave$i"]["prio"];
}
return $slaves[rand(0,$sum)];
}
}
Es wird ein Array erstellt, worin der erste Server 50 mal und der zweite 20 mal Vertreten ist, dann wird ein Zufälliges Element (0-69) herausgepickt. Es gibt gewiss andere Methoden, aber diese Funktioniert für uns einwandfrei, bin aber immer für bessere Vorschläge offen!

Einträge (RSS)
Dezember 30th, 2008 at 17:04
[...] Dieser Artikel im Blog eines Kollegen hat mich dazu veranlasst mir den verwendeten Algorithmus mal ein wenig näher anzusehen und ein wenig zu überarbeiten – und ihn zumindest in Sachen Speicherbedarf ein wenig zu verbessern. Heraus gekommen ist folgendes: [...]