Горько-сладкая дорога Кафки, заполненная ямами

задняя часть Kafka

Введение

Мало знаний, большой вызов! Эта статья участвует в "Необходимые знания для программистов«Творческая деятельность.

Эта статья участвовала в "Проект «Звезда раскопок»”, чтобы выиграть творческий подарочный пакет и бросить вызов творческим поощрительным деньгам.

всем привет.

kafkaЭто распределенная платформа распределенного потока сообщений с несколькими разделами и несколькими копиями на основе Zookeeper, а также с открытым исходным кодом.Система обработки сообщений на основе режима публикации-подписки.

Отдел блогера использует kafka как middleware сообщений.Не так давно столкнулся со странным багом.На поиск проблемы ушло много сил,поэтому запишу сюда.

2. Происхождение ошибки

Одна из функций модуля, за который я отвечаю, — изменение сетевого IP-адреса хоста.

Страница функций выглядит следующим образом

image-20211027153242806.png

После ввода адреса IPV4 адрес хоста, на котором находится служба, будет изменен.

先说一下背景:Все сервисы в тестовой среде распределены на одной машине.После модификации IP нужно модифицировать конфигурацию центра конфигурации nacos синхронно, и каждое промежуточное ПО считывает конфигурацию системных переменных окружения. Затем перезагружается вся машина, после чего автоматически запускаются docker-контейнеры различных бизнес-приложений и промежуточного ПО.

С точки зрения спроса логика реализации относительно проста: Java-программа вызывает сценарий оболочки для выполнения некоторых операций на хосте, а затем перезапускает машину.

Код функции пишется одним кликом.

После написания теста ifconfig видит, что ip изменен, docker ps видит, что контейнер запускается нормально, а front-end просто тестирует какие-то функции, все в норме.

Так мило, я действительно гений кодинга~

image.png

После теста испытательница сказала мне, что записи операций системы не сформированы, а записи операций равномерно перехватываются и отправляются в kafka, которые потребляются и записываются в es специальным лог-модулем.

Ган! Эта функция также была разработана недавно, я только что закончил серию исправлений ошибок, и после самотестирования проблем нет. Глядя на код, последняя запись коммита этого модуля тоже принадлежит мне.

image.png

Странный.

Взгляните на журнал в фоновом режиме и распечатайте журнал WARN как сумасшедший.

1 partitions have leader brokers without a matching listener...

Я зашел в контейнер кафки и посмотрел на потребление сервиса.

kafka-consumer-groups.sh --bootstrap-server 127.0.0.1:9092 --group baiyan-topic --describe

Видя, что ситуация с потреблением относительно запаздывает, давайте посмотрим на данные топика владельца карты

kafka-console-consumer.sh --bootstrap-server 127.0.0.1:9092 --topic baiyan-topic --offset 373159  --partition 0 

Данные

{省略业务字段,"createTime":"2021-10-20 16:27:39.447","updateTime":"2021-10-20 16:27:39.447"}

какие?

Почему это время кажется таким близким ко времени, когда я обновил IP-адрес тестовой среды?

На данный момент потребитель не может обработать большое количество сообщений!

image.png

3. Найдите проблему

3.1 ошибка гугла

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

Хорошо, здесь у нас есть только два источника ошибок или входов для решения проблем.

1. Сообщение об ошибке: 1 partitions have leader brokers without a matching listener

2. Изменить IP:После изменения IP-адреса сообщения Kafka накапливаются и не могут быть использованы. Судя по подсказке, это связано с тем, что в разделе нет ведущего узла.

Хорошо, давайте начнем исправлять ошибку, первый шаг, гуглите, хахахаха~

Поиск в гугле:1 partitions have leader brokers without a matching listener

Ответы, данные в Интернете, обычно касаются:

  1. Сервер, на котором расположен раздел kafka, не работает, и перебалансировка не удалась.
  2. Брандмауэр не закрыт, что приводит к сбою сети.
  3. Неверная конфигурация IP-адреса прокси.

image-20211027165004202.png

по одному

Первый пункт:Глядя на контейнер kafka, загрузка нормальная, а если добавить тему, то ее тоже можно нормально отправить и потреблять, исключено!

Второй пункт:Брандмауэр не включен, даже если включен, порт все равно открыт, исключите!

Третий пункт:От Google, это должен быть ответ.

Взгляните на содержимое файла конфигурации

cat /opt/kafka/config server.properties 

Параметры, относящиеся к ip, являются нормальными и были изменены на целевое значение ip, а все указанные выше конфигурации прокомментированы.

image-20211027165922400.png

Мы используем более раннюю конфигурацию

advertised.host.name=目标ip

Но выхода не было, я все же решил попробовать, модифицировал конфигурацию в соответствии с работой в Интернете и перезапустил.

Результат, как и ожидалось, совершенно бесполезен.

image.png

3.2. Переключите ip, чтобы начать

После google окончательные результаты поиска касаются конфигурации и сетевых проблем построения кластера kafka, которые в основном совпадают с поисковым контентом 3.1.

