Фейлинг создания темы kafka, когда 3 брокера находятся в кластере из 4

Создание темы Kafka не удается в следующих сценариях:

Узел - это кластер кафка: 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.

Это допустимое поведение или известная проблема в кафке?

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

загрузка 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]}
]}
Построение конвейеров данных в реальном времени с Apache Kafka: Руководство по Python
Построение конвейеров данных в реальном времени с Apache Kafka: Руководство по Python
Apache Kafka - популярная платформа распределенной потоковой передачи данных, которую можно использовать для построения конвейеров данных в реальном...
3
0
1 705
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Размещение Confluence Replica - первоначальное размещение

Only create the topic, make decision-based on current live brokers (manual create topic command);

Все узлы не должен будут запущены во время использования этой темы (после ее создания)

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

The replication factor controls how many servers will replicate each message that is written. If you have a replication factor of 3 then up to 2 servers can fail before you will lose access to your data. We recommend you use a replication factor of 2 or 3 so that you can transparently bounce machines without interrupting data consumption.

Ответ принят как подходящий

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

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

Если вы хотите создать тему с коэффициентом репликации, установленным на 4, в то время как один брокер не работает, вы можете сначала создать тему с replication-factor=3, и после того, как ваш 4-й брокер будет запущен и работает, вы можете изменить конфигурацию этой темы и увеличить ее коэффициент репликации на выполните следующие действия (при условии, что у вас есть тема 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 не содержит данных тема 2).

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

Брокер 1:

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

Брокер 2:

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

Брокер 3:

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

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

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

Я хочу, чтобы мои данные реплицировались на 4 узла, поэтому мне нужен коэффициент репликации 4. Но для проверки отказоустойчивости сервиса kafka я останавливаю kafka на одном узле. и за это время я пытаюсь создать новую тему. Но, как вы упомянули, все узлы должны быть в рабочем состоянии. Итак, теперь в этом случае. Если я создам тему с репликацией 3, то позже Могу ли я изменить репликацию на 4 для этой вновь созданной темы?

dcds 31.10.2018 12:56

Ошибка при попытке увеличить коэффициент репликации «Не удалось переназначить разделы из-за того, что файл данных переназначения раздела пуст. Kafka.common.AdminCommandFailedException: файл данных переназначения раздела пуст». Мой файл Json обновлен под вопросом

dcds 31.10.2018 14:40

@dcds Опечатка. Вы пропустили запятую

Giorgos Myrianthous 31.10.2018 15:11

@GiorgosMyrianthous: В приведенном выше примере вы упомянули «тему с 2 разделами с коэффициентом репликации 2», но на диаграмме вы создали 3 раздела с идентификатором «0». Пожалуйста, дайте мне знать, если я ошибаюсь.

ARPAN CHAKARVARTY 22.01.2020 06:56

@ARPANCHAKARVARTY Вы правы. Я отредактировал свой ответ. Спасибо.

Giorgos Myrianthous 22.01.2020 12:58

Другие вопросы по теме