кафка! К счастью, я сохранил свою руку

интервью Java задняя часть
кафка! К счастью, я сохранил свою руку

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

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

Статьи о производительности

К нам подошел мужчина средних лет в клетчатой ​​рубашке с волосами, как у Ванпанчмена. Правильно, он был интервьюером. Наша сторона - группа промежуточного программного обеспечения инфраструктуры. Поскольку в вашем резюме не упоминается кафка, позвольте мне спросить вас о кафке .

я: Ладно, кафку я обычно не читаю, но кое-что все же знаю, особо не владею, поэтому и не написал. (Эй, я не специально это написал, я уже знал, что ты собираешься это сделать, кафка — это то, в чем я больше всего разбираюсь)
интервьюерОн погладил свою редкую бороду: начнем, поговорим о том, где существует Log-файл кафки?
я: тема kafka может быть разбита на разделы, поэтому лог соответствует папке с именем топик-раздел. Например, для топика с двумя разделами его журналы существуют в xxx/topic-1 и xxx/topic-2 соответственно.middle.
интервьюер: Согласно этому утверждению, расположение файла журнала должно быть xxx/topic-1/data.log или xxx/topic-2/data.log?
я: Нет, лог Кафки будет сегментирован. В каждой папке раздела на самом деле много сегментов лога, которые вместе образуют лог. Размер каждого сегмента лога 1G. Если сегмент лога пишется, то он будет записываться автоматически. новый сегмент.
интервьюер: Почему сегмент? А по частям нельзя?
я: Сегментация может очень хорошо поддерживать данные. Прежде всего, если вы не сегментируете их, будет очень проблематично найти часть данных, так же, как найти данные в словаре Синьхуа без каталога. Если они разделены на сегменты , нам нужно только знать, где данные раздела, а затем искать в соответствующем разделе. В то же время, поскольку журнал является постоянным диском, дисковое пространство не может быть бесконечным.Когда некоторые старые данные необходимо очистить, необходимо удалить только более старые сегменты данных с помощью механизма сегментации.
интервьюер: подождите, подождите~, вы сказали, что после того, как сегмент разделен, нам нужно только знать, в каком сегменте находятся данные, так как же мы узнаем, в каком сегменте находятся данные?
я:easy, easy~, kafka поддерживает внутреннюю таблицу переходов, а узел таблицы переходов — это номер сегмента каждого сегмента. Таким образом, при запросе данных можно быстро найти целевой сегмент данных в соответствии с таблицей переходов.
интервьюер: Таблица переходов может ускорить доступ, но как определяется номер сегмента каждого сегмента?
яНомер сегмента :kafka фактически основан на смещении, которое представляет собой смещение данных с наименьшим смещением в текущем сегменте, например:

Номер сегмента сегмента 1 равен 200, а номер сегмента сегмента 2 равен 500, тогда сегмент 1 сохраняет сообщение со смещением 200-499.
интервьюер: Хорошо, после обнаружения сегмента, как найти конкретное сообщение и пройти его напрямую?
я: не прямой обход, эффективность прямого обхода слишком низкая, кафка использует разреженный индекс для поиска конкретных сообщений, по сути, после каждого сегмента лога, помимо лог-файла, есть два индексных файла, а именно .index и .timeindex,

Среди них .index — это файл индекса смещения, о котором я уже говорил, он не будет создавать индекс для каждого сообщения, он будет создавать индекс для каждого другого интервала диапазона, поэтому он называется разреженным индексом.

