1 votes

La répartition de charge de basculement par iptables est-elle possible ?

Je m'amuse avec iptables dans mon laboratoire domestique. Mon premier objectif est de regrouper ma communication active directory dans une seule adresse IP virtuelle de répartition de charge. J'ai utilisé la chaîne prerouting pour cela. À des fins de test, j'ai commencé uniquement avec le service DNS. Mes règles ressemblent à ceci :

-A PREROUTING -d 10.0.0.1 -p udp --dport 53 -j DNAT --to-destination 192.168.2.1:53

-A PREROUTING -d 10.0.0.1 -p udp --dport 53 -j DNAT --to-destination 192.168.2.2:53
  • 10.0.0.1 est l'adresse VIP désirée.
  • 192.168.2.1 et 192.168.2.2 sont les serveurs DC.

La VIP fonctionne, j'obtiens une réponse DNS. Cependant, si je débranche la carte réseau du premier DC, la réponse DNS expirera. J'ai vérifié, à partir de 192.168.2.2, ça fonctionne, donc ce n'est pas un échec du serveur.

Je sais que c'est parce que mes règles ne font techniquement pas de répartition de charge, ni de basculement. Ça échoue car ça ne suit que la première règle. J'ai essayé de définir une plage IP dans une seule règle, mais cela n'a pas aidé non plus.

J'ai aussi essayé des choses, comme la probabilité statistique et nth ou socket, mais aucun d'entre eux n'a fonctionné.

Y a-t-il un module dans iptables pour résoudre ce cas ?

0voto

Martin Broadhurst Points 3777

Oui, c'est possible. CLUSTERIP cible est conçu spécifiquement pour cela.

Il est configuré en attribuant la même adresse IP à tous les nœuds, mais en filtrant l'accès à environ 1/N de toutes les connexions traitées par chaque nœud. Il est conçu de telle sorte que si les N nœuds sont configurés avec tous les mêmes paramètres à l'exception de --local-node prenant les valeurs 0, 1, ..., N-1, alors toutes les connexions sont traitées — chaque connexion sera attribuée à un et un seul nœud.

Cependant, cela seul n'est pas suffisant. Lorsqu'un nœud est hors service, la part des connexions qui auraient dû être traitées par lui ne sera considérée par personne. Pour résoudre ce problème, tous les nœuds restants doivent être reconfigurés avec de nouvelles valeurs de --total-nodes et --local-node. Pour cette raison, il n'est pas conçu pour être exécuté manuellement. Vous avez besoin d'un agent qui vérifiera constamment tous les nœuds et reconfigurera le CLUSTERIP sur tous les nœuds en temps réel.

En général, la pile de clustering Pacemaker + Corosync est utilisée, avec un agent ClusterIP pour contrôler ce type d'équilibrage de charge. Il s'occupera de tout le travail fastidieux : vérifier quels nœuds sont actifs, configurer les règles iptables ; il peut également faire plus, comme définir "actif" comme "le service Apache est en cours d'exécution et accepte des connexions". En général, Pacemaker est une pile de clustering très capable.

Comme ce module est incapable de prendre en compte la charge réelle des nœuds, il n'est pas beaucoup utilisé pour les services finaux. Cependant, si vous souhaitez avoir plusieurs nœuds de répartition de charge de niveau supérieur tels que HAProxy ou Nginx qui répartissent intelligemment les back-ends web (ou autres) réels, pour rendre la ferme de répartition de charge elle-même hautement disponible, vous configurez un équilibrage de charge de type CLUSTERIP pour eux.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X