Уничтожение узла с помощью __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.