:::: MENU ::::

WebDevExp

Meine Erfahrungen in der Webentwicklerwelt

Loadbalance Mysql Slaves

mysql, php

Loadbalance Mysql Slaves

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!

One Comment

Leave a comment

Loading Facebook Comments ...