2017-08-16 43 views
0

我发现这个问题在Python中,但我也能够重现它与一个基本的C程序。Python(但也C)奇怪的排序完成由gethostbyname

我在CentOS 6(测试也在7),我还没有在其他的Linux发行版上测试过。

我有2个虚拟机的应用程序。一个IP地址为10.0.13.30,另一个为10.0.13.56。他们有一个共享的FQDN,以允许使用gethostbyname或getaddrinfo进行负载均衡(和高可用性)DNS(这是Python doc中建议的)。

如果我的客户端应用程序在不同的子网上(例如10.0.12.x),我没有问题:socket.gethostbyname(FQDN)随机返回10.0.13.30和10.0.13.56。 但是,如果我的客户端应用程序在同一个子网络上,它总是返回相同的条目。它似乎始终是“最接近的”:我在10.0.13.31上放弃了它,它总是返回10.0.13.30,10.0.13.59它总是返回10.0.13.56。 在这些服务器上,CLI和命令(如ping和dig)几乎每次都以不同的顺序返回结果

我搜索了很多主题,并得出结论认为它似乎是一种“优先级,以提高成功机会glibc“,但我还没有找到任何方法来禁用它。 因为在我的情况很明显,2个客户端和2个服务器虚拟机在连接到单个路由器的VMware上,所以我没有看到服务器的IP的最后一个字节与最后一个字节最接近的事实考虑客户的IP。

这是我在客户端的问题的复制,所以它不是我的选择,只是移动虚拟机到不同的子网:-(....

任何人有一个想在同一子网中有正确的负载平衡?我可以部分控制VM配置,所以如果必须改变设置,我可以做到这一点。

+0

如果一台机器正在查找自己的主机名,它将始终返回自己的IP地址。 –

回答

0

而不是希望标准库将负责平衡你可以使用socket.getaddrinfo()并且明确地随机选择一个生成的主机,如果你尝试的第一个主机不可用,这也可以很容易地故障转移到另一个主机上