Например, когда мы хотим найти сообщение 6, сначала загрузите в память индекс разреженного файла .index, затем найдите сообщение 5 с помощью дихотомии и, наконец, выполните поиск вниз по физическому адресу, на который указывает сообщение 5, пока не будет найдено сообщение 6.
интервьюер: В чем тогда преимущество разреженной индексации?
я: Разреженный индекс — это компромиссное решение, которое не занимает слишком много места, но также обеспечивает определенную возможность быстрого поиска.
интервьюер: Вы упомянули файл .timeindex выше, для чего он нужен?
я: Это тесно связано с очисткой данных kafka. Kafka по умолчанию сохраняет данные в течение 7 дней. Для данных старше 7 дней они будут очищены. Логика очистки здесь в основном оценивается максимальным временем в файле временного индекса timeindex. Если разница между максимальным временем и текущим временем превышает 7 дней, соответствующий сегмент данных будет очищен.
интервьюер: Когда дело доходит до очистки данных, помимо суждения, основанного на времени, о котором вы сказали, что еще есть?
я: Также в соответствии с размером файла журнала и смещением начала журнала, для размера файла журнала, если файл журнала (сумма всех сегментов данных) больше установленного нами порога, то он начнет очистку с первого сегмента данных, пока не будут выполнены условия. Для начального смещения журнала, если начальное смещение сегмента журнала меньше или равно установленному порогу, соответствующий сегмент данных будет очищен.
интервьюер: Вы знали о слиянии сообщений? Если знаете, расскажите о преимуществах объединения сообщений.
я: Чтобы немного понять, слияние сообщений — это объединение нескольких сообщений вместе, а затем отправка вызова rpc брокеру. Это преимущество, несомненно, уменьшит количество сетевых ресурсов ввода-вывода. Во-вторых, сообщение будет иметь проверку crc. Если каждое сообщение не объединены, это будет CRC, после объединения несколько сообщений могут быть объединены crc вместе один раз.
интервьюер: Когда новости после слияния будут отправлены брокеру?
я: объединенное сообщение будет находиться в буфере. Если буфер почти заполнен или в течение определенного периода времени нет производственного сообщения, сообщение будет отправлено брокеру.
интервьюер: Тогда вы знаете о сжатии сообщений?
я: Знайте одну вещь: сжатие использует процессорное время для экономии затрат на пропускную способность, сжатие может уменьшить размер пакета данных, производитель отвечает за сжатие сообщения данных, а потребитель распаковывает его после получения сообщения.
интервьюер: Все только производители могут сжимать?
я: Нет, брокер также может быть сжат.Когда алгоритм сжатия, указанный производителем, отличается от алгоритма сжатия, указанного брокером, брокер сначала распаковывает его в соответствии с алгоритмом сжатия производителя, а затем сжимает в соответствии с свой собственный алгоритм сжатия.Это то, о чем следует знать, если это произойдет, это повлияет на общую пропускную способность. Так же есть проблема старой и новой версии, если алгоритмы сжатия старой и новой версии несовместимы, например версия брокера старая и не поддерживает новый алгоритм сжатия, то будет то же самое.
интервьюер: Мы знаем, что сообщения Kafka должны быть записаны на диск, будет ли дисковый ввод-вывод очень медленным?
я: Все верно, сообщения kafka последовательно читаются и записываются на диск.Результаты тестов показывают, что линейная (последовательная) скорость записи дискового кластера, состоящего из шести массивов RAID-5 по 7200 об/мин, может достигать 600МБ/с.Случайная запись скорость составляет всего 100 КБ/с, а разница в производительности между ними составляет 6000 раз. Операционная система может выполнять глубокую оптимизацию для линейного чтения и записи, например упреждающее чтение (упреждающее чтение, при котором заранее считывается относительно большой блок диска в память) и отложенная запись (отложенная запись, которая объединяет множество небольших логических операций записи). операций), состоящих из одной большой физической операции записи). Последовательная запись на диск выполняется не только быстрее, чем случайная запись на диск, но и быстрее, чем случайная запись в память.
интервьюер: Последовательное чтение и запись для решения проблемы медленного диска.Есть ли другие оптимизации в сети?
я: Да, нуль-копия, при отсутствии нуль-копии сообщения взаимодействуют так:

  1. Переключиться в режим ядра: ядро ​​копирует данные диска в буфер ядра.
  2. Переключитесь в пользовательский режим: скопируйте данные ядра в пользовательскую программу.
  3. Переключитесь в режим ядра: скопируйте пользовательские данные в буфер сокета ядра.
  4. Сокет копирует данные на сетевую карту

Можно обнаружить, что часть данных была скопирована много раз и, наконец, возвращена в состояние ядра после обхода, что на самом деле является пустой тратой времени.

Когда нет копии:

  1. Скопируйте данные диска в буфер ядра
  2. Буфер ядра отправляет дескриптор и длину в сокет и напрямую отправляет данные на сетевую карту

Можно обнаружить, что благодаря нулевому копированию количество двух процессов копирования сокращается, а накладные расходы значительно сокращаются.

Надежные статьи

интервьюер:(вопрос про производительность почти тот же, давайте дальше вкус менять), как этого добивается мультипотребительская модель kafka?
я: Если вы хотите, чтобы несколько потребителей одновременно использовали тему, самый простой способ — скопировать тему, но это, несомненно, приведет к потере большого количества места, особенно в случае многих потребителей.

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

