#apache-kafka
Вопрос:
Мы настроили кластер Kafka для обеспечения высокой доступности и распределенной загрузки данных. Текущие потребители и производители указывают все IP-адреса брокера для подключения к кластеру. В будущем возникнет необходимость постоянного мониторинга кластера и добавления нового брокера на основе собранных показателей и общей производительности системы. В случае сбоя брокера мы должны как можно скорее добавить нового брокера с другим IP-адресом.
В этих сценариях нам приходится изменять все конфигурации клиентов, что является трудоемкой и напряженной операцией.
Я думаю, что мы можем настроить сервер конфигурации (например, сервер конфигурации Spring Cloud), чтобы централизованно указывать все IP-адреса брокеров, поэтому мы должны изменить все в одном месте, не затрагивая всех клиентов, но я не знаю, является ли это лучшим подходом. Очевидно, что клиенты должны быть запрограммированы на получение списка брокеров с сервера конфигурации.
Есть ли лучший подход?
Ответ №1:
Стоит отметить, что процесс «начальной загрузки» не требует предоставления клиентам каждого отдельного адреса брокера, на самом деле для первоначального подключения используется только первый доступный адрес в списке, а затем advertised.listeners
настройки всех брокеров в кластере-это то, что на самом деле используют клиенты
Ответ на ваш вопрос-использовать обнаружение служб, да. Это может быть конфигурация Spring, но более общим вариантом будет Hashicorp Consul или другая служба, использующая DNS (например, Kubernetes использует CoreDNS по умолчанию или AWS Route53).
Затем вы редактируете /etc/resolv.conf
каждую машину (при условии Linux), на которой работает клиент, чтобы включить DNS-серверы, и вы можете просто ссылаться на kafka.your.domain:9092
них, а не использовать IP-адреса
Комментарии:
1. Прежде всего, спасибо вам за ваш ответ. Вы правы, когда говорите, что не требуется указывать каждого отдельного брокера, но я рассматриваю наихудший сценарий, при котором все брокеры терпят крах. Мы используем Eureka в качестве обнаружения служб для связи с микросервисами, Docker Swarm в качестве оркестратора и локального кластера Кафки. К кластеру подключаются как микросервисы, так и внешние приложения (т. е. многие клиенты kafka). Могу ли я попробовать воспользоваться Эврикой вместо консула или другими услугами?
2. Я никогда не использовал Эврику, но, насколько я понимаю, она похожа, хотя и требует изменений клиентского кода по сравнению с переходом на другой уровень и настройкой DNS вместо этого
Ответ №2:
Вы можете использовать балансировщик нагрузки (с дружественным dns, например kafka.domain.com
), который указывает на всех ваших брокеров. Мы делаем это в нашей среде. Затем ваши клиенты подключаются к kafka.domain.com:9092
.
Как только вы добавляете новых брокеров, вы меняете только конечные точки балансировщика нагрузки, а не конфигурацию клиента.
Кроме того, пожалуйста, обратите внимание, что вам нужно подключиться только к одному брокеру начальной загрузки, и вам не нужно перечислять их все в конфигурации клиента.
Комментарии:
1. Спасибо за ответ. Насколько я знаю, Кафка использует двоичный протокол поверх TCP. Мы используем Spring Cloud Gateway в качестве обратного прокси-сервера и решения для балансировки нагрузки для архитектуры микросервиса. Вы имеете в виду балансировку нагрузки DNS?