Windows から Debian に移行する際のリーダー選出に関する Zookeeper DNS 名の問題

Windows から Debian に移行する際のリーダー選出に関する Zookeeper DNS 名の問題

Windows 上の kafka/zookeeper クラスターを Debian wheezy に移行しています。

  • Javaバージョン: 1.7.0_80
  • Debian バージョン: 7.9
  • Zookeeper バージョン: 3.3.5+dfsg1-2 0
  • カフカバージョン: 2.10-0.8.2.1

Debian サーバーで他の Debian サーバーの IP アドレスを使用して zookeeper を構成すると、すべて正常に動作します。代わりに DNS 名を使用すると、Debian サーバーでリーダー選出が失敗します。

Debian サーバーでは、「host」コマンドを使用して他の Debian サーバーの IP を検索できるため、DNS 解決が機能しています。

サーバーの作成、Debian のインストール、Zookeeper のインストール、Zookeeper の設定など、すべてが自動化されているため、手動設定エラーが発生する時間は最小限に抑えられ、再現や変更も簡単です。

使用してclientPortAddress=DNSNAMEも違いはなく、依然として失敗します。iptables には何も設定されていません。これらのサーバー間にファイアウォールはありません。

以下では、サーバー 1 ~ 3 は Windows 2012R2 サーバー、サーバー 4 ~ 6 は Debian サーバーです。

この構成は機能します:

 server.1=testkafka400:2888:3888
 server.2=testkafka401:2888:3888
 server.3=testkafka402:2888:3888
 server.4=10.1.132.152:2888:3888
 server.5=10.1.132.153:2888:3888
 server.6=10.1.132.154:2888:3888

この設定は機能しません:

 server.1=testkafka400:2888:3888
 server.2=testkafka401:2888:3888
 server.3=testkafka402:2888:3888
 server.4=testkafka403:2888:3888
 server.5=testkafka404:2888:3888
 server.6=testkafka405:2888:3888

DNS名を使用すると、次の出力が表示されます。例外が繰り返されます。次のログは、次のものを含むクラスタ設定からのものであることに注意してください。のみDebian サーバーはテストのために DNS 名を使用しています。IP に切り替えると、クラスターは動作し、選挙を行うことができます。

[2015-11-03 13:55:52,309] INFO Reading configuration from: /etc/zookeeper/config/zookeeper.properties (org.apache.zookeeper.server.quorum.QuorumPeerConfig)
[2015-11-03 13:55:52,322] INFO Defaulting to majority quorums (org.apache.zookeeper.server.quorum.QuorumPeerConfig)
[2015-11-03 13:55:52,344] INFO autopurge.snapRetainCount set to 3 (org.apache.zookeeper.server.DatadirCleanupManager)
[2015-11-03 13:55:52,344] INFO autopurge.purgeInterval set to 24 (org.apache.zookeeper.server.DatadirCleanupManager)
[2015-11-03 13:55:52,345] INFO Purge task started. (org.apache.zookeeper.server.DatadirCleanupManager)
[2015-11-03 13:55:52,454] INFO Purge task completed. (org.apache.zookeeper.server.DatadirCleanupManager)
[2015-11-03 13:55:52,472] INFO Starting quorum peer (org.apache.zookeeper.server.quorum.QuorumPeerMain)
[2015-11-03 13:55:52,581] INFO binding to port 0.0.0.0/0.0.0.0:2181 (org.apache.zookeeper.server.NIOServerCnxnFactory)
[2015-11-03 13:55:52,601] INFO tickTime set to 3000 (org.apache.zookeeper.server.quorum.QuorumPeer)
[2015-11-03 13:55:52,601] INFO minSessionTimeout set to -1 (org.apache.zookeeper.server.quorum.QuorumPeer)
[2015-11-03 13:55:52,601] INFO maxSessionTimeout set to -1 (org.apache.zookeeper.server.quorum.QuorumPeer)
[2015-11-03 13:55:52,601] INFO initLimit set to 20 (org.apache.zookeeper.server.quorum.QuorumPeer)
[2015-11-03 13:55:52,626] INFO Reading snapshot /etc/zookeeper/data/version-2/snapshot.0 (org.apache.zookeeper.server.persistence.FileSnap)
[2015-11-03 13:55:52,675] INFO My election bind port: testkafka403.prod.local/127.0.1.1:3888 (org.apache.zookeeper.server.quorum.QuorumCnxManager)
[2015-11-03 13:55:52,713] INFO LOOKING (org.apache.zookeeper.server.quorum.QuorumPeer)
[2015-11-03 13:55:52,715] INFO New election. My id =  4, proposed zxid=0x100000014 (org.apache.zookeeper.server.quorum.FastLeaderElection)
[2015-11-03 13:55:52,717] INFO Notification: 1 (message format version), 4 (n.leader), 0x100000014 (n.zxid), 0x1 (n.round), LOOKING (n.state), 4 (n.sid), 0x1 (n.peerEpoch) LOOKING (my state) (org.apache.zookeeper.server.quorum.FastLeaderElection)
[2015-11-03 13:55:52,732] WARN Cannot open channel to 5 at election address testkafka404.prod.local/10.1.132.153:3888 (org.apache.zookeeper.server.quorum.QuorumCnxManager)
java.net.SocketTimeoutException
at java.net.SocksSocketImpl.remainingMillis(SocksSocketImpl.java:111)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:579)
at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:368)
at org.apache.zookeeper.server.quorum.QuorumCnxManager.toSend(QuorumCnxManager.java:341)
at org.apache.zookeeper.server.quorum.FastLeaderElection$Messenger$WorkerSender.process(FastLeaderElection.java:449)
at org.apache.zookeeper.server.quorum.FastLeaderElection$Messenger$WorkerSender.run(FastLeaderElection.java:430)
at java.lang.Thread.run(Thread.java:745)
[2015-11-03 13:55:52,737] WARN Cannot open channel to 6 at election address testkafka405.prod.local/10.1.132.154:3888 (org.apache.zookeeper.server.quorum.QuorumCnxManager)
java.net.ConnectException: Connection refused
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:579)
at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:368)
at org.apache.zookeeper.server.quorum.QuorumCnxManager.toSend(QuorumCnxManager.java:341)
at org.apache.zookeeper.server.quorum.FastLeaderElection$Messenger$WorkerSender.process(FastLeaderElection.java:449)
at org.apache.zookeeper.server.quorum.FastLeaderElection$Messenger$WorkerSender.run(FastLeaderElection.java:430)
at java.lang.Thread.run(Thread.java:745)
[2015-11-03 13:55:52,919] WARN Cannot open channel to 6 at election address testkafka405.prod.local/10.1.132.154:3888 (org.apache.zookeeper.server.quorum.QuorumCnxManager)
java.net.ConnectException: Connection refused
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:579)
at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:368)
at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectAll(QuorumCnxManager.java:402)
at org.apache.zookeeper.server.quorum.FastLeaderElection.lookForLeader(FastLeaderElection.java:840)
at org.apache.zookeeper.server.quorum.QuorumPeer.run(QuorumPeer.java:762)

