All streams
Search
Write a publication
Pull to refresh
27
0
Анатолий Солдатов @EasyGrow

Исследователь

Send message
С Booking мы пару раз созванивались недавно и делились опытом. В целом и у них и у нас подход похожий.
Как проводили сравнение?
Кстати, в Confluent 5.4 появятся обзерверы и stretch кластер будет не такой страшный www.confluent.io/blog/multi-region-data-replication
Может быть вы и правы :)
Такие вопросы сложно теоретически обосновать, надо тестировать для конкретного случая.
Привет!

databus работает и на запись и на чтение. Никаких опросов в клиенте не нужно настраивать, databus работает через push модель.
Нет, не используем
Спасибо за отзыв!

Если весь кластер целиком упал – сейчас никак не нивелируем, но в теории можем зароутить весь траффик на кластер в другом ДЦ через дата-бас прозрачно для сервисов. Если идет failover, можем корректно восстановить положение всех консьюмеров. Если делаем роллинг апдейт или рестарт, можем смотреть за состоянием абсолютно всех клиентов, которые сейчас работают с кластером. Если это обновление клиентов сарамы или конфигурации продюсеров и консьюмеров, то такой процесс происходит полностью на серверной части дата-баса без участия сервисов.
Приведу цитату из Definitive guide от Confluent: «Apache Kafka’s brokers and clients were designed, developed, tested, and tuned all
within a single datacenter. We assumed low latency and high bandwidth between
brokers and clients. This is apparent in default timeouts and sizing of various buffers.
For this reason, it is not recommended to install some Kafka brokers in one datacenter and others in another datacenter.» В целом, рекомендуемой топологией является именно active-active.
NSQ может работать в режиме сохранения данных на диск, но это не совсем то же самое, что предлагает Кафка. Например, нет репликации, нет упорядоченности записи. Также слышал отзывы, что NSQ иногда теряет данные, не не могу сказать на сколько это правда.
rack awareness у нас и сейчас используется в рамках одного ДЦ.

А можно какие-то пруфлинки, что это самый правильный способ? Про самый простой не спорю.
Кафку и зукиперы запускаем в LXC на железных машинах. Data-bus и все остальные сервисы запускаем в Kubernetes.
Про балансировку пока не думали, так как по дизайну любой кластер в любом ДЦ должен быть способен выдержать 100% нагрузку (иначе будем ловить неожиданные последствия при failover).

Зацикливание можно избежать введением абстракции неймспейсов или использованием относительно новой фичи Кафки – хедеров. Confluent Replicator использует второй подход, он добавляет в отправляемые события хедер с идентификатором кластера, из которого эти события были изначально получены, тем самым предотвращая зацикливание.
Ох, это довольно интересная тема с большим числом нюансов, она заслуживает отдельной статьи.

Да, вы правы. В нашем случае все кластеры связаны между собой и каждый реплицирует данные в другие. Ограничений никаких нет. Один сервис может раскатить своих продюсеров и консьюмеров в нескольких ДЦ, при этом каждый будет писать в кластер своего ДЦ и читать из кластера своего ДЦ. Вот тут довольно подробно описана верхнеуровневая идея.

Большая оговорка – пока архитектура на несколько ДЦ живет только на бумаге, скорее всего на этапе завершения тестовой реализации мы поймем, что все не так просто и может быть что-то еще изменим.
Да, спасибо, знаем про такое :)
1. Динамически меняли число партиций, уже не помню на каком числе партиций нашли максимальную производительность.

2. Написали свой небольшой баш-фреймворк :) Под капотом он получал в конфиге список параметров, которые нужно изменять от теста к тесу и массив значений этих параметров (например, partitions [1,3,9,27,54]). Дальше крутились тесты по всем комбинациям всех параметров и по каждому снимались итоговые throughput/latency (min, max, 95%%, avg). Нагрузка шла с трех отдельных хостов (не тех, где стоит Кафка). Также кидали события разного размера.

3. Частично про конфигурацию ответил в пункте 2. Да, max.inflight.requests, max.linger.ms и другие параметры настраивали. Acks всегда стоял all, так как в проде у нас используется только acks=all. Плюс был включен довольно агрессивный fsync. Консьюмеров также тюнили. Во время тестов производительности ребалансировка консьюмеров не производилась.

В какой-то момент мы остались довольны полученными цифрами и перестали пытаться разогнаться еще больше. Я уверен, что можно получить более внушительные цифры.
По-разному. Если сервисы общаются асихронно, то через Кафку. В таком случае сервис Б подписывается на интересующий его топик. Как только в сервисе А что-то происходит, сервис А отправляет событие об этом в топик. Сервис Б получает это событие и предпринимает требуемые действия. Результат обработки он может записать в другой топик, на который подписан сервис А.

Но есть и прямые вызовы сервисов, есть саги и т.д. Не все взаимодействие идет через Кафку.
Да, такая цена data-bus'а. Но при этом библиотека очень тонкая.
Да, мы неправильно поняли друг друга.

Мы не включаем брокеров из разных ДЦ в один кластер – это скорее антипаттерн. Мы используем active-active топологию с абсолютно независимыми кластерами в разных ДЦ и репликацией данных (Confluent Replicator) между ними. Таким образом получается, что в каждом ДЦ у нас по 3 копии данных, а всего 3*<число ДЦ> копий данных
Здравствуйте!

Фактор репликации внутри одного ДЦ выбрали равный 3, т.к. 2 мало, 4 дорого.
Далее, у нас есть задача обеспечить масштабирование, отказоустойчиовость и не потерять данные в случае полного выхода из строя ДЦ – соответственно, во всех ДЦ стоят идентичные кластера Кафки с полным набором данных.

Не знаю, почему подход вам кажется странным. Это стандартный подход – использование active active топологии кластеров в нескольких ДЦ. Подробнее он описан, например, тут.
Перечитал свое сообщение – да, вы правы.

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

Information

Rating
Does not participate
Works in
Registered
Activity