2017-08-16 11 views
0

私はPythonでこの問題を発見しましたが、基本的なCプログラムでも再現できました。Python(でもCでも)gethostbynameによって変わった並べ替え

私はCentOS 6(7でもテスト済み)ですが、他のLinuxディストリビューションではテストしていません。

私は2つのVMにアプリケーションを持っています。 1つはIPアドレス10.0.13.30で、もう1つは10.0.13.56です。彼らはgethostbynameまたはgetaddrinfo(これはPythonのドキュメントで示唆されているものです)を使用してDNSベースの負荷分散(および高可用性)を可能にする共有FQDNを持っています。

クライアントアプリケーションが別のサブネット(例:10.0.12.x)にある場合、問題はありません。つまり、socket.gethostbyname(FQDN)はランダムに10.0.13.30と10.0.13.56を返しています。 クライアントアプリケーションが同じサブネットワーク上にある場合、常に同じエントリを返します。そして、それは常に "最も近い"ようです:私は10.0.13.31でそれをdepoyedし、常に10.0.13.30を返し、10.0.13.59では常に10.0.13.56を返します。 これらのサーバでは、pingやdigなどのCLIコマンドがほぼ毎回異なる順序で結果を返しています。

私は多くの主題を検索しましたが、これは一種の「優先順位付けglibc "を無効にする方法はありませんでした。 明らかに私のケースでは2つのクライアントと2つのサーバVMがVMware上に1台のルータに接続されているので、サーバのIPの最後のバイトがサーバの最後のバイトに最も近いということはわかりません。クライアントのIPが考慮されます。

これは私だけの異なるサブネット:-(に仮想マシンを移動することはオプションではありませんので、私は、顧客側で持っている問題の複製です....

誰もが持っています私は部分的にVMの設定を変更する必要があるので、私はそれを行うことができます。

+0

マシンが独自のホスト名を検索している場合、常に独自のIPアドレスが返されます。 –

答えて

0

標準のライブラリがロードバランシングを行うことを期待する代わりにsocket.getaddrinfo()を使用し、結果のホストの1つをランダムに選択します。これにより、最初に試したホストが使用できない場合でも、別のホストに簡単にフェイルオーバーできます。

関連する問題