DNS 名を使用できるようにしたいのですが、解決策をどこから探し始めればよいのかまったくわかりません。Debian または Java の重要な機能をインストールまたは有効化し忘れたのでしょうか?

答え1

さて、ここで何が起こっているのかはわかっています。Linux VM 上の Vagrant で 3 ノードの Spring-XD クラスターをセットアップしようとしたときに、同じ問題が発生しました。

この構成は機能しました:

server.1=172.28.128.3:2888:3888
server.2=172.28.128.4:2888:3888
server.3=172.28.128.7:2888:3888

しかし、これはそうではありませんでした:

server.1=spring-xd-1:2888:3888
server.2=spring-xd-2:2888:3888
server.3=spring-xd-3:2888:3888

「決定的な証拠」は、私の飼育係のログにある次の一文でした。

2015-11-26 20:48:31,439 [myid:1] - INFO [Thread-2:QuorumCnxManager$Listener@504] - 私の選挙バインド ポート: spring-xd-1/127.0.0.1:3888

では、Zookeeper がループバック インターフェイスの選択ポートをバインドしていたのはなぜでしょうか? そうですね...

/etc/hostsVM の 1 つでは次のようになりました。

127.0.0.1   spring-xd-1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

## vagrant-hostmanager-start
172.28.128.3    spring-xd-1
172.28.128.4    spring-xd-2
172.28.128.7    spring-xd-3
## vagrant-hostmanager-end

127.0.0.1行からホスト名を削除し/etc/hosts、3つのノードすべてでZookeeperサービスをバウンスし、バン!すべて順調に進みました。各マシンのホスト ファイルは次のようになります。

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

## vagrant-hostmanager-start
172.28.128.3    spring-xd-1
172.28.128.4    spring-xd-2
172.28.128.7    spring-xd-3
## vagrant-hostmanager-end

デフォルトではhosts ファイル ( ) にエントリがないため、Windows では問題が発生しなかったと思われますC:\Windows\System32\drivers\etc\hosts。同様の行を追加することで、Windows でも問題を再現できるはずです127.0.0.1

私はこれを Zookeeper のバグと呼んでいます。ホスト ファイルを編集するだけで、問題が判明し、Vagrant で修正できましたが、実際の環境ではお勧めしません。

編集:によるとhttp://ccl.cse.nd.edu/operations/condor/ホスト名.shtmlこれはLinux上のクラスタ化されたアプリケーションでかなり一般的な問題であるようで、上で説明したようにhostsファイルを編集することを推奨しています。しかし、クラスター設定に関する Zookeeper ドキュメントそれについては言及しません。

答え2

おそらくこの問題は、ノードをinhostnameに設定することによって発生します。この場合、ZK はアドレスにバインドされます。127.0.0.1/etc/hostsleader|election ports127.0.0.1

Config パラメータはquorumListenOnAllIPs=trueこの問題を解決し、election|leader portsにバインドする必要があります0.0.0.0

その他のオプションとその影響については、ZK 管理ガイド

常に確認しておくと良いソースコード

関連情報