Соответствующие настройки для регистрации информации о брокере / порте для Kafka Cluster

Я прочитал следующее из confluence wiki для kafka, и я цитирую его ниже:

Почему я вижу ошибку «Не следует устанавливать смещение конца журнала для раздела» в журнале брокера?

Как правило, вы увидите следующие ошибки.

kafka.common.KafkaException: не следует устанавливать смещение конца журнала для раздела [test, 22] локальной реплики 4 ОШИБКА [ReplicaFetcherThread-0-6], Ошибка для раздела [test, 22] посреднику 6: класс kafka.common. UnknownException (kafka.server.ReplicaFetcherThread)

Распространенная проблема заключается в том, что несколько брокеров зарегистрировали один и тот же хост / порт в Zookeeper. В результате сборщик реплик запутывается при получении данных от лидера. Чтобы убедиться в этом, вы можете использовать клиентскую оболочку Zookeeper для отображения регистрационной информации каждого брокера. Путь Zookeeper и формат регистрации брокера описаны в структурах данных Kafka в Zookeeper. Вы хотите убедиться, что все зарегистрированные брокеры имеют уникальный хост / порт.

Согласно официальной документации, если я сделаю PLAINTEXT://:9092, все интерфейсы будут регистрироваться с использованием 9092 порта. 0.0.0.0 означает, что интерфейс по умолчанию будет регистрироваться с использованием порта 9092.

Если это правда, то я не понимаю, как 0.0.0.0:9092 регистрация брокера никогда не запутает zookeeper? Я думаю, что если я явно не укажу имя хоста или ipaddr с именем порта, Zookeeper всегда запутается, поскольку все брокеры будут регистрироваться с одним и тем же интерфейсом и номером порта. Я подтвердил это, используя Zookeeper-shell.bat и выполняя команду get /broker/ids/{id} command.

Следующее - из запроса клиентской оболочки Zookeeper на /brokers/ids

get /brokers/ids/1
{"listener_security_protocol_map":{"PLAINTEXT":"PLAINTEXT"},"endpoints":["PLAINTEXT://0.0.0.0:9092"],"jmx_port":-1,"host":"0.0.0.0","timestamp":"1500646657734","port":9092,"version":4}
cZxid = 0xe0000000f
ctime = Fri Jul 21 14:17:37 UTC 2017
mZxid = 0xe0000000f
mtime = Fri Jul 21 14:17:37 UTC 2017
pZxid = 0xe0000000f
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x15d6582c70b0001
dataLength = 184
numChildren = 0
get /brokers/ids/2
{"listener_security_protocol_map":{"PLAINTEXT":"PLAINTEXT"},"endpoints":["PLAINTEXT://0.0.0.0:9092"],"jmx_port":-1,"host":"0.0.0.0","timestamp":"1500646657006","port":9092,"version":4}
cZxid = 0xe0000000b
ctime = Fri Jul 21 14:17:37 UTC 2017
mZxid = 0xe0000000b
mtime = Fri Jul 21 14:17:37 UTC 2017
pZxid = 0xe0000000b
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x15d6582c70b0000
dataLength = 184
numChildren = 0
get /brokers/ids/3
{"listener_security_protocol_map":{"PLAINTEXT":"PLAINTEXT"},"endpoints":["PLAINTEXT://0.0.0.0:9092"],"jmx_port":-1,"host":"0.0.0.0","timestamp":"1500646656895","port":9092,"version":4}
cZxid = 0xe00000008
ctime = Fri Jul 21 14:17:36 UTC 2017
mZxid = 0xe00000008
mtime = Fri Jul 21 14:17:36 UTC 2017
pZxid = 0xe00000008
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x35d6582c7800000
dataLength = 184
numChildren = 0

У кого-нибудь есть идея получше?


person ha9u63ar    schedule 22.07.2017    source источник
comment
0.0.0.0:9092 должен преобразоваться в IP-адрес интерфейса по умолчанию перед регистрацией в zookeeper, поэтому вы должны увидеть 192.168.72.3 или любой другой IP-адрес интерфейса хоста по умолчанию. Пожалуйста проверьте и подтвердите.   -  person Hans Jespersen    schedule 23.07.2017
comment
@HansJespersen обновил вопрос с моим выводом zk. Кроме того, я думаю, это не будет иметь большого значения (смею сказать!), Но ОС - это Windows? Мне плакать?   -  person ha9u63ar    schedule 23.07.2017
comment
По крайней мере, zookeeper видит три уникальных идентификатора брокера, что является самым важным. Просто не запускайте другого брокера с ID 1, 2 или 3, иначе у вас возникнут проблемы. Вы должны настроить объявленный параметр прослушивателя в server.properties, чтобы он был правильным IP-адресом каждого брокера, чтобы любые клиенты могли связаться с брокерами.   -  person Hans Jespersen    schedule 23.07.2017
comment
@HansJespersen В качестве альтернативы использование PLAINTEXT://hostname:port также должно работать, верно? Должны ли мы вообще рекомендовать какие-либо дополнительные примечания в документации по этому поводу?   -  person ha9u63ar    schedule 23.07.2017
comment
Имя хоста не всегда уникально, поэтому полное доменное имя еще лучше   -  person Hans Jespersen    schedule 23.07.2017


Ответы (1)


В kafka server.properties есть два ключа свойств:

слушатели

Адрес, который прослушивает сервер сокетов. Он получит значение, возвращенное из java.net.InetAddress.getCanonicalHostName (), если не настроено.
ФОРМАТ:
listeners = listener_name: // host_name: port
ПРИМЕР:
listeners = PLAINTEXT: //your.host.name: 9092

рекламируемые слушатели

Имя хоста и порт, которые брокер будет рекламировать производителям и потребителям. Если не установлен, он использует значение для «слушателей», если настроено. В противном случае он будет использовать значение, возвращенное из java.net.InetAddress.getCanonicalHostName ().

OK. Обратите внимание на детали для рекламируемых слушателей. если вы не настроите это свойство, оно будет использовать слушателей по умолчанию. когда вы установите для слушателей значение 0.0.0.0:9092, он будет прослушивать весь сетевой интерфейс вашего сервера Kafka. Но если рекламируемые слушатели также установлены на 0.0.0.0, тогда другие не будут знать, как подключиться к вашему серверу Kafka, потребителю, производителю и Zookeeper. все они не смогут найти, где находится ваш сервер Kafka.

Таким образом, в рекламируемых слушателях должен быть установлен ваш общедоступный сетевой IP-адрес, который другой компьютер в Интернете может подключиться к вашему серверу с этим IP-адресом.

person GuangshengZuo    schedule 23.07.2017
comment
@qfhyj Хорошо, я понял. Но IP-адреса не всегда статичны и могут измениться из-за переназначения адреса NAT. Итак, всегда ли он будет работать с IP-адресом. Как следует из комментария Ханса выше, не лучше ли полное доменное имя? - person ha9u63ar; 23.07.2017
comment
Оба могут работать, если работает команда ping. Что касается того, что лучше, я думаю, это зависит от количества ваших машин. - person GuangshengZuo; 23.07.2017
comment
@qfhyj да, согласен. Я очень хочу использовать полное доменное имя, например mymachinewNo.myavailabilitydomain.com. Но теперь я понимаю это и спасибо за объяснение проблемы привязки интерфейса выше. - person ha9u63ar; 23.07.2017