Потеря данных в производителе кафки, когда брокер Кафки выходит из строя и возвращается - PullRequest
2 голосов
/ 13 июня 2019

Я сталкиваюсь с некоторой потерей данных всякий раз, когда брокер Kafka выходит из строя и присоединяется обратно. Я предполагаю, что перебалансировка запускается всякий раз, когда брокер присоединяется к кластеру, и в этот момент я заметил некоторые ошибки в моем Kafka Producer.

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

[WARN ] 2019-06-05 20:39:08 WARN  Sender:521 - [Producer clientId=producer-1] Got error produce response with correlation id 133054 on topic-partition test_ve-17, retrying (2 attempts left). Error: NOT_LEADER_FOR_PARTITION
...
...
[WARN ] 2019-06-05 20:39:31 WARN  Sender:521 - [Producer clientId=producer-1] Got error produce response with correlation id 133082 on topic-partition test_ve-12, retrying (1 attempts left). Error: NOT_ENOUGH_REPLICAS
...
...
[ERROR] 2019-06-05 20:39:43 ERROR GlobalsKafkaProducer:297 - org.apache.kafka.common.errors.NotEnoughReplicasException: Messages are rejected since there are fewer in-sync replicas than required.
...
...
[WARN ] 2019-06-05 20:39:48 WARN  Sender:521 - [Producer clientId=producer-1] Got error produce response with correlation id 133094 on topic-partition test_ve-22, retrying (1 attempts left). Error: NOT_ENOUGH_REPLICAS
[ERROR] 2019-06-05 20:39:53 ERROR Sender:604 - [Producer clientId=producer-1] The broker returned org.apache.kafka.common.errors.OutOfOrderSequenceException: The broker received an out of order sequence number for topic-partition test_ve-37 at offset -1. This indicates data loss on the broker, and should be investigated.
[INFO ] 2019-06-05 20:39:53 INFO  TransactionManager:372 - [Producer clientId=producer-1] ProducerId set to -1 with epoch -1
[ERROR] 2019-06-05 20:39:53 ERROR GlobalsKafkaProducer:297 - org.apache.kafka.common.errors.OutOfOrderSequenceException: The broker received an out of order sequence number
...
...
RROR] 2019-06-05 20:39:53 ERROR GlobalsKafkaProducer:297 - org.apache.kafka.common.errors.OutOfOrderSequenceException: Attempted to retry sending a batch but the producer id changed from 417002 to 418001 in the mean time. This batch will be dropped.

Некоторые из наших настроек Kafka

acks = all
min.insync.replicas=2
unclean.leader.election.enable=false
linger.ms=250
retries = 3

Я вызываю flush () после создания каждых 3000 записей. Есть что-то, что я делаю неправильно, какие-нибудь указатели, пожалуйста?

1 Ответ

1 голос
/ 14 июня 2019

Позвольте мне предположить несколько вещей, у вас есть 3 узла брокера Kafka, и коэффициент репликации для всех тем также равен 3. Вы не создаете темы на лету.

Как вы дали:

acks = all
min.insync.replicas=2
unclean.leader.election.enable=false

В этом случае, если обе реплики синхронизируются, вы обязательно отбросите данные. Поскольку последняя оставшаяся реплика не может быть выбрана в качестве лидера для вашего кластера, поскольку unclean.leader.election.enable=false, и нет лидера для получения запроса на отправку. Так как вы установили linger.ms= 250, одна из реплик insync вернулась в рабочее состояние за это короткое время и снова была выбрана в качестве лидера темы, поэтому вы избежите потери данных. Но предостережение linger.ms работает вместе с batch.size. Если вы установили очень низкое значение для batch.size и количество отправленных сообщений достигло размера пакета, производитель может не дождаться достижения настроек linger.ms.

Так что одно из определенных изменений, которые я рекомендую, - увеличить retries. Проверьте свою конфигурацию для параметра request.timeout.ms. Найдите свое среднее время, необходимое брокеру, чтобы вернуться после завершения работы. Ваши повторные попытки должны охватывать время, необходимое брокеру, чтобы ожить в случае возникновения причинно-следственной связи. Это, безусловно, поможет вам избежать потери данных, если все другие компромиссы существуют, чтобы уменьшить вероятность потери данных.

...