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=DNSNAME
nã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/hosts
em 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.1
entrada /etc/hosts
e 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.1
linha 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ó hostname
como 127.0.0.1
in /etc/hosts
. Neste caso, ZK será vinculado leader|election ports
ao 127.0.0.1
endereço.
O parâmetro de configuração quorumListenOnAllIPs=true
deve solucionar esse problema e vincular-se election|leader ports
ao 0.0.0.0
.
Mais opções e seu impacto podem ser encontradas emGuia de administração ZK
É sempre bom verificarCódigo fonte.