Я переношу кластер kafka/zookeeper с Windows на Debian wheezy.
- Версия Java: 1.7.0_80
- Версия Debian: 7.9
- Версия Zookeeper: 3.3.5+dfsg1-2 0
- Версия Кафки: 2.10-0.8.2.1
Если я настраиваю zookeeper на серверах Debian с IP-адресами других серверов Debian, все работает нормально. Если я использую вместо этого имена DNS, выборы лидера на серверах Debian завершаются неудачей.
На серверах Debian я могу найти IP-адрес любого другого сервера Debian с помощью команды «host», поэтому разрешение 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
Хорошо, теперь я имею представление о том, что здесь происходит. Я столкнулся с той же проблемой, когда пытался настроить кластер Spring-XD из 3 узлов в Vagrant на виртуальных машинах Linux.
Эта конфигурация сработала:
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] - ИНФОРМАЦИЯ [Thread-2:QuorumCnxManager$Listener@504] - Мой порт привязки выборов: spring-xd-1/127.0.0.1:3888
Итак, почему Zookeeper привязывал порт выборов к интерфейсу обратной связи? Ну...
У меня /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
и отключил службу 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
Я предполагаю, что вы не увидели проблему в Windows, потому что файл hosts ( C:\Windows\System32\drivers\etc\hosts
) не имеет записей по умолчанию. Вы должны быть в состоянии воспроизвести проблему в Windows, добавив 127.0.0.1
в него похожую строку.
Я называю это ошибкой Zookeeper. Редактирование файла hosts было достаточно для того, чтобы доказать наличие проблемы и исправить ее в Vagrant, но я бы не рекомендовал это для любой «реальной» среды.
РЕДАКТИРОВАТЬ:В соответствии сhttp://ccl.cse.nd.edu/operations/condor/hostname.shtml, это, кажется, довольно распространенная проблема с кластеризованными приложениями в Linux, и рекомендует редактировать файл hosts, как я описал выше. Однако,Документация Zookeeper по настройке кластеране упоминает об этом.
решение2
Вероятно, эта проблема вызвана настройкой узла hostname
в 127.0.0.1
. /etc/hosts
В этом случае ZK будет привязан leader|election ports
к 127.0.0.1
адресу.
Параметр конфигурации quorumListenOnAllIPs=true
должен устранить эту проблему и привязаться election|leader ports
к 0.0.0.0
.
Дополнительные варианты и их влияние можно найти вРуководство по администрированию ZK
Всегда полезно проверитьисходный код.