Уничтожение узла с помощью __consumer_offsets не приводит к потреблению сообщений у потребителей

У меня есть 3 узла (node0,node1,node2) Kafka кластер (broker0, broker1, broker2) с фактором репликации 2 и Zookeeper(используя zookeeper, упакованный с tar Kafka), работающий на другом узле (узел 4).

Я запустил брокер 0 после запуска zookeper и затем оставшихся узлов. В журналах брокера 0 видно, что он читает __consumer_offsets, и кажется, что они хранятся в брокере 0. Ниже приведены примеры журналов:

Kafka Версия: kafka_2.10-0.10.2.0

    2017-06-30 10:50:47,381] INFO [GroupCoordinator 0]: Loading group metadata for console-consumer-85124 with generation 2 (kafka.coordinator.GroupCoordinator)
    [2017-06-30 10:50:47,382] INFO [Group Metadata Manager on Broker 0]: Finished loading offsets from __consumer_offsets-41 in 23 milliseconds. (kafka.coordinator.GroupMetadataManager)
    [2017-06-30 10:50:47,382] INFO [Group Metadata Manager on Broker 0]: Loading offsets and group metadata from __consumer_offsets-44 (kafka.coordinator.GroupMetadataManager)
    [2017-06-30 10:50:47,387] INFO [Group Metadata Manager on Broker 0]: Finished loading offsets from __consumer_offsets-44 in 5 milliseconds. (kafka.coordinator.GroupMetadataManager)
    [2017-06-30 10:50:47,387] INFO [Group Metadata Manager on Broker 0]: Loading offsets and group metadata from __consumer_offsets-47 (kafka.coordinator.GroupMetadataManager)
    [2017-06-30 10:50:47,398] INFO [Group Metadata Manager on Broker 0]: Finished loading offsets from __consumer_offsets-47 in 11 milliseconds. (kafka.coordinator.GroupMetadataManager)
    [2017-06-30 10:50:47,398] INFO [Group Metadata Manager on Broker 0]: Loading offsets and group metadata from __consumer_offsets-1 (kafka.coordinator.GroupMetadataManager)

Кроме того, я вижу сообщения GroupCoordinator в журналах того же брокера 0.

[2017-06-30 14:35:22,874] INFO [GroupCoordinator 0]: Preparing to restabilize group console-consumer-34472 with old generation 1 (kafka.coordinator.GroupCoordinator)
    [2017-06-30 14:35:22,877] INFO [GroupCoordinator 0]: Group console-consumer-34472 with generation 2 is now empty (kafka.coordinator.GroupCoordinator)
    [2017-06-30 14:35:25,946] INFO [GroupCoordinator 0]: Preparing to restabilize group console-consumer-6612 with old generation 1 (kafka.coordinator.GroupCoordinator)
    [2017-06-30 14:35:25,946] INFO [GroupCoordinator 0]: Group console-consumer-6612 with generation 2 is now empty (kafka.coordinator.GroupCoordinator)
    [2017-06-30 14:35:38,326] INFO [GroupCoordinator 0]: Preparing to restabilize group console-consumer-30165 with old generation 1 (kafka.coordinator.GroupCoordinator)
    [2017-06-30 14:35:38,326] INFO [GroupCoordinator 0]: Group console-consumer-30165 with generation 2 is now empty (kafka.coordinator.GroupCoordinator)
    [2017-06-30 14:43:15,656] INFO [Group Metadata Manager on Broker 0]: Removed 0 expired offsets in 3 milliseconds. (kafka.coordinator.GroupMetadataManager)
    [2017-06-30 14:53:15,653] INFO [Group Metadata Manager on Broker 0]: Removed 0 expired offsets in 0 milliseconds. (kafka.coordinator.GroupMetadataManager)

При тестировании отказоустойчивости для кластера с использованием kafka-console-consumer.sh и kafka-console-producer.sh я вижу, что при уничтожении посредника 1 или посредника 2 потребитель все еще может получать новые сообщения от производителя. Перебаланс происходит правильно.

