Почему потребитель Kafka зависает при отказе узла, а производитель остается незатронутым? - PullRequest
0 голосов
/ 23 октября 2019

Я новичок в Kafka и пытаюсь создать кластер Kafka с 3 узлами для высокой доступности.

Я следовал этому руководству , и я выполнил настройку в Google Compute Instance (Виртуальные машины GCP).

Я пытался создавать темы с разными --replication-factor. Вот пример с фактором репликации = 3. Я также попробовал значения 1 и 2.

# With replication factor-3
bin/kafka-topics.sh --create \
  --bootstrap-server xxx.xx.xx.xxx:9092,yy.yyy.yyy.yy:9092,zzz.zz.zz.zzz:9092 \
  --replication-factor 3 --partitions 1 --topic sample-topic

Вот так выглядит мой потребительский код:

from kafka import KafkaConsumer

consumer = KafkaConsumer(
    'sample-topic',
    bootstrap_servers=[
        'yyy.yy.yy.yyy'
    ],

    client_id="sample-client-name",
    auto_offset_reset="earliest",
    group_id="sample-group-name")

for message in consumer:
    print(message)

Вот так выглядит мой код производителя:

from time import sleep
from kafka import KafkaProducer

producer = KafkaProducer(
    bootstrap_servers=[
        'xxx.xx.xx.xxx', 'yyy.yy.yy.yyy', 'zzz.zz.zz.zzz'])
for i in range(1000):
    message = str.encode("Message: " + str(i))
    producer.send('sample-topic', value=message)
    print("sent: {}".format(i))
    sleep(5)

[xxx.xx.xx.xxx, yyy.yy.yy.yyy, zzz.zz.zz.zzz выше - IP-адреса виртуальных машин]

Первоначально установка работает довольно хорошо. Теперь я начинаю останавливать виртуальные машины (всегда сохраняя работоспособность 2 виртуальных машин. Всякий раз, когда я хочу остановить другую виртуальную машину, я проверяю, что живы хотя бы две виртуальные машины).

Код производителя имеет тот же bootstrap_servers, что и код потребителя. Я попытался сохранить только 1 и 2 сервера внутри bootstrap_servers, но это не удалось, по крайней мере, одна из виртуальных машин вышла из строя (попытался отключить все три виртуальные машины одну за другой, убедившись, что у меня будут работать 2 виртуальные машины).

Потребители Kafka зависают из-за остановки виртуальных машин (только одна виртуальная машина выключается за раз, две другие активируются перед остановкой целевой виртуальной машины)

Есть ли какая-либо конфигурация, которую мне не хватает? Как сделать так, чтобы потребитель остался нетронутым, как производитель?

1 Ответ

1 голос
/ 24 октября 2019

Если я правильно прочитал этот связанный пост, в нем не упоминается, что offsets.topic.replication.factor также придется увеличить.

В противном случае остановка посредника, содержащего одну реплику, приведет к тому, что потребители не смогут выполнить коммит. / поиск смещений

...