2011-11-22 2 views
0

J'utilise PHP avec une base de données MySQL répliquée.Réplication de base de données: sélection de base de données intelligente dans PHP?

Je souhaite équilibrer la charge de la base de données. À l'heure actuelle, j'ai le brut plutôt:

$ran = rand(1,10); 
if ($ran < 5) { 
    $db = '10.0.0.2:3306'; 
} else { 
    $db = '10.0.0.3:3306'; 
} 
// connect to the database 
$con = mysql_connect($db,'elastic1','oag4Chai') 
    or die('Could not connect to the server!'); 

Mais évidemment, si l'une des bases de données est en baisse, alors nos pages web afficheront des messages d'erreur la moitié du temps.

Existe-t-il une méthode plus robuste pour ce faire, c'est-à-dire vérifier si la base de données est ouverte avant la connexion?

Il pourrait s'agir simplement d'une instruction try/catch je suppose, ou je pourrais faire un équilibrage de charge plus sophistiqué - des suggestions reçues avec reconnaissance.

+0

Peut-être lié: http://stackoverflow.com/questions/7278163/how-to-code-php-mysql-class- pour-maître-et-esclave-installation – simshaun

Répondre

2

Ce ne est pas à la page du Web, qui montre les erreurs, son vous

die('Could not connect to the server!') 

die() n'a rien à voir dans "code réel" de nos jours.

$ran = rand(1,10); 
if ($ran < 5) { 
    $db = '10.0.0.2:3306'; 
} else { 
    $db = '10.0.0.3:3306'; 
} 
// connect to the database 
$con = mysql_connect($db,'elastic1','oag4Chai'); 
if (!$con) { /* Connect to the other one */ } 
0

Il est assez rudimentaire ... mais si votre serveur de base de données est mise en ligne et mis hors ligne dans une sorte de processus automatisé, je devrais ce processus créer/supprimer une sorte de fichier de verrouillage sur le serveur Web à un certain endroit. Et demandez simplement au script de vérifier si le fichier de verrouillage existe ou non avant de décider du serveur de base de données auquel l'utilisateur doit être envoyé. Ce sera moins la surcharge que de faire une demande de réseau au serveur DB pour vérifier s'il est en ligne ou pas à chaque fois que vous voulez faire une demande.

Dans le cas où votre serveur de base de données se bloque réellement à votre insu et que votre fichier de verrouillage indique toujours que le serveur est en ligne, vous n'avez pas de chance et vous rencontrerez probablement des problèmes. Peut-être un cronjob chaque minute pour tester si le serveur DB est en ligne ou non, puis manipuler le fichier de verrouillage en conséquence.

1

Tout d'abord - personnellement, je pense que ce n'est pas une bonne idée pour un script PHP.

Si vous pouvez se permettre, je regarderais dans les éléments suivants:

  • surveiller la disponibilité des serveurs (snmp, Nagios?)
  • utilisation DNS round-robin pour vos esclaves en lecture (TTL faible, facile à mettre à jour quand on va vers le bas)
  • regard sur mysql-proxy et mettre à jour sa configuration basée sur le suivi

Si vous voulez un PHP-solutio n, je mettrais en œuvre un modèle de disjoncteur:

  1. Un processus asynchrone vérifie la disponibilité des serveurs MySQL (par ex. il est mysqli_connect()). Cela pourrait être un script exécuté via cron (toutes les minutes ou à des intervalles plus courts).
  2. L'état de ce processus est enregistré dans un cache (serveur unique: APC, multiple: memcached ou redis)
  3. Votre code PHP vérifie d'abord le cache, puis se connecte. Vous pouvez randomiser (ou utiliser un algorithme basé sur l'ID de session ou l'ID utilisateur, etc.) sur les serveurs disponibles plus loin si vous le souhaitez.

Personnellement, j'aime mieux l'idée de DNS.

Questions connexes