Loadbalancing für MySQL (-Slaves)
Dieser Artikel im Blog eines Kollegen hat mich dazu veranlasst mir den verwendeten Algorithmus mal ein wenig näher anzusehen und zu überarbeiten – und ihn zumindest in Sachen Speicherbedarf zu verbessern. Heraus gekommen ist folgendes:
function getSlave($cluster) { // gibt es nur einen Server im Array, wird dieser zurückgeliefert if(count($databaseClusters[$cluster]) == 1) { return "master"; } else { $sum = 0; foreach($databaseClusters[$cluster] as $slave) { $sum += $slave["prio"]; } $randomVal = rand(0, $sum); if($randomVal < $sum / 2) { $i = 0; $tmpSum = 0; while($tmpSum < $randomVal) { $tmpSum += $databaseClusters[$cluster]["slave$i"]["prio"]; $i++; } } else { $i = count($databaseClusters[$cluster]); $tmpSum = $sum; while($tmpSum < $randomVal) { $tmpSum -= $databaseClusters[$cluster]["slave$i"]["prio"]; $i--; } } return "slave$i"; } }
Herausgekommen ist dadurch zwar eine längere aber im Allgemeinen speicherschonendere Methode um Datenbankqueries zu verteilen. Um weitere Informationen zu erhalten lest bitte bei meinem Kollegen weiter.
