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!

Eine Antwort zu “Loadbalance Mysql Slaves”

  1. Loadbalancing für MySQL (-Slaves) | Stephan's Blog says:

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

Hinterlasse einen Kommentar.

Network-wide options by YD Freelance Wordpress Development