web-dev-qa-db-ja.com

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

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

  • Javaバージョン:1.7.0_80
  • Debianバージョン:7.9
  • Zookeeperバージョン:3.3.5 + dfsg1-2 0
  • Kafkaバージョン: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名を使用すると、次の出力が表示されます-例外が繰り返されるだけです。以下のログは、テストのために、DNS名を使用してonlyDebianサーバーを含むクラスター設定からのものであることに注意してください。 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機能のインストールまたはアクティブ化を逃しましたか?

4

さて、私はここで何が起こっているのかについての考えを持っています。 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がループバックインターフェイスの選択ポートをバインドしていたのでしょうか。上手...

VMの/etc/hostsは次のようになりました。

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サービスと、BAM!すべてをバウンスしましたバラが登場しました。したがって、各マシンのHostファイルは次のようになります。

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

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

私はこれをZookeeperバグと呼んでいます。 hostsファイルを編集することは、問題を証明し、Vagrantで修正するのに十分ですが、「実際の」環境にはお勧めしません。

EDIT:http://ccl.cse.nd.edu/operations/condor/hostname.shtml によると、これはLinux上のクラスター化されたアプリではかなり一般的な問題のようです。上記で説明したように、hostsファイルを編集することをお勧めします。ただし、 クラスターセットアップに関するZookeeperのドキュメント には言及されていません。

7
sworisbreathing

おそらく、この問題は、127.0.0.1でノードhostname/etc/hostsに設定したことが原因で発生しました。この場合、ZKはleader|election ports127.0.0.1アドレスにバインドします。

構成パラメーターquorumListenOnAllIPs=trueはこの問題を修正し、election|leader ports0.0.0.0にバインドする必要があります。

その他のオプションとその影響については ZK管理ガイド を参照してください

常にチェックすることをお勧めします ソースコード

1
Tom Lime