équilibrer la charge de deux servers Web chacun sur deux isp différents?

J'ai deux ISP qui me fournissent l'hébergement via apache / php / mysql. Je suis en train de faire drupal sur eux. À l'occasion, le server mysql disparaît (crash), alors j'espérais find un moyen raisonnable d'échouer, si le server A SQL est en panne, tout le trafic est envoyé au server B.

Je sais traditionnellement que cela est traité dans DNS où un second IP alternatif est donné s'il y a un problème – ou similaire. Mais je n'ai pas le contrôle de l'isp, sauf que je peux exécuter php, perl et les choses d'apache habituelles. En outre, j'ai des ip statiques sur chaque isp, et je peux créer des inputs dns (A / CNAME / TXT).

Donc, j'espérais qu'il pourrait y avoir un moyen pour moi d'avoir un script qui vérifie si drupal a un problème et, dans l'affirmative, modifiez-en quelque chose ou?

Ou toutes les autres idées? (sauf dépenser beaucoup plus $ sur un meilleur isp)

3 Solutions collect form web for “équilibrer la charge de deux servers Web chacun sur deux isp différents?”

Round Robin DNS ne résoudra pas votre problème – c'est un excellent moyen de fournir un équilibrage de charge des servers web – mais le basculement survient lorsque le client tente de se connecter à un port et ne reçoit aucune réponse (il passe ensuite à essayer l'input DNS suivante pour l'hôte). Évidemment, si la database MySQL échoue, cela n'aura aucun impact direct sur le server web (c'est-à-dire que le server Web répondra aux requests TCP).

Bien qu'il soit possible en principe d'get le code PHP pour détecter une défaillance de la database et d'arrêter le server Web ou bloquer les connections entrantes – il s'agit d'une approche plutôt dangereuse – même si votre hébergement permettrait qu'elle se produise.

La seule manière pratique que je peux envisager de faire face à ce scénario est de redirect vers un nom d'hôte spécifique en cas de détection d'échec, donc, si vous avez actuellement les deux hôtes configurés comme http://www.example.com, ajoutez des loggings pour www1 .example.com et www2.example.com, puis ajoutez dans un file de pré-inclus automatique pour faire quelque chose comme:

(on www1.example.com) check_db(); // if check_db returns, then continue with normal processing... function check_db() { if (request is for www.example.com) { // avoid loops when both sites fail if (last check more than 10 secs ago) { if (database status bad) { raise a database failed flag on the filesystem redirect to www2.example.com end } } else { if (database failed flag set) { redirect to www2.example.com end } return OK } } else { // request is for www1.example.com ie we are already in failover mode if (database failed flag set) && (last check more than 5 secs ago) { if (database status good) { remove database failed flag return OK } else { // oh no! both hosts down! print sorry message and exit } } else if (last check more than 5 secs ago) { if (database status bad) { raise a database failed flag on the filesystem print sorry message and exit } } } return OK } 

Cependant, vous avez encore besoin de tester si la database fonctionne sans utiliser un appel de blocage.

HTH

C.

Vous requestz un échec, pas un équilibrage de charge, des problèmes.

L'échec est extrêmement difficile à bien, surtout avec des équipements qui ne se trouvent pas dans la même infrastructure. Le meilleur cas serait d'get un équilibreur de charge géographique redondant à votre FAI qui teste vos sites et gère le basculement de manière transparente. Comme je pense que c'est hors de votre budget, allons-y pour la méthode des bâtons et des chewing-gum.

Étant donné que votre problème apparemment est MySQL, pas le server Web, alors résolvent le problème.

Donné:

  • Host A: server Web et database MySQL
  • Host B: server Web et database MySQL redondante

La méthode que j'utiliserais serait:

  1. Enregistrez vos informations de connection de database sur un disque quelque part (évidemment pas dans la racine Web) et chargez-les sur chaque connection de page. Vous pouvez modifier les sites / default / settings.php de la manière suivante:

    $ db_url = file_get_contents ('/ some / private / dir / drupal-db.url');

  2. Écrivez un démon d'arrière-plan qui se connecte à la database toutes les 5 secondes (ou plus) et enregistre les pannes de manière lisible par machine sur le disque. Une fois la connection échouée après 30 secondes (ou plus), "échanger" les informations d'identification stockées sur le disque avec celles du server de sauvegarde. Cela fera en sorte que votre server Web serve du contenu à partir du server de database de rlocation. Si elle revient, inverser le process. L'logging est essentiel dans ce cas pour le debugging, etc.

  3. Si vous souhaitez avoir de la fantaisie, vous pouvez essayer d'save tous les INSERT et UPDATE sur le disque sur le server Web, de sorte que vous pouvez éventuellement re-synchroniser les bases après un basculement. Si c'est principalement "en lecture seule", cela peut ne pas être nécessaire.

Le point principal ici est de découpler l'échec à partir du fonctionnement de l'application Web. Il est plus modulaire et simplifie les modifications apscopes à l'application Web.

Enfin, assurez-vous que vous pouvez vous connecter à votre database de sauvegarde à partir du server principal. Vous pouvez le faire sur la command line et utiliser les commands de subvention:

Sur l'hôte B:

 mysql> GRANT ALL PRIVILEGES ON drupaldb.* TO username@'12.34.56.78' IDENTIFIED BY 'mypassword'; 

Où l'IP est de l'hôte A.

Et n'oubliez pas de rincer!

 mysql> FLUSH PRIVILEGES: 

Ensuite, testez:

 bash> mysql -u username -pmypassword -h hostb drupaldb 

D'aucune façon, il n'y a pas de technologie décente pour cela, count tenu de votre infrastructure.

  • Le DNS ne fonctionnera pas si vous ne maintenez pas votre timeout DNS limité SMALL (plage de secondes) qui est sur le point. Si vous pouvez le faire, vous pouvez le script correctement (le script sur le server 2 ne peut pas accéder au server 1, modifie ainsi les inputs DNS). C'est à peu près la seule façon de le faire.

  • Selon la configuration de votre DNS, ce serait soit là, soit – save une input d'hôte en utilisant quelque chose comme dyndns.org et replace votre input IN A par un CNAME. DynDNS.org a une API agréable que vous pouvez appeler via HTTP pour modifier l'input, et le CNAME ne changera jamais. Ils conservent également leurs domaines sur les TTL courts.

C'est à peu près toutes les options. Il y a d'autres pour cela, mais ils nécessitent beaucoup d'infrastructure que vous n'avez pas en place.

  • Changement d'adresse IP convivial
  • creuser (et d'autres outils) seulement returnner les loggings A
  • Serveur Mac Mini (10.6) derrière le routeur avec le nom d'hôte FQDN
  • Zones DNS et de search directe
  • W2K8 DNS - J'ai configuré le redirection conditionnelle correctement?
  • Échangez l'input DNS en cas d'échec
  • creuser le statut de return refusé?
  • Comment Traceroute résout-il les noms des routeurs?
  • comment redirect a.com vers www.a.com?
  • Prendre automatiquement le maître pour plusieurs files de zone
  • Nom d'hôte Windows ne résolvant pas l'input du file hôte
  • Les astuces du serveur de linux et windows, tels que ubuntu, centos, apache, nginx, debian et des sujets de rĂ©seau.