Управляет ли потребитель кафки своим состоянием? - PullRequest
1 голос
/ 22 октября 2019

У меня есть кластер Kafka, настроенный с использованием трех экземпляров виртуальной машины GCP. На всех трех виртуальных машинах были запущены Zookeepers и серверы.

Я следовал этому руководству для своей установки: Как настроить мультиузловой мультиброкерный кластер Kafka в AWS

Я сохранил все три экземпляра в разных регионах, чтобы добиться высокой доступности в случае регионального сбоя в облачной службе (GCP или AWS, я понимаю, что это маловероятно).

У меня есть тема, созданная с репликацией -фактор как 3. Теперь предположим, что один регион полностью разрушен, и только два узла живы. Что происходит с потребителем, который читал с ВМ в сбое (который работал ранее)?

Как только сервисы в регионе будут возвращаться, будет ли этот потребитель (имеющий уникальный client_id) поддерживать свое состояние ичитать только новые сообщения?

Кроме того, что если у меня есть 7 виртуальных машин, разделенных (2,2,3) по 3 регионам:

  1. Это хорошая идея, чтобы сохранить коэффициент репликациикак 7 для достижения высокой доступности?
  2. Я имею в виду 7 виртуальных машин, потому что в любом из регионов происходит сбой, у нас все еще работает большинство узлов Kafka. Можно ли запустить кластер Kafka с отключением большинства узлов? (Например, 4 из 7 узлов вниз)

1 Ответ

2 голосов
/ 23 октября 2019

Kafka предоставляет различные настройки для достижения высокой доступности и может быть настроен и оптимизирован в соответствии с требованиями

1. min.insync.replicas: Это минимальное количество копий, которые будут всегда жить в любое время, чтобы продолжить работу кластера Kafka. Например, позволяет нам иметь 3 брокерских узла и один брокерский узел в этом случае, если min.insync.replicas = 2 или менее кластер будет продолжать обслуживать запрос, однако если min.insync.replicas 3, он остановится. Обратите внимание, что min.insync.replicas = 1 не рекомендуется в том случае, если потерянные данные будут потеряны навсегда. min.insync.replicas - это баланс между более высокой согласованностью (требующей записи более чем одному брокеру) и более высокой доступностью (разрешающей запись, когда доступно меньше брокеров).

2. ack (Acknowledgements): Во время публикации сообщения мы можем установить, сколько реплик фиксируется, прежде чем производитель получит подтверждение. Например, ack = 0 означает немедленное подтверждение сообщения, не ожидая какой-либо фиксации раздела. ack = 1 означает получение подтверждения о успешном завершении после получения коммита лидером. ack - это все средства подтверждения после всех синхронизированных реплик.

leader.election.enable: Вы можете установить unclean.leader.election.enable = true для своих брокеров, и в этом случае, если никакие реплики не синхронизированы, одна изРеплики будут синхронизированы. Это может привести к потере данных, но способствует доступности. Конечно, если некоторые реплики синхронизированы, он все равно выберет одну из них

offsets.topic.replication.factor : должно быть больше, чем в случае __consumer_offsets, чтобы иметь высокий уровень доступности. __consumer_offsets - это смещение темы, чтобы управлять смещением темы, поэтому, если у вас есть коэффициент репликации темы, равный 1, он может не получиться, если один из брокеров отключится

Потребитель всегда читает из раздела лидера. Потребители не потребляют от подписчиков, подписчики существуют только для избыточности и отработки отказа. Есть возможности, что неудачный брокер состоит из нескольких лидерских разделов. Таким образом, в этом случае последователь из раздела другого брокера будет повышен до лидера. В другом сценарии раздел подписчика не имеет 100% синхронизации с разделом лидера, тогда мы можем потерять некоторые данные. Здесь описывается сценарий того, как или что вы используете при публикации сообщений.

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

Контроллер брокера Контроллер является одним из посредников, у которого есть дополнительные обязанности по управлению разделами и репликами. Он несет некоторую дополнительную ответственность и сохраняет некоторые метаданные и ответы при любых изменениях метаданных в разделе.

Любой из посредников может играть роль контроллера, но в работоспособном кластере есть ровно один контроллер. Кафкаброкер будет привязан к другому контроллеру в случае отключения контроллера или потери соединения зоопарком. Если контроллер равен 0 или больше 1, значит, Брокер не здоров

...