Я новичок в 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 зависают из-за остановки виртуальных машин (только одна виртуальная машина выключается за раз, две другие активируются перед остановкой целевой виртуальной машины)
Есть ли какая-либо конфигурация, которую мне не хватает? Как сделать так, чтобы потребитель остался нетронутым, как производитель?