2017-08-16 3 views
0

J'ai trouvé ce problème en Python mais j'ai aussi pu le reproduire avec un programme C de base.Python (mais aussi C) Tri étrange effectué par gethostbyname

Je suis dans CentOS 6 (testé aussi sur 7), je n'ai pas testé sur d'autres distributions Linux.

J'ai une application sur 2 machines virtuelles. L'un a l'adresse IP 10.0.13.30 et l'autre 10.0.13.56. Ils ont un nom de domaine complet partagé pour permettre l'équilibrage de charge (et la haute disponibilité) DNS basé sur gethostbyname ou getaddrinfo (c'est ce qui est suggéré dans doc Python).

Si mon application client est sur un sous-réseau différent (10.0.12.x par exemple), je n'ai aucun problème: socket.gethostbyname (FQDN) retourne aléatoirement 10.0.13.30 et 10.0.13.56. Mais si mon application client est sur le même sous-réseau, elle renvoie toujours la même entrée. Et il semble être toujours le "plus proche": je l'ai depoyed le 10.0.13.31 et il retourne toujours 10.0.13.30 et le 10.0.13.59 il retourne toujours 10.0.13.56. Sur ces serveurs, les commandes CLI telles que ping et dig retournent le résultat dans des ordres différents presque chaque fois

J'ai cherché beaucoup de sujets et j'ai conclu qu'il semble être une sorte de "priorisation pour améliorer les chances de succès faites par glibc "mais je n'ai trouvé aucun moyen de le désactiver. Parce que clairement dans mon cas les 2 clients et les 2 serveurs VM sont sur le VMware connecté à un seul routeur, donc je ne vois pas comment le dernier octet de l'IP du serveur est le plus proche du dernier octet du L'adresse IP du client est prise en compte.

Ceci est une reproduction d'un problème que j'ai à côté client il est donc pas une option pour moi de passer simplement les machines virtuelles à un autre sous-réseau :-(....

Tout le monde a une Pour pouvoir équilibrer la charge dans le même sous-réseau, je peux contrôler partiellement la configuration de la machine virtuelle, donc si un paramètre doit être modifié, je peux le faire

+0

Si une machine recherche son propre nom d'hôte, elle renvoie toujours sa propre adresse IP. –

Répondre

0

Au lieu d'espérer que la bibliothèque standard fera l'équilibrage de charge pour vous utilisez socket.getaddrinfo() et choisissez l'un des hôtes résultants au hasard de façon explicite, ce qui facilitera également le basculement vers un hôte différent si le premier que vous essayez n'est pas disponible