Подтвердить что ты не робот

Kafka QuickStart, advertised.host.name дает kafka.common.LeaderNotAvailableException

Я могу получить простой one- node Kafka (kafka_2.11-0.8.2.1), работающий локально на одной машине linux, но когда я пытаюсь запустить производителя удаленно, я получаю некоторые запутанные ошибки.

Я следую руководству по быстрому старту в http://kafka.apache.org/documentation.html#quickstart. Я остановил процессы kafka и удалил все файлы zookeeper и karma в /tmp. Я нахожусь в локальной сети 10.0.0.0/24 NAT-ed с внешним IP-адресом, поэтому я изменил server.properties, чтобы сказать zookeeper, как транслировать мой внешний адрес, согласно https://medium.com/@thedude_rog/running-kafka-in-a-hybrid-cloud-environment-17a8f3cfc284:

advertised.host.name=MY.EXTERNAL.IP

Затем я запускаю это:

$ bin/zookeeper-server-start.sh config/zookeeper.properties
--> ...
$ export KAFKA_HEAP_OPTS="-Xmx256M -Xms128M" # small test server!
$ bin/kafka-server-start.sh config/server.properties
--> ...

Я открыл брандмауэр для своего продюсера на удаленной машине и создал новую тему и проверил ее:

$ bin/kafka-topics.sh --create --zookeeper MY.EXTERNAL.IP:2181 --replication-factor 1 --partitions 1 --topic test123
--> Created topic "test123".
$ bin/kafka-topics.sh --list --zookeeper MY.EXTERNAL.IP:2181
--> test123

Однако продюсер, которого я запускаю удаленно, дает мне ошибки:

$ bin/kafka-console-producer.sh --broker-list MY.EXTERNAL.IP:9092 --topic test123
--> [2015-06-16 14:41:19,757] WARN Property topic is not valid (kafka.utils.VerifiableProperties)
My Test Message
--> [2015-06-16 14:42:43,347] WARN Error while fetching metadata [{TopicMetadata for topic test123 -> 

Нет метаданных раздела для темы test123 из-за kafka.common.LeaderNotAvailableException}] для темы [test123]: class kafka.common.LeaderNotAvailableException(kafka.producer.BrokerPartitionInfo)   - > (повторяется несколько раз)

(я отключил весь брандмауэр, чтобы убедиться, что это не проблема.)

Ошибки stdout при запуске кармы повторяются: [2015-06-16 20:42:42,768] INFO Closing socket connection to /MY.EXTERNAL.IP. (kafka.network.Processor)

И controller.log дает мне это несколько раз:

java.nio.channels.ClosedChannelException
    at kafka.network.BlockingChannel.send(BlockingChannel.scala:100)
    at kafka.controller.RequestSendThread.liftedTree1$1(ControllerChannelManager.scala:132)
    at kafka.controller.RequestSendThread.doWork(ControllerChannelManager.scala:131)
    at kafka.utils.ShutdownableThread.run(ShutdownableThread.scala:60)
[2015-06-16 20:44:08,128] INFO [Controller-0-to-broker-0-send-thread], Controller 0 connected to id:0,host:MY.EXTERNAL.IP,port:9092 for sending state change requests (kafka.controller.RequestSendThread)
[2015-06-16 20:44:08,428] WARN [Controller-0-to-broker-0-send-thread], Controller 0 epoch 1 fails to send request Name:LeaderAndIsrRequest;Version:0;Controller:0;ControllerEpoch:1;CorrelationId:7;ClientId:id_0-host_null-port_9092;Leaders:id:0,host:MY.EXTERNAL.IP,port:9092;PartitionState:(test123,0) -> (LeaderAndIsrInfo:(Leader:0,ISR:0,LeaderEpoch:0,ControllerEpoch:1),ReplicationFactor:1),AllReplicas:0) to broker id:0,host:MY.EXTERNAL.IP,port:9092. Reconnecting to broker. (kafka.controller.RequestSendThread)

Запуск этого, похоже, указывает на то, что есть лидер в 0:

$ ./bin/kafka-topics.sh --zookeeper MY.EXTERNAL.IP:2181 --describe --topic test123
--> Topic:test123   PartitionCount:1    ReplicationFactor:1 Configs:
Topic: test123  Partition: 0    Leader: 0   Replicas: 0 Isr: 0

Я повторил этот тест, и мой server.log указывает, что есть лидер в 0:

