Kafka QuickStart, advertised.host.name daje Kafkę.pospolite.LeaderNotAvailableException

Jestem w stanie uzyskać prostą Kafkę z jednym węzłem (kafka_2.11-0.8.2.1) działającą lokalnie na jednej maszynie linuksowej, ale kiedy próbuję uruchomić producenta zdalnie, dostaję kilka mylących błędów.

Podążam za przewodnikiem quickstart na http://kafka.apache.org/documentation.html#quickstart . zatrzymałem procesy Kafki i usunąłem wszystkie pliki zookeeper & karma w /tmp. Jestem na lokalnym 10.0.0.0 / 24 sieci nat-ed z zewnętrznym adresem IP, więc zmodyfikowałem server.properties aby powiedzieć zookeeper Jak nadawać mój adres zewnętrzny, zgodnie z https://medium.com/@thedude_rog/running-kafka-in-a-hybrid-cloud-environment-17a8f3cfc284:

advertised.host.name=MY.EXTERNAL.IP

Potem uruchamiam to:

$ 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
--> ...
[10]}otworzyłem firewall dla mojego producenta NA zdalnej maszynie, i stworzyłem nowy temat i zweryfikowałem go: [11]}
$ 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

Jednak producent, który uruchamiam zdalnie, daje mi błędy:

$ 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 -> 

Brak metadanych partycji dla tematu test123 ze względu na kafka.pospolite.LeaderNotAvailableException}] dla tematu [test123]: class kafka.pospolite.LeaderNotAvailableException (kafka.producent.Brokerpartioninfo) -- >(powtórzone kilka razy)

(wyłączyłem cały firewall, aby upewnić się, że to nie był problem.)

Błędy stdout w uruchomieniu karmy są powtarzane: [2015-06-16 20:42:42,768] INFO Closing socket connection to /MY.EXTERNAL.IP. (kafka.network.Processor)

I kontrolera.log daje mi to kilka razy:

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)

Prowadzenie tego wydaje się wskazywać, że jest lider w 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

Przeskanowałem ten test i mój serwer.log wskazuje, że jest lider na 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)

Widzę ten błąd w logach kiedy wysyłam wiadomość od producenta:

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

Zakładam, że oznacza to, że brokera nie można znaleźć z jakiegoś powodu? Nie wiem, co to znaczy...

Author: mikebridge, 2015-06-17

6 answers

W przypadku najnowszych wersji Kafka (0.10.0 w chwili pisania tego tekstu), nie chcesz w ogóle używać advertised.host.name. W rzeczywistości nawet [dokumentacja] stwierdza, że advertised.host.name jest już przestarzała. Ponadto Kafka będzie używać tej nazwy nie tylko jako "reklamowanej" nazwy hosta dla producentów / konsumentów, ale także dla innych brokerów (w środowisku wielu brokerów)...co jest rodzajem bólu, jeśli używasz innego (być może wewnętrznego) DNS dla brokerów...i naprawdę nie chcesz dostać się do biznes polegający na dodawaniu wpisów do poszczególnych /etc/hosts brokerów (ew!)

Więc, zasadniczo, chcielibyście, aby brokerzy używali nazwy wewnętrznej, ale używali zewnętrznych FQDNs tylko dla producentów i konsumentów . Aby to zrobić, zaktualizujesz advertised.listeners.

 29
Author: Dexter Legaspi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-15 19:38:27

Zestaw advertised.host.name do hosta Nazwa, a nie adres IP. Domyślnie zwraca FQDN używając getCanonicalHostName(), ale jest to tylko najlepszy wysiłek i wraca do adresu IP. Zobacz dokumenty java dla getCanonicalHostName () .

Sztuczka polega na tym, aby nazwa hosta zawsze odpowiadała poprawnemu IP. W przypadku małych środowisk Zwykle konfiguruję wszystkie hosty ze wszystkimi ich wewnętrznymi adresami IP w /etc / hosts. W ten sposób wszystkie maszyny wiedzą, jak rozmawiać z każdym inne w sieci wewnętrznej, z nazwy. W rzeczywistości skonfiguruj swoich klientów Kafka również po nazwie, a nie po IP. Jeśli zarządzanie wszystkimi plikami/etc / hosts jest obciążeniem, skonfiguruj wewnętrzny serwer DNS, aby go scentralizował, ale wewnętrzny DNS powinien zwrócić wewnętrzny IPs . Każda z tych opcji powinna mieć mniej pracy niż posiadanie adresów IP rozrzuconych po różnych plikach konfiguracyjnych na różnych komputerach.

Gdy wszystko komunikuje się po imieniu, pozostaje tylko skonfigurować zewnętrzne DNS z zewnętrznym IP i wszystko po prostu działa. Obejmuje to konfigurację klientów Kafka z nazwami serwera , a nie IPs.

 25
Author: Cedar Myers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-04 14:14:49

PodsumowujÄ ... c, rozwiÄ ... zaniem byĹ 'o dodanie trasy przez NAT, aby maszyna mogĹ' a uzyskaÄ ‡ dostÄ ™ p do swojego wĹ ' asnego zewnÄ ™ trznego adresu IP.

Zookeeper używa adresu, który znajduje w advertised.host.name zarówno aby powiedzieć klientom, gdzie znaleźć brokera, jak i komunikować się z samym brokerem. Zgłaszany błąd nie wyjaśnia tego bardzo jasno i jest mylący, ponieważ klient nie ma problemu z otwarciem połączenia TCP.

 17
Author: mikebridge,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-19 22:03:48

Biorąc sygnał z góry: dla mojego pojedynczego węzła (jeszcze ucząc się) zmodyfikowałem serwer.Plik Właściwości posiadający tekst "advertised.host.name" do value=127.0.01. Więc w końcu wygląda to mniej więcej tak

Advertised. host. name=127.0.0.1

Podczas uruchamiania producenta nadal wyświetla ostrzeżenie, ale teraz przynajmniej działa, podczas gdy widzę komunikaty na terminalu konsumenckim doskonale dochodzące

 7
Author: Abhijit Sinha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-12 18:04:45

Na komputerze, na którym zainstalowano Kafkę, sprawdź, czy jest uruchomiona. Stany błędu, 0 brokerów są dostępne, co oznacza, że Kafka nie jest uruchomiony.

Na komputerze z Linuksem możesz użyć polecenia netstat, aby sprawdzić, czy usługa jest uruchomiona.

Netstat-an / grep port_kafka_is_Listening (domyślnie 9092)

 1
Author: LearningAboutTech,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-18 15:05:42

Conf/server.właściwości: host.name DEPRECATED: używane tylko wtedy, gdy listeners nie jest ustawione. Zamiast tego użyj listeners. Nazwa hosta brokera. Jeśli ta opcja jest ustawiona, będzie powiązana tylko z tym adresem. Jeśli to nie jest ustawione, spowoduje powiązanie ze wszystkimi interfejsami

 1
Author: Tony.Cruise,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-23 02:34:24