Когда в Кафке создается новая тема, она повторяется 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
.