...
[2015-06-16 21:58:04,498] INFO 0 successfully elected as leader (kafka.server.ZookeeperLeaderElector)
[2015-06-16 21:58:04,642] INFO Registered broker 0 at path /brokers/ids/0 with address MY.EXTERNAL.IP:9092. (kafka.utils.ZkUtils$)
[2015-06-16 21:58:04,670] INFO [Kafka Server 0], started (kafka.server.KafkaServer)
[2015-06-16 21:58:04,736] INFO New leader is 0 (kafka.server.ZookeeperLeaderElector$LeaderChangeListener)

Я вижу эту ошибку в журналах, когда я отправляю сообщение от производителя:

[2015-06-16 22:18:24,584] ERROR [KafkaApi-0] error when handling request Name: TopicMetadataRequest; Version: 0; CorrelationId: 7; ClientId: console-producer; Topics: test123 (kafka.server.KafkaApis)
kafka.admin.AdminOperationException: replication factor: 1 larger than available brokers: 0
    at kafka.admin.AdminUtils$.assignReplicasToBrokers(AdminUtils.scala:70)

Я предполагаю, что это означает, что брокер почему-то не найден? Я смущен, что это значит...

4b9b3361

Ответ 1

Итак, чтобы подвести итог, решением было добавить маршрут через NAT, чтобы машина могла получить доступ к своему внешнему IP-адресу.

Zookeeper использует адрес, который он находит в advertised.host.name, чтобы сообщать клиентам, где найти брокера, а также общаться с самим брокером. Сообщаемая ошибка не делает это очень ясным, и это запутывает, потому что у клиента нет проблем с открытием TCP-соединения.

Ответ 2

Установите для рекламируемого .host.name имя хоста, а не IP-адрес. По умолчанию возвращается FQDN с помощью getCanonicalHostName(), но это только лучшее усилие и возврат к IP. См. java docs для getCanonicalHostName().

Хитрость заключается в том, чтобы получить, что имя хоста всегда разрешено для правильного IP. Для небольших сред я обычно настраиваю все хосты со всеми своими внутренними IP-адресами в /etc/hosts. Таким образом, все машины знают, как разговаривать друг с другом по внутренней сети, по имени. Фактически, настройте клиентов Kafka по имени сейчас, а не по IP. Если управление всеми файлами /etc/hosts является бременем, установите внутренний DNS-сервер для его централизации, но внутренний DNS должен возвращать внутренние IP-адреса. Любой из этих параметров должен быть меньше работы, чем IP-адреса, разбросанные по различным файлам конфигурации на разных машинах.

Как только все связывается по имени, все, что осталось, это настроить внешний DNS с помощью внешних IP-адресов, и все просто работает. Это включает настройку клиентов Kafka с именами серверов, а не с IP-адресами.

Ответ 3

Для последних версий Kafka (0.10.0 на момент написания этой статьи) вы вообще не хотите использовать advertised.host.name. Фактически даже в [документации] указано, что advertised.host.name уже устарел. Кроме того, Kafka будет использовать это не только как "рекламируемое" имя хоста для производителей/потребителей, но и для других брокеров (в среде с несколькими брокерами)... что является видом боли, если вы используете другой (возможно, внутренний) DNS для брокеров... и вы действительно не хотите вступать в дело добавления записей в отдельный /etc/hosts брокеров (ew!)

Итак, в основном вы бы хотели, чтобы брокеры использовали внутреннее имя, но использовали внешние FQDN только для производителей и потребителей. Для этого вместо этого вы обновите advertised.listeners.

Ответ 4

Взяв cue сверху: для моего единственного node (пока все еще изучаю) я изменил файл server.properties с текстом "advertised.host.name" на value=127.0.01. Так что, наконец, это выглядит примерно так.

advertised.host.name = 127.0.0.1

При запуске производителя он все еще показывает предупреждение, но теперь он работает по-прежнему, пока я вижу сообщения на потребительском терминале, прекрасно готовые

Ответ 5

На вашей машине, где установлен Kafka, проверьте, запущена ли она. В этой ошибке указано 0 брокеров, что означает, что Kafka не работает и работает.

В Linux-машине вы можете использовать команду netstat, чтобы проверить, запущена ли служба.

netstat -an | grep port_kafka_is_Listening (по умолчанию 9092)

Ответ 6

Conf/server.properties: host.name DEPRECATED: используется только тогда, когда listeners не установлен. Вместо этого используйте listeners. имя хоста брокера. Если это установлено, оно будет привязываться только к этому адресу. Если это не задано, оно будет привязываться ко всем интерфейсам