Сообщения

Сообщения за февраль, 2021

Дизайн Kafka, реплицированные журналы, выборы лидера

Изображение
Неясные выборы лидера: что, если они все не доступны? Обратите внимание, что гарантия Kafka в отношении потери данных основана на сохранении как минимум одной реплики в синхронизации. Если все узлы, реплицирующие раздел, умирают, эта гарантия больше не действует. Однако практическая система должна делать что-то разумное, когда все реплики умирают. Если вам не повезло, что это произошло, важно подумать о том, что произойдет. Можно реализовать два варианта поведения: Подождите, пока реплика в ISR вернется к жизни, и выберите эту реплику в качестве лидера (надеясь, что у нее все еще есть все данные). Выберите первую реплику (не обязательно в ISR), которая вернется к жизни в качестве лидера. Это простой компромисс между доступностью и согласованностью. Если мы будем ждать реплик в ISR, мы останемся недоступными, пока эти реплики не работают. Если такие реплики были уничтожены или их данные были потеряны, то мы навсегда отключились. С другой стороны, если несинхронизированная реплика

Дизайн Kafka, реплицированные журналы: кворумы, ISR и машины состояний

Изображение
По своей сути раздел Kafka - это реплицированный журнал. Реплицированный журнал - один из самых основных примитивов в распределенных системах данных, и существует множество подходов к его реализации. Реплицированный журнал может использоваться другими системами в качестве примитива для реализации других распределенных систем в стиле машины состояний. Реплицированный журнал моделирует процесс достижения консенсуса в порядке ряда значений (как правило, записи журнала нумеруются 0, 1, 2, ...). Есть много способов реализовать это, но самый простой и быстрый - с лидером, который выбирает порядок значений, предоставляемых ему. Пока лидер остается в живых, всем последователям нужно только копировать значения и порядок, которые выбирает лидер. Конечно, если бы лидеры не падали, нам не понадобились бы последователи! Когда лидер действительно умирает, нам нужно выбрать нового лидера из числа последователей. Но сами подписчики могут отставать или терпеть неудачу, поэтому мы должны убедиться, чт

Дизайн Kafka, репликация

Изображение
Kafka реплицирует журнал для разделов каждой темы на настраиваемое количество серверов (вы можете установить этот коэффициент репликации для каждой темы). Это позволяет автоматически переключаться на эти реплики при отказе сервера в кластере, поэтому сообщения остаются доступными даже при сбоях. Другие системы обмена сообщениями предоставляют некоторые функции, связанные с репликацией, но они имеют большие недостатки: реплики неактивны, пропускная способность сильно снижена, это требует сложной ручной настройки и т. д. Kafka по умолчанию предназначена для использования с репликацией - фактически, нереплицированные темы реализуются как реплицированные темы, где фактор репликации равен единице. Единицей репликации является раздел темы. В условиях отсутствия сбоя каждый раздел в Kafka имеет одного лидера и ноль или более последователей. Общее количество реплик, включая лидера, составляет фактор репликации. Все операции чтения и записи переходят к лидеру раздела. Обычно разделов намного

Дизайн Kafka, семантика доставки сообщений