интервьюер: Тогда вы знаете, где существует смещение потребителя?
я: Давным-давно он существовал в zookeeper, но смещение нужно часто обновлять, а zookeeper не подходит для частого обновления, поэтому позже смещение потребителя было сохранено в топике под названием _consumer_offset, этот топик будет запущен первым потребитель Создается автоматически, если по умолчанию установлено 50 разделов и 3 реплики.
интервьюер: Тогда подскажите, что именно хранится в этом _consumer_offset?
я: На самом деле, он в основном делится на ключ и ценность. Ценность можно просто рассматривать как смещение нашего потребителя. Что касается ключа, нам нужно уточнить здесь, потому что каждый потребитель принадлежит к группе потребителей, и каждый потребитель фактически потребляет раздел темы, поэтомуgroup-topic-partitionМожет быть связан соответствующий потребитель, который является составом ключа.
интервьюер: Тогда не могли бы вы представить, как потребители отправляют смещения?
я: Это разделено на автоматическую отправку и ручную отправку. Если оно отправляется автоматически, наше вмешательство не требуется.После того, как мы обработаем сообщение, Kafka автоматически отправит его для нас.Если мы отправляем его вручную, нам нужно активно фиксировать после использования сообщения.
интервьюер: Что не так с автокоммитом?
я: Стратегия автоматической фиксации заключается в том, что потребитель по умолчанию отправляет смещения каждые 5 секунд. Если потребитель не потребляет данные в течение длительного времени в следующем, стратегия автоматической фиксации всегда будет отправлять дубликаты смещения, что приводит к большому количеству дубликатов. в информации _consumer_offset.
интервьюер: Так есть ли какое-нибудь решение для этого?
я: Да, основная проблема в этой ситуации заключается в том, что может быть большое количество повторяющихся сообщений о смещении, занимающих место для хранения, если дубликаты удалены. Kafka предоставляет подобную redis функцию aofrewrite, называемую компактной стратегией. Это делается с помощью поток logCleaner, очищающий повторяющиеся и старые сообщения.

интервьюер: Что делать, если потребитель перезапускается автоматически, а перемещение не приходит и не отправляется?
я: Это приведет к повторному потреблению и, как правило, должно быть идемпотентным в бизнесе.
интервьюер: Ручная отправка решает эту проблему?
я: Нет, если мы отправляем вручную после того, как бизнес обработан, но до того, как он может быть отправлен, перезапуск или другие причины приводят к сбою отправки, повторное потребление также произойдет после восстановления потребителя.
интервьюер: Что, если я сначала отправлю, а затем обработаю бизнес-логику?
я: Эта ситуация не может быть гарантирована на 100% правильно. Если отправка прошла успешно, но при обработке бизнеса произошла ошибка, как правило, повторно использовать эти данные в это время невозможно, поскольку они уже были отправлены, если вы не сбросите смещение. Короче говоря, ни одно решение не может гарантировать 100% совершенство, нам нужно делать идемпотентность в соответствии с бизнес-ситуацией или находить потерянные данные по логу.
интервьюер: Когда потребитель отправляет смещение потребления, это смещение или смещение+1 последнего потребляемого в данный момент сообщения?
я: смещение+1.
интервьюер: С точки зрения производителя, говорить о том, что сообщение не потеряно.
я: Что касается проблемы потери сообщений, производитель Kafka предлагает пользователям на выбор три стратегии. Каждая стратегия имеет свои преимущества и недостатки, и ее необходимо выбирать в соответствии с реальной ситуацией в бизнесе.

  1. Во-первых, производитель не заботится о сообщении и отвечает только за его отправку.Этот режим, несомненно, самый быстрый и лучший по пропускной способности, но он может привести к большим потерям данных.Например, когда возникает проблема с заемщик, производитель. Если он не отправляется непрерывно, данные будут потеряны до тех пор, пока брокер не будет восстановлен.
  2. Второе — производителю нужно, чтобы все копии были успешно записаны, будь то копия-лидер или копия-последователь, тогда при большем количестве копий-последователей теория пропускной способности будет хуже, но в этом режиме сообщение является наиболее безопасным .
  3. В-третьих, производителю нужно только получить подтверждение ведущей копии, и ему не нужно заботиться о статусе записи ведомой копии.Это компромисс, который обеспечивает определенную степень безопасности, не слишком сильно влияя на пропускную способность. .

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

интервьюер: Тогда скажи мне, как копия-последователь избирается лидером?
я: В кафке есть несколько понятий:

  • AR: Коллекция всех реплик
  • ISR: Набор всех подходящих для выборов реплик.
  • OSR: Набор реплик слишком сильно отстает или зависает

AR = ISR + OSR. В нормальных условиях AR должен быть таким же, как ISR, но когда реплика-последователь слишком сильно отстает или узел реплики-последователя зависает, он будет перемещен из ISR и помещен в OSR, kafka Выборы также относительно простой, то есть первая реплика в ISR выбирается в качестве нового ведущего узла. Например, сейчас AR=[1,2,3], 1 кладет трубку, затем ISR=[2,3], тогда 2 будет избран новым лидером.

интервьюерОн погладил челку слева: У тебя есть еще что-нибудь, чтобы спросить меня?
я: Учитель, можно ли совмещать бокс?

интервьюер: Я не умею комбинировать удары, но на встречу с тобой придет много людей.
я:

Продолжение следует...

Прошлые основные моменты:

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

Наконец, поиск в WeChat [притворитесь, что понимаете программирование], если у вас есть какие-либо вопросы, пожалуйста, свяжитесь со мной, если есть проблема с моей статьей, вы можете исправить меня, если вам нравится учиться, нравится учиться, вы можете следить меня.