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!
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: [...]