Problemas de nomes DNS do Zookeeper com eleições de líderes ao migrar do Windows para o Debian

Problemas de nomes DNS do Zookeeper com eleições de líderes ao migrar do Windows para o Debian

Estou migrando um cluster kafka/zookeeper no Windows para o Debian wheezy.

  • Versão Java: 1.7.0_80
  • Versão Debian: 7.9
  • Versão do tratador do zoológico: 3.3.5+dfsg1-2 0
  • Versão Kafka: 2.10-0.8.2.1

Se eu configurar o zookeeper nos servidores Debian com endereços IP para os outros servidores Debian, tudo funcionará bem. Se eu usar nomes DNS, a eleição do líder falhará nos servidores Debian.

Nos servidores Debian, posso pesquisar o IP de qualquer outro servidor Debian usando o comando 'host', para que a resolução DNS esteja funcionando.

Tudo é automatizado: criação do servidor, instalação do Debian, instalação do zookeeper, configuração do zookeeper; portanto, a janela para erros de configuração manual é mínima e fácil de reproduzir ou alterar.

Usar clientPortAddress=DNSNAMEnão faz diferença; ainda falha. Não há nada configurado no iptables. Não há firewall entre esses servidores.

A seguir, os servidores 1-3 são servidores Windows 2012R2 e os servidores 4-6 são servidores Debian.

Esta configuração funciona:

 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

Esta configuração não funciona:

 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

Quando uso os nomes DNS, recebo a seguinte saída – onde as exceções apenas se repetem. Observe que o log a seguir é de uma configuração de cluster contendoapenasServidores Debian, usando nomes DNS, para fins de teste. Se eu mudar para IP, o cluster funciona e pode realizar uma eleição.

[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)

Nós realmente gostaríamos de poder usar nomes DNS, mas não temos mais ideia de onde devemos começar a procurar uma solução. Talvez tenhamos perdido a instalação ou ativação de um recurso importante do Debian ou Java?

Responder1

Ok, então tenho uma ideia do que está acontecendo aqui. Vi o mesmo problema ao tentar configurar um cluster Spring-XD de 3 nós no Vagrant, em VMs Linux.

Esta configuração funcionou:

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

Mas este não:

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

A "arma fumegante" era esta linha no meu registro do zookeeper:

26/11/2015 20:48:31,439 [myid:1] - INFO [Thread-2:QuorumCnxManager$Listener@504] - Minha porta de ligação eleitoral: spring-xd-1/127.0.0.1:3888

Então, por que o Zookeeper estava vinculando a porta eleitoral na interface de loopback? Bem...

Meu /etc/hostsem uma das VMs ficou assim:

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

Eu removi o nome do host da 127.0.0.1entrada /etc/hostse devolvi o serviço zookeeper em todos os 3 nós, eBAM!tudo surgiu rosas. Então, agora o arquivo host em cada máquina fica assim:

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

Suponho que você não viu o problema no Windows porque o arquivo hosts ( C:\Windows\System32\drivers\etc\hosts) não possui entradas por padrão. Você deve conseguir reproduzir o problema no Windows adicionando uma 127.0.0.1linha semelhante a ele.

Estou chamando isso de bug do Zookeeper. Editar o arquivo hosts foi bom o suficiente para provar o problema e corrigi-lo no Vagrant, mas eu não recomendaria isso para nenhum ambiente "real".

EDITAR:De acordo comhttp://ccl.cse.nd.edu/operações/condor/hostname.shtml, este parece ser um problema bastante comum com aplicativos em cluster no Linux e recomenda a edição do arquivo hosts conforme descrevi acima. No entanto, oDocumentação do Zookeeper sobre configuração de clusternão menciona isso.

Responder2

Provavelmente esse problema foi causado pela configuração do nó hostnamecomo 127.0.0.1in /etc/hosts. Neste caso, ZK será vinculado leader|election portsao 127.0.0.1endereço.

O parâmetro de configuração quorumListenOnAllIPs=truedeve solucionar esse problema e vincular-se election|leader portsao 0.0.0.0.

Mais opções e seu impacto podem ser encontradas emGuia de administração ZK

É sempre bom verificarCódigo fonte.

informação relacionada