Создание темы кафки, когда 3 брокера вышли из 4 в кластере - PullRequest
0 голосов
/ 31 октября 2018

Не удается создать тему Кафки в следующих сценариях:

Узел кластера Кафка: 4

Коэффициент репликации: 4

Количество узлов, работающих и работающих в кластере: 3

Ниже приведена ошибка:

./kafka-topics.sh --zookeeper :2181 --create --topic test_1 --partitions 1 --replication-factor 4
WARNING: Due to limitations in metric names, topics with a period ('.') or underscore ('_') could collide. To avoid issues it is best to use either, but not both.
Error while executing topic command : Replication factor: 4 larger than available brokers: 3.
[2018-10-31 11:58:13,084] ERROR org.apache.kafka.common.errors.InvalidReplicationFactorException: Replication factor: 4 larger than available brokers: 3.

Это правильное поведение или какая-то известная проблема в kafka?

Если все узлы в кластере должны работать и работать всегда, тогда как насчет отказоустойчивости?

обновление файла JSON для увеличения коэффициента репликации для уже созданной темы:

$cat /tmp/increase-replication-factor.json
{"version":1,
  "partitions":[
     {"topic":"vHost_v81drv4","partition":0,"replicas":[4,1,2,3]},
     {"topic":"vHost_v81drv4","partition":1,"replicas":[4,1,2,3]},
     {"topic":"vHost_v81drv4","partition":2,"replicas":[4,1,2,3]},
     {"topic":"vHost_v81drv4","partition":3,"replicas":[4,1,2,3]}
     {"topic":"vHost_v81drv4","partition":4,"replicas":[4,1,2,3]},
     {"topic":"vHost_v81drv4","partition":5,"replicas":[4,1,2,3]},
     {"topic":"vHost_v81drv4","partition":6,"replicas":[4,1,2,3]},
     {"topic":"vHost_v81drv4","partition":7,"replicas":[4,1,2,3]}
]}

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Когда в Кафке создается новая тема, она повторяется N=replication-factor раз среди ваших брокеров. Поскольку у вас есть 3 запущенных брокера и для replication-factor установлено значение 4, тема не может быть реплицирована 4 раза, и, таким образом, вы получаете ошибку.

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

Если вы хотите создать тему с коэффициентом репликации, установленным на 4, когда один брокер не работает, вы можете изначально создать тему с помощью replication-factor=3, и как только ваш четвертый брокер будет запущен, вы можете изменить конфигурацию этого разделите тему и увеличьте коэффициент ее репликации, выполнив следующие действия (если у вас есть тема example с 4 разделами):

Создайте файл increase-replication-factor.json с таким содержанием:

{"version":1,
  "partitions":[
     {"topic":"example","partition":0,"replicas":[0,1,2,3]},
     {"topic":"example","partition":1,"replicas":[0,1,2,3]},
     {"topic":"example","partition":2,"replicas":[0,1,2,3]},
     {"topic":"example","partition":3,"replicas":[0,1,2,3]}
]}

Затем выполните следующую команду:

kafka-reassign-partitions --zookeeper localhost:2181 --reassignment-json-file increase-replication-factor.json --execute

И, наконец, вы сможете подтвердить, что ваша тема реплицирована на 4 брокера:

kafka-topics --zookeeper localhost:2181 --topic signals --describe
Topic:signals   PartitionCount:4    ReplicationFactor:4 Configs:retention.ms=1000000000
Topic: signals  Partition: 0    Leader: 2   Replicas: 0,1,2,3 Isr: 2,0,1,3
Topic: signals  Partition: 1    Leader: 2   Replicas: 0,1,2,3 Isr: 2,0,1,3
Topic: signals  Partition: 2    Leader: 2   Replicas: 0,1,2,3 Isr: 2,0,1,3
Topic: signals  Partition: 3    Leader: 2   Replicas: 0,1,2,3 Isr: 2,0,1,3

Что касается высокой доступности, позвольте мне объяснить, как работает Kafka:

Каждая тема - это определенный поток данных (аналогично таблице в базе данных). Темы разделены на разделов (столько, сколько вам нужно), где каждое сообщение в разделе получает инкрементный идентификатор, известный как смещение, как показано ниже.

Раздел 0:

+---+---+---+-----+
| 0 | 1 | 2 | ... |
+---+---+---+-----+

Раздел 1:

+---+---+---+---+----+
| 0 | 1 | 2 | 3 | .. |
+---+---+---+---+----+

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

Пример 2 тем (каждая с 3 и 2 разделами соответственно):

Брокер 1:

+-------------------+
|      Topic 1      |
|    Partition 0    |
|                   |
|                   |
|     Topic 2       |
|   Partition 1     |
+-------------------+

Брокер 2:

+-------------------+
|      Topic 1      |
|    Partition 2    |
|                   |
|                   |
|     Topic 2       |
|   Partition 0     |
+-------------------+

Брокер 3:

+-------------------+
|      Topic 1      |
|    Partition 1    |
|                   |
|                   |
|                   |
|                   |
+-------------------+

Обратите внимание, что данные распределены (и Брокер 3 не содержит данных topic 2 ).

Темы, должны иметь replication-factor> 1 (обычно 2 или 3), чтобы, когда брокер не работал, другой мог обслуживать данные темы. Например, предположим, что у нас есть тема с 2 разделами с replication-factor, установленным на 2, как показано ниже:

Брокер 1:

+-------------------+
|      Topic 1      |
|    Partition 0    |
|                   |
|                   |
|                   |
|                   |
+-------------------+

Брокер 2:

+-------------------+
|      Topic 1      |
|    Partition 0    |
|                   |
|                   |
|     Topic 1       |
|   Partition 0     |
+-------------------+

Брокер 3:

+-------------------+
|      Topic 1      |
|    Partition 1    |
|                   |
|                   |
|                   |
|                   |
+-------------------+

Теперь предположим, что Broker 2 не удалось. Брокер 1 и 3 по-прежнему могут обслуживать данные по теме 1. Поэтому replication-factor из 3 - это всегда хорошая идея, поскольку он позволяет снять одного брокера в целях обслуживания, а также другого быть сбитым неожиданно. Таким образом, Apache-Kafka предлагает высокую надежность и отказоустойчивость.

Примечание о лидерах: В любое время только один посредник может быть лидером раздела, и только этот лидер может получать и обслуживать данные для этого раздела. Остальные брокеры будут просто синхронизировать данные (синхронные реплики). Также обратите внимание, что когда replication-factor установлен в 1, лидер не может быть перемещен в другое место, когда происходит сбой брокера. В общем случае, когда все реплики раздела выходят из строя или переходят в автономный режим, для leader автоматически устанавливается значение -1.

0 голосов
/ 31 октября 2018

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

Размещение реплики слияния - первоначальное размещение

Только создавать темы, принимать решения на основе текущих брокеров (команда создания темы вручную);

Все узлы не должны быть включенным и работать на солнце при использовании этого раздела (после его создания)

Документация Apache о факторе репликации

Коэффициент репликации определяет, сколько серверов будет реплицировать каждое написанное сообщение. Если у вас коэффициент репликации 3, то до 2 серверов могут выйти из строя, прежде чем вы потеряете доступ к своим данным. Мы рекомендуем использовать коэффициент репликации 2 или 3, чтобы можно было прозрачно передавать компьютеры без прерывания потребления данных.

...