é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.

  • Vérifiez tous les domaines gérés par un server DNS
  • Chiffons: Pourquoi le challenge DNS est-il statique?
  • OpenVPN se connecte et l'access à ip fonctionne mais pas dans le browser
  • Utilisation de LVS (Linux Virtual Server) pour faire DNS HA
  • Comment redirect le trafic vers une adresse IP vers une autre adresse IP sur Windows Server 2008
  • DNS sur Redhat - rdnc: aucun server spécifié et non par défaut
  • Clarifier les avantages de DNS Anycast - la caching DNS ne devrait-elle pas être irrévérencieuse?
  • IP simple avec DNS multiple
  • Puis-je configurer un alias DNS pour pointer vers une machine derrière le pare-feu?
  • Accès FreeIPA à partir d'Internet si dc = domaine, dc = local (freeipa.domain.local)
  • Une réponse de renvoi DNS est-elle toujours honorée?
  • Les astuces du serveur de linux et windows, tels que ubuntu, centos, apache, nginx, debian et des sujets de rĂ©seau.