kafka群集在zookeeper重新启动后丢失消息

hgqdbh6s  于 2021-06-07  发布在  Kafka
关注(0)|答案(2)|浏览(470)

我正在使用docker启动一个kafka代理集群(例如,5个代理,每个容器一个代理)。Kafka版本2.12-0.11.0.0,zookeeper 3.4.10。
场景:
使用下面的配置启动第一个代理
动物园.cfg

tickTime=2000
initLimit=10
syncLimit=5

dataDir=/opt/zookeeper/data

clientPort=2181
maxClientCnxns=10
minSessionTimeout=4000
maxSessionTimeout=1000000
server.1=0.0.0.0:2888:3888

服务器属性

broker.id=1
listeners=PLAINTEXT://:9092
advertised.listeners=PLAINTEXT://broker1_IP:broker1_PORT
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=/tmp/kafka-logs
num.partitions=1
num.recovery.threads.per.data.dir=1
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
log.retention.hours=168
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
zookeeper.connect=127.0.0.1:2181
zookeeper.session.timeout.ms=6000
zookeeper.connection.timeout.ms=1000000
group.initial.rebalance.delay.ms=0

生产商属性

bootstrap.servers=localhost:9092
compression.type=none

消费者财产

zookeeper.connect=127.0.0.1:2181
zookeeper.session.timeout.ms=6000
zookeeper.connection.timeout.ms=1000000
group.id=test-consumer-group

zookeeper以独立模式启动,然后启动kafka
创建主题 /opt/kafka/bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic my-test-topic1 正在发送消息 echo "test_kafka1" | /opt/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic my-test-topic1 正在检查消息 /opt/kafka/bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --from-beginning --topic my-test-topic1 --max-messages 1 消息已收到
描述主题 /opt/kafka/bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic my-test-topic1 Topic:my-test-topic1 PartitionCount:1 ReplicationFactor:1 Configs: Topic: my-test-topic1 Partition: 0 Leader: 1 Replicas: 1 Isr: 1 开始休息4个经纪人
从1号到5号的每个代理上的zoo.cfg(只有0.0.0.0:2888:3888位置不同)

tickTime=2000
initLimit=10
syncLimit=5

dataDir=/opt/zookeeper/data

clientPort=2181
maxClientCnxns=10
minSessionTimeout=4000
maxSessionTimeout=1000000
server.1=0.0.0.0:2888:3888
server.2=broker2_IP:broker2_2888:broker2_3888
server.3=broker3_IP:broker3_2888:broker3_3888
server.4=broker4_IP:broker4_2888:broker4_3888
server.5=broker5_IP:broker5_2888:broker5_3888

从1到5的每个代理上的server.properties(broker.id是唯一的,broker\u ip:broker\u port对于ech broker是不同的)

broker.id=N
listeners=PLAINTEXT://:9092
advertised.listeners=PLAINTEXT://broker_IP:broker_PORT
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=/tmp/kafka-logs
num.partitions=1
num.recovery.threads.per.data.dir=1
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
log.retention.hours=168
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
zookeeper.connect=127.0.0.1:2181
zookeeper.session.timeout.ms=6000
zookeeper.connection.timeout.ms=1000000
group.initial.rebalance.delay.ms=0

从1号到5号,每个经纪人的财产

bootstrap.servers=localhost:9092
compression.type=none

从1号到5号,每个经纪人的消费者财产

zookeeper.connect=127.0.0.1:2181
zookeeper.session.timeout.ms=6000
zookeeper.connection.timeout.ms=1000000
group.id=test-consumer-group

在每个代理上重新启动zookeeper以使zoo.cfg生效
Zookeeper聚成一团
主题移至broker 5 /opt/kafka/bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic my-test-topic1 Topic:my-test-topic1 PartitionCount:1 ReplicationFactor:1 Configs: Topic: my-test-topic1 Partition: 0 Leader: 5 Replicas: 5 Isr: 5 这是正常的行为吗?还是应该留在broker 1上?
检查每个代理上的消息 /opt/kafka/bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --from-beginning --topic my-test-topic1 --max-messages 1 消息丢失(当主题停留在broker 1上时消息不会丢失,因此处于浮动状态)

p8ekf7hl

p8ekf7hl1#

你试过把计时时间提高到6000吗?基于hadoop的设置,默认情况下他们会使用这个设置,表示2000毫秒的设置太低。我想这里也一样。我现在正在研究一个非常类似的Kafka问题。

aiqt4smr

aiqt4smr2#

在kafka文档中,config description和config example都建议指定代理中的所有zookeeper服务器 zookeeper.connect . 同样在生产环境中,您需要运行一个单独的zookeeper集群和一个单独的kafka集群,而不是在一个docker容器中共同运行kafka和zk。
我想可能会发生这样的事情:
由于您如何重新启动docker容器的一些细节,zks 2-5不知道kafka 1在ZK1中创建了一个znode来描述您的测试主题,以便具有“replicas:1,isr:1”,或者不同意使用ZK1版本,因为没有仲裁
容器2-5的一些子集启动,5个zk中的3个在那里形成一个仲裁,而不用等待zk1
某些东西(使用者或命令行工具或代理自动创建)尝试使用该主题,由于zk quorum同意该主题尚不存在,因此创建该主题并将副本分配给当前可用的代理之一(本例中为5)。
容器1启动时,zk1必须放弃topicznode版本以支持quorum,kafka必须放弃其副本以支持当前描述的。
我不确定从单节点zookeeper移动到复制设置的正确方法是什么,在文档中找不到。也许你得先分配更多 weight 首先是zk,这样可以保证它成为一个领导者,并在其他zk节点上强制进行主题配置。
你创造了一个jira问题吗?有开发商的回应吗?

相关问题