Введение
Мало знаний, большой вызов! Эта статья участвует в "Необходимые знания для программистов«Творческая деятельность.
Эта статья участвовала в "Проект «Звезда раскопок»”, чтобы выиграть творческий подарочный пакет и бросить вызов творческим поощрительным деньгам.
всем привет.
kafkaЭто распределенная платформа распределенного потока сообщений с несколькими разделами и несколькими копиями на основе Zookeeper, а также с открытым исходным кодом.Система обработки сообщений на основе режима публикации-подписки.
Отдел блогера использует kafka как middleware сообщений.Не так давно столкнулся со странным багом.На поиск проблемы ушло много сил,поэтому запишу сюда.
2. Происхождение ошибки
Одна из функций модуля, за который я отвечаю, — изменение сетевого IP-адреса хоста.
Страница функций выглядит следующим образом
После ввода адреса IPV4 адрес хоста, на котором находится служба, будет изменен.
先说一下背景:
Все сервисы в тестовой среде распределены на одной машине.После модификации IP нужно модифицировать конфигурацию центра конфигурации nacos синхронно, и каждое промежуточное ПО считывает конфигурацию системных переменных окружения. Затем перезагружается вся машина, после чего автоматически запускаются docker-контейнеры различных бизнес-приложений и промежуточного ПО.
С точки зрения спроса логика реализации относительно проста: Java-программа вызывает сценарий оболочки для выполнения некоторых операций на хосте, а затем перезапускает машину.
Код функции пишется одним кликом.
После написания теста ifconfig видит, что ip изменен, docker ps видит, что контейнер запускается нормально, а front-end просто тестирует какие-то функции, все в норме.
Так мило, я действительно гений кодинга~
После теста испытательница сказала мне, что записи операций системы не сформированы, а записи операций равномерно перехватываются и отправляются в kafka, которые потребляются и записываются в es специальным лог-модулем.
Ган! Эта функция также была разработана недавно, я только что закончил серию исправлений ошибок, и после самотестирования проблем нет. Глядя на код, последняя запись коммита этого модуля тоже принадлежит мне.
Странный.
Взгляните на журнал в фоновом режиме и распечатайте журнал 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-адрес тестовой среды?
На данный момент потребитель не может обработать большое количество сообщений!
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
Ответы, данные в Интернете, обычно касаются:
- Сервер, на котором расположен раздел kafka, не работает, и перебалансировка не удалась.
- Брандмауэр не закрыт, что приводит к сбою сети.
- Неверная конфигурация IP-адреса прокси.
по одному
Первый пункт:Глядя на контейнер kafka, загрузка нормальная, а если добавить тему, то ее тоже можно нормально отправить и потреблять, исключено!
Второй пункт:Брандмауэр не включен, даже если включен, порт все равно открыт, исключите!
Третий пункт:От Google, это должен быть ответ.
Взгляните на содержимое файла конфигурации
cat /opt/kafka/config server.properties
Параметры, относящиеся к ip, являются нормальными и были изменены на целевое значение ip, а все указанные выше конфигурации прокомментированы.
Мы используем более раннюю конфигурацию
advertised.host.name=目标ip
Но выхода не было, я все же решил попробовать, модифицировал конфигурацию в соответствии с работой в Интернете и перезапустил.
Результат, как и ожидалось, совершенно бесполезен.
3.2. Переключите ip, чтобы начать
После google окончательные результаты поиска касаются конфигурации и сетевых проблем построения кластера kafka, которые в основном совпадают с поисковым контентом 3.1.
сдаться.
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, поэтому лидера нет, и кластер не может быть построен.
хорошо, теперь вы знаете, что вызвало эту ошибку~
3.4 Анализ причин
3.3 Мы уже знаем, что вызывает блокировку сообщений. Так в чем причина несоответствия информации брокера на zk и kafka?
Прорыв на самом деле совершенно ясен.Брокеры непоследовательны, поэтому давайте рассмотрим несколько факторов, определяющих генерацию BrokerId.
Цитата из блога Чжу Сяоси, автора книги «Углубленное понимание Кафки»:Подробное объяснение параметра Kafka broker.id
Из вышеизложенного видно, что BrokerId определяется в основном из двух файлов,server.propertiesиmeta.properties
Сначала посмотрите на конфигурацию server.properties
-1 — это автоматическое размещение, конфигурация по умолчанию начинается с 1001, а информация о теме, соответствующая kafka, — 1001.
Взгляните еще раз на meta.properties
Существуйте в каталоге конфигурации log.dirs сервера.properties, просмотрите конфигурацию
cluster.id=uHTKS_74RhW2_wKwbuwHxQ
version=0
broker.id=1002
Молодец, нашел проблему! ! ! !
脚本修改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, и динамическая генерация идентификатора вызвала ошибку.
На самом деле, исправить ошибку в итоге относительно просто, просто измените конфигурацию и перезапустите, но процесс устранения неполадок более сложен.
Оглядываясь назад на интервью здесь, должно быть много интервьюеров, которые зададут Кафке несколько основных эссе из восьми частей.
Здесь я настоятельно рекомендую при использовании кафки, будь то одноузловая кафка или кафка-кластер, указывать id каждой ноды, чтобы избежать каких-то невероятных багов.
6. Свяжитесь со мной
Если есть неточности в тексте, поправьте меня, текст писать непросто, ставьте лайк, ладно~
Диндин: louyanfeng25
WeChat: baiyan_lou
Общественный номер: дядя Бай Ян