2017-08-16 48 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()並且明確地隨機選擇一個生成的主機,如果你嘗試的第一個主機不可用,這也可以很容易地故障轉移到另一個主機上