Изображение
Здесь мы обсудим семантические гарантии, которые Kafka предоставляет между производителем и потребителем. Очевидно, что существует несколько возможных гарантий доставки сообщений, которые могут быть предоставлены: Не более одного раза - сообщения могут быть потеряны, но никогда не будут доставлены повторно. По крайней мере один раз - сообщения никогда не теряются, но могут быть доставлены повторно. Ровно один раз - это то, чего на самом деле хотят люди, каждое сообщение доставляется только один раз. Стоит отметить, что здесь можно выделить две проблемы: гарантии долговечности при публикации сообщения и гарантии при использовании сообщения. Многие системы заявляют, что предоставляют семантику доставки «ровно один раз», но важно читать мелкий шрифт, большинство этих утверждений вводят в заблуждение (т.е. они не соответствуют случаю, когда потребители или производители могут потерпеть неудачу, случаям, когда есть несколько процессов потребителей или случаи, когда данные, записанные

Дизайн Kafka, потребитель (Consumer), позиция потребителя

Изображение
Позиция потребителя Отслеживание того, что было израсходовано, на удивление, является одной из ключевых точек производительности системы обмена сообщениями. Большинство систем обмена сообщениями хранят метаданные о том, какие сообщения были получены брокером. То есть, когда сообщение передается потребителю, брокер либо немедленно записывает этот факт локально, либо может ждать подтверждения от потребителя. Это довольно интуитивный выбор, и действительно, для сервера с одной машиной не ясно, куда еще может перейти это состояние. Поскольку структуры данных, используемые для хранения во многих системах обмена сообщениями, плохо масштабируются, это также прагматичный выбор - поскольку брокер знает, что потребляется, он может немедленно удалить это, сохраняя небольшой размер данных. Что, возможно, не очевидно, так это то, что заставить брокера и потребителя прийти к соглашению о том, что было потреблено, - нетривиальная проблема. Если брокер записывает сообщение как потребленное немедлен

Дизайн Kafka, потребитель (Consumer)

Изображение
Потребитель Kafka работает, отправляя запросы «выборки» брокерам, ведущим разделы, которые он хочет использовать. Потребитель указывает свое смещение в журнале с каждым запросом и получает обратно кусок журнала, начиная с этой позиции. Таким образом, потребитель имеет значительный контроль над этой позицией и может перемотать ее, чтобы при необходимости повторно использовать данные. Push vs. pull Первоначальный вопрос заключается в том, должны ли потребители получать данные от брокеров или брокеры должны передавать данные потребителю. В этом отношении Kafka следует более традиционному дизайну, разделяемому большинством систем обмена сообщениями, где данные отправляются брокеру от производителя и извлекаются от брокера потребителем. Некоторые системы, ориентированные на ведение журналов, такие как Scribe и Apache Flume, используют совершенно другой путь, основанный на push, когда данные отправляются вниз по потоку. У обоих подходов есть свои плюсы и минусы. Однако система на основе pu

Дизайн Kafka, производитель (Producer)

Изображение
Балансировки нагрузки Производитель отправляет данные непосредственно брокеру, который является лидером для раздела, без промежуточного уровня маршрутизации. Чтобы помочь производителю сделать это, все узлы Kafka могут ответить на запрос метаданных о том, какие серверы активны и где находятся лидеры разделов темы в любой момент времени, чтобы производитель мог надлежащим образом направлять свои запросы. Клиент контролирует, в какой раздел он публикует сообщения. Это можно сделать произвольно, реализовав своего рода случайную балансировку нагрузки, или с помощью некоторой функции семантического разделения. Предоставляется интерфейс для семантического разделения, позволяя пользователю указать ключ для разделения и используя его для хеширования раздела (при необходимости также есть возможность переопределить функцию разделения). Например, если выбранный ключ был идентификатором пользователя, то все данные для данного пользователя будут отправлены в один и тот же раздел. Это, в свою очер

Дизайн Kafka, эффективность

Изображение
При создании Kafka были приложены значительные усилия для повышения эффективности. Один из основных вариантов использования - обработка данных о веб-активности, объем которых очень велик: каждый просмотр страницы может генерировать десятки операций записи. Кроме того каждое опубликованное сообщение читается по крайней мере одним потребителем (часто многими), поэтому стремились сделать потребление как можно более дешевым. На основе опыта создания и эксплуатации ряда аналогичных систем также обнаружили, что эффективность является ключом к эффективной работе с несколькими арендаторами. Если нижестоящая инфраструктурная услуга может легко стать узким местом из-за небольшого увеличения использования приложением, такие небольшие изменения часто создают проблемы. Работая очень быстро, гарантируется, что приложение перевернется под нагрузкой раньше, чем инфраструктура. Это особенно важно при попытке запустить централизованную службу, которая поддерживает десятки или сотни приложений в централ

Дизайн Kafka, устойчивость

Изображение
Файловая система Kafka в значительной степени полагается на файловую систему для хранения и кэширования сообщений. Существует общее мнение, что «диски работают медленно», что заставляет людей сомневаться в том, что постоянная структура может обеспечить конкурентоспособную производительность. На самом деле диски и намного медленнее, и намного быстрее, чем люди ожидают, в зависимости от того, как они используются; а правильно спроектированная структура диска часто может быть такой же быстрой, как сеть. Ключевой факт о производительности дисков заключается в том, что пропускная способность жестких дисков отличается от задержки поиска диска в течение последнего десятилетия. В результате производительность линейной записи в конфигурации JBOD с шестью массивами 7200 об/мин SATA RAID-5 составляет около 600 МБ/с, но производительность произвольной записи составляет всего около 100 кбит/с - разница более 6000X. Эти линейные операции чтения и записи являются наиболее предсказуемыми из всех шаб

Дизайн Kafka, мотивация

Изображение
Kafka была разработана, чтобы быть способной действовать как унифицированная платформа для обработки всех потоков данных в реальном времени, которые могут быть у крупной компании. Для этого пришлось продумать довольно широкий набор сценариев использования. Она должна обладать высокой пропускной способностью для поддержки потоков событий большого объема, таких как агрегация журналов в реальном времени. Чтобы иметь возможность поддерживать периодическую загрузку данных из автономных систем, необходимо аккуратно обрабатывать большие объемы невыполненных заданий. Это также означало, что система должна будет обрабатывать доставку с малой задержкой для обработки более традиционных сценариев использования сообщений. Планировалось поддерживать разделенную, распределенную обработку этих каналов в реальном времени для создания новых производных каналов. Это мотивировало модель разделения (partitioning) и потребителя. Наконец, в случаях, когда поток передается в другие системы данных для обс

Быстрый старт с Kafka

Изображение
Шаг 1: Получить Kafka Загрузите последнюю версию Kafka и распакуйте ее: $ tar -xzf kafka_2.13-2.7.0.tgz $ cd kafka_2.13-2.7.0 Шаг 2: Запустить среду Kafka Примечание. В вашей локальной среде должна быть установлена Java 8+. Выполните следующие команды, чтобы запустить все службы в правильном порядке: # Запустить сервис ZooKeeper # Примечание. # Скоро ZooKeeper больше не будет требоваться для Apache Kafka. $ bin/zookeeper-server-start.sh config/zookeeper.properties Откройте другой сеанс терминала и запустите: # Запустить брокерскую службу Kafka $ bin/kafka-server-start.sh config/server.properties После успешного запуска всех служб у вас будет запущена и готова к использованию базовая среда Kafka. Шаг 3: Создать тему (topic) для сохранения событий Kafka - это платформа распределенной потоковой передачи событий, которая позволяет вам читать, записывать, хранить и обрабатывать события (также называемые записями или сообщениями в документации) на многих машинах.

Примеры использования Kafka

Изображение
Здесь приведено описание нескольких популярных вариантов использования Apache Kafka. Обмен сообщениями Kafka хорошо работает как замена более традиционному брокеру сообщений. Брокеры сообщений используются по разным причинам (для отделения обработки от производителей данных, для буферизации необработанных сообщений и т. д.). По сравнению с большинством систем обмена сообщениями Kafka имеет лучшую пропускную способность, встроенное разделение, репликацию и отказоустойчивость, что делает его хорошим решением для крупномасштабных приложений обработки сообщений. Использование обмена сообщениями часто имеет сравнительно низкую пропускную способность, но может потребовать низкой сквозной задержки и часто зависит от надежных гарантий надежности, которые предоставляет Kafka. В этой области Kafka можно сравнить с традиционными системами обмена сообщениями, такими как ActiveMQ или RabbitMQ. Отслеживание активности веб-сайта Первоначальный вариант использования Kafka заключался в том, чтобы

Основные понятия и терминология Kafka

Изображение
Событие (event) фиксирует тот факт, что «что-то произошло» в мире или в вашем бизнесе. В документации это также называется записью (record) или сообщением (message). Когда вы читаете или записываете данные в Kafka, вы делаете это в форме событий. Концептуально событие имеет ключ, значение, отметку времени и необязательные заголовки метаданных. Вот пример события: Event key: "Alice" Event value: "Made a payment of $200 to Bob" Event timestamp: "Jun. 25, 2020 at 2:06 p.m." Ключ события: «Алиса» Значение события: «Совершил платеж Бобу на сумму 200 долларов». Отметка времени события: «25 июня 2020 г., 14:06» Производители (Producers) - это те клиентские приложения, которые публикуют (записывают) события в Kafka, а потребители (consumers) - это те, которые подписываются на эти события (читают и обрабатывают). В Kafka производители и потребители полностью отделены друг от друга и не зависят друг от друга, что является ключевым элементом дизайна

Как работает Kafka - в двух словах

Изображение
Kafka - это распределенная система, состоящая из серверов и клиентов, которые обмениваются данными через высокопроизводительный сетевой протокол TCP. Его можно развернуть на аппаратном обеспечении, виртуальных машинах и контейнерах как в локальной, так и в облачной среде. Серверы : Kafka работает как кластер из одного или нескольких серверов, которые могут охватывать несколько центров обработки данных или облачных регионов. Некоторые из этих серверов образуют уровень хранения, называемый брокерами. На других серверах работает Kafka Connect для непрерывного импорта и экспорта данных в виде потоков событий для интеграции Kafka с вашими существующими системами, такими как реляционные базы данных, а также с другими кластерами Kafka. Кластер Kafka обладает высокой масштабируемостью и отказоустойчивостью, чтобы позволить вам реализовать критически важные сценарии использования: в случае отказа одного из серверов другие серверы берут на себя их работу, чтобы обеспечить непрерывную работу бе