Коротко об Apache Kafka

2020-02-07


image

Apache Kafka - распределённый программный брокер сообщений, проект с открытым исходным кодом, разрабатываемый в рамках фонда Apache. Написан на языке программирования Scala и Java.

image

Спроектирован как распределённая, горизонтально масштабируемая система, обеспечивающая наращивание пропускной способности как при росте числа и нагрузки со стороны источников, так и количества систем-подписчиков. Подписчики могут быть объединены в группы. Поддерживается возможность временного хранения данных для последующей пакетной обработки. Одной из особенностей реализации инструмента является применение техники, сходной с журналами транзакций, используемыми в системах управления базами данных.

Изначально разработан компанией LinkedIn, исходные коды проекта открыты в начале 2011 года.

image

Кластер Apache Kafka состоит из узлов, один узел называется "брокер". Кластер хранит данные в топиках. Каждый топик состоит из одной или более партиций. Для отказоустойчивости каждая партиция продублирована на нескольких брокерах. Каждая партиция хранит сообщения, каждое сообщение в партиции имеет порядковый номер - оффсет.

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

Сообщения

Брокеры

image

Партиции

image

image

Producer

image

Producer - это клиент, который отправляет сообщения брокерам Kafka для их записи в партиции топиков.

image

Consumer

image image

Consumer - это клиент, который читает сообщения из топика Kafka. Несколько consumer могут быть объединены в consumer group.

Отказоустойчивость

Границы кластера

Kafka был спроектирован с учетом размещения всех клиентов и брокеров кластера в сети с низкими задержками и высокой пропускной способностью. Поэтому:

Репликация между кластерами

image

Репликацию между кластерами Kafka выполняет MirrorMaker. Один процесс MirrorMaker запускается для набора топиков одного кластера и представляет собой несколько consumers в одной consumer group и одного общего producer. MirrorMaker делает commit offset после того, как брокер подтвердил прием сообщений от producer MirrorMaker. MirrorMaker должен по возможности находиться в целевом датацентре, куда выполняется репликация - иначе при нарушении связи сообщения могут быть вычитаны и не записаны (в случае необходимости можно разместить MirrorMaker в исходном датаценте, но в этом случае обязательно указывать что все брокеры целевого кластера должны подтвердить получение батча - acks=all - и большое количество повторных попыток). MirrorMaker закрывается, если не может отправить сообщения.

Варианты архитектуры репликации:

Гарантии Kafka

Баланс между консистентностью и доступностью можно регулировать в том числе с помощью опции unclean election: включается на уровне кластера. Если последняя in-sync реплика выключилась, можно выбрать лидера из отстающих реплик, теряя сообщения, недополученные этой репликой, в том числе те, которые уже были прочитаны частью consumers, но за счет этого сохранить доступность партиции для записи (повышенная доступность за счет снижения консистентности). Либо запретить unclean election и ждать появления in-sync реплики (консистентность за счет пониженной доступности).

Переключение активного кластера

Кросс-датацентровые (stretch) кластеры

Брокеры stretch кластера располагаются в двух датацентрах. Producers получают подтверждения после записи на брокеры в оба датацентра (acks=all), что по сути означает синхронную репликацию. Таким образом в отличие от режима Active-standby, используются ресурсы обоих датацентров. Проблемы решения:

Kafka connect

Kafka Connect - набор готовых коннекторов к известным продуктам хранилищам данных (может использоваться не разработчиком). Идет в комплекте и устанавливается вместе с Apache Kafka.

Потоковая обработка данных

Архитектура преобразования данных

Паттерны потоковой обработки