Однако убийство брокера 0 не приводит к потреблению новых или старых сообщений у любого количества потребителей. Ниже приведено состояние темы до и после уничтожения брокера 0.

До

Topic:test-topic    PartitionCount:3    ReplicationFactor:2 Configs:
    Topic: test-topic   Partition: 0    Leader: 2   Replicas: 2,0   Isr: 0,2
    Topic: test-topic   Partition: 1    Leader: 0   Replicas: 0,1   Isr: 0,1
    Topic: test-topic   Partition: 2    Leader: 1   Replicas: 1,2   Isr: 1,2

После

Topic:test-topic    PartitionCount:3    ReplicationFactor:2 Configs:
    Topic: test-topic   Partition: 0    Leader: 2   Replicas: 2,0   Isr: 2
    Topic: test-topic   Partition: 1    Leader: 1   Replicas: 0,1   Isr: 1
    Topic: test-topic   Partition: 2    Leader: 1   Replicas: 1,2   Isr: 1,2

Далее следуют сообщения ПРЕДУПРЕЖДЕНИЕ, которые появляются в журналах пользователей после уничтожения брокера 0.

[2017-06-30 14:19:17,155] WARN Auto-commit of offsets {test-topic-2=OffsetAndMetadata{offset=4, metadata=''}, test-topic-0=OffsetAndMetadata{offset=5, metadata=''}, test-topic-1=OffsetAndMetadata{offset=4, metadata=''}} failed for group console-consumer-34472: Offset commit failed with a retriable exception. You should retry committing offsets. (org.apache.kafka.clients.consumer.internals.ConsumerCoordinator)
[2017-06-30 14:19:10,542] WARN Auto-commit of offsets {test-topic-2=OffsetAndMetadata{offset=4, metadata=''}, test-topic-0=OffsetAndMetadata{offset=5, metadata=''}, test-topic-1=OffsetAndMetadata{offset=4, metadata=''}} failed for group console-consumer-30165: Offset commit failed with a retriable exception. You should retry committing offsets. (org.apache.kafka.clients.consumer.internals.ConsumerCoordinator)

Брокер Недвижимости. Остальные свойства по умолчанию не изменены.

broker.id=0
delete.topic.enable=true

auto.create.topics.enable=false
listeners=PLAINTEXT://XXX:9092
advertised.listeners=PLAINTEXT://XXX:9092
log.dirs=/tmp/kafka-logs-test1
num.partitions=3
zookeeper.connect=XXX:2181

Свойства производителя. Остальные свойства по умолчанию не изменены.

bootstrap.servers=XXX,XXX,XXX
compression.type=snappy

Потребительские свойства. Остальные свойства по умолчанию не изменены.

zookeeper.connect=XXX:2181
zookeeper.connection.timeout.ms=6000
group.id=test-consumer-group

Насколько я понимаю, если узел, содержащий / действующий GroupCoordinator и __consumer_offsets, умирает, то потребитель не сможет возобновить нормальную работу, несмотря на то, что новые лидеры избраны для разделов.

Я вижу нечто подобное, опубликованное в посте. Этот пост предлагает перезапустить мертвый узел брокера. Однако при использовании сообщений будет задержка, несмотря на наличие большего количества узлов, до тех пор, пока посредник 0 не будет перезапущен в производственной среде.

Q1: Как можно смягчить вышеуказанную ситуацию?

Q2: есть ли способ изменить GroupCoordinator, __consumer_offsets на другой узел?

Любые предложения / помощь приветствуется.

1 ответ

Решение

Проверьте коэффициент репликации в разделе __consumer_offsets. Если это не 3, то это ваша проблема.

Запустите следующую команду kafka-topics --zookeeper localhost:2181 --describe --topic __consumer_offsets и посмотреть, если в первой строке вывода написано "ReplicationFactor:1" или "ReplicationFactor:3".

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