сдаться.

image.png

3.3 Начнем с принципа

В то время было все еще немного неудобно после попытки использовать информацию, найденную двумя подсказками 3.1 и 3.2, для решения проблемы, но безрезультатно. Не знаю, с чего начать.

Если подумать, прямое взаимодействие между kafka и потребителями, а также информация о синхронизации, такая как информация о кластере kafka, сохраняется в zookeeper.

Ну, приходите и смотрите один за другим.

Давайте сначала разберемся в теме

bash-4.4# kafka-topics.sh  --zookeeper 127.0.0.1:2181 --topic baiyan-topic --describe    
​
Topic: baiyan-topic   PartitionCount: 1       ReplicationFactor: 1    Configs: 
Topic: baiyan-topic   Partition: 0    Leader: none    Replicas: 1001  Isr: 1001

Хорошо, я нашел здесь подсказку, Лидер - None, но L не использует его, и это видно по ошибке.

Перейдите к контейнеру zookeeper, чтобы увидеть информацию о kafka.

Перейдите в каталог bin

1. Проверьте раздел

ls /brokers/topics/baiyan-topic/partitions
​
[0]

2. Проверьте идентификатор брокера

ls /brokers/ids
​
[1002]

До сих пор, вы заметили какие-либо различия?

Идентификатор брокера на zookeeperОно стало1002,нотематическое письмо в кафкеИнформационная копия и информация об узле Isr по-прежнему1001.

Kafka должен получить информацию об узле брокера от zookeeper для построения кластера Kafka не может найти 1002 узла на zookeeper, поэтому лидера нет, и кластер не может быть построен.

хорошо, теперь вы знаете, что вызвало эту ошибку~

image.png

3.4 Анализ причин

3.3 Мы уже знаем, что вызывает блокировку сообщений. Так в чем причина несоответствия информации брокера на zk и kafka?

Прорыв на самом деле совершенно ясен.Брокеры непоследовательны, поэтому давайте рассмотрим несколько факторов, определяющих генерацию BrokerId.

Цитата из блога Чжу Сяоси, автора книги «Углубленное понимание Кафки»:Подробное объяснение параметра Kafka broker.id

image-20211027194233996.png

Из вышеизложенного видно, что BrokerId определяется в основном из двух файлов,server.propertiesиmeta.properties

Сначала посмотрите на конфигурацию server.properties

image-20211027194453959.png

-1 — это автоматическое размещение, конфигурация по умолчанию начинается с 1001, а информация о теме, соответствующая kafka, — 1001.

Взгляните еще раз на meta.properties

Существуйте в каталоге конфигурации log.dirs сервера.properties, просмотрите конфигурацию

cluster.id=uHTKS_74RhW2_wKwbuwHxQ
version=0
broker.id=1002

Молодец, нашел проблему! ! ! !

image.png

脚本修改ip后,修改了log.dirs,新生成了一个数据目录。重启kafka后,原先的topic内部的brokerid并未修改。而zk上,只要kafka节点下线了,1001节点数据被抹除,kafka重启后,新的log.dirs的数据目录生成。又因为server.properties上brokerId配置的是-1,由kakfa进行自增,从1001增加到1002,写入到的log.dirs目录下,并将1002节点注册到zk上,最终到了kafka与zk上互相不一致。

4. Решить проблему

После того, как вы узнаете причину, идея решения проблемы становится очень ясной, если вы гарантируете, что BrokerId вновь сгенерированного каталога данных согласуется с BrokerId в теме после изменения ip.

метод первый:

Восстановите свойство broker.id в meta.properties в новом каталоге log.dirs на 1001, перезапустите kafka и синхронизируйте 1001 с zk.

Слишком глупо лечить симптомы, но не первопричину, в режиме кластера id каждой ноды не известен и требуется вмешательство человека.

Способ второй:

Каждый узел kafka указывает значение broker.id в server.properties, которое не генерируется динамически.

5. Резюме

В этой статье анализируется проблема, заключающаяся в том, что Kafka не может использовать данные узла после того, как хост изменит IP-адрес. Описан процесс устранения ошибок от простого к сложному. Наконец, была обнаружена ошибка несовместимости broker.id.

Поскольку тестовая среда представляет собой одну машину, мы не указали Broker.id, и динамическая генерация идентификатора вызвала ошибку.

На самом деле, исправить ошибку в итоге относительно просто, просто измените конфигурацию и перезапустите, но процесс устранения неполадок более сложен.

Оглядываясь назад на интервью здесь, должно быть много интервьюеров, которые зададут Кафке несколько основных эссе из восьми частей.

image.png

Здесь я настоятельно рекомендую при использовании кафки, будь то одноузловая кафка или кафка-кластер, указывать id каждой ноды, чтобы избежать каких-то невероятных багов.

6. Свяжитесь со мной

Если есть неточности в тексте, поправьте меня, текст писать непросто, ставьте лайк, ладно~

Диндин: louyanfeng25

WeChat: baiyan_lou

Общественный номер: дядя Бай Ян

image.png

Категории