Создание темы 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]}
]}
Это допустимое поведение. При создании новой темы все узлы должны быть запущены.
Размещение 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
.
Ошибка при попытке увеличить коэффициент репликации «Не удалось переназначить разделы из-за того, что файл данных переназначения раздела пуст. Kafka.common.AdminCommandFailedException: файл данных переназначения раздела пуст». Мой файл Json обновлен под вопросом
@dcds Опечатка. Вы пропустили запятую
@GiorgosMyrianthous: В приведенном выше примере вы упомянули «тему с 2 разделами с коэффициентом репликации 2», но на диаграмме вы создали 3 раздела с идентификатором «0». Пожалуйста, дайте мне знать, если я ошибаюсь.
@ARPANCHAKARVARTY Вы правы. Я отредактировал свой ответ. Спасибо.
Я хочу, чтобы мои данные реплицировались на 4 узла, поэтому мне нужен коэффициент репликации 4. Но для проверки отказоустойчивости сервиса kafka я останавливаю kafka на одном узле. и за это время я пытаюсь создать новую тему. Но, как вы упомянули, все узлы должны быть в рабочем состоянии. Итак, теперь в этом случае. Если я создам тему с репликацией 3, то позже Могу ли я изменить репликацию на 4 для этой вновь созданной темы?