kafka教程
以前我们已经成功创建了Zookeeper集成,现在是时候添加一些将连接到该集成的Kafka代理了,我们将执行一些命令。
<div>
<img src="https://s2.51cto.com/images/blog/202410/07091948_670337342be0870059.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=" alt="">
</div>
我们将从先前编译的同一docker compose文件中提取。 首先,让我们跳一下Kafka代理所需
的配置。
offsets.topic.replication.factor= 1
transaction.state.log.replication.factor= 1
transaction.state.log.min.isr= 1
group.initial.rebalance.delay.ms= 0
socket.send.buffer.bytes= 102400
delete.topic.enable= true
socket.request.max.bytes= 104857600
log.cleaner.enable= true
log.retention.check.interval.ms= 300000
log.retention.hours= 168
num.io.threads= 8
broker.id= 0
log4j.opts=-Dlog4j.configuration=file:/etc/kafka/log4j.properties
log.dirs=/var/lib/kafka
auto.create.topics.enable= true
num.network.threads= 3
socket.receive.buffer.bytes= 102400
log.segment.bytes= 1073741824
num.recovery.threads.per.data.dir= 1
num.partitions= 1
zookeeper.connection.timeout.ms= 6000
zookeeper.connect=zookeeper- 1 : 2181 ,zookeeper- 2 : 2181 ,zookeeper- 3 : 2181
将经历那些必不可少的知识。
- offsets.topic.replication.factor:如何复制内部偏移量主题–复制因子
- transaction.state.log.replication.factor:如何复制内部事务主题–复制因子
- transaction.state.log.min.isr:内部事务主题的最小同步副本
- delete.topic.enable:如果不是true,Kafka将忽略delete topic命令
- socket.request.max.bytes:请求的最大大小
- log.retention.check.interval.ms:评估是否应删除日志的间隔
- log.retention.hours:删除日志之前要保留多少小时
- broker.id:该安装的代理ID是什么
- log.dirs:Kafka将存储日志数据的目录,可以用逗号分隔
- auto.create.topics.enable:如果在发送/使用消息或询问主题元数据时不存在主题,则创建主题
- num.network.threads:接收来自网络的请求和发送响应的线程
- socket.receive.buffer.bytes:服务器套接字的缓冲区
- log.segment.bytes:日志文件的大小
- num.recovery.threads.per.data.dir:启动时用于日志恢复以及关闭时用于刷新的线程
- num.partitions:与未指定分区号的主题创建后的默认分区号有关。
- zookeeper.connection.timeout.ms:客户端与ZooKeeper建立连接所需的时间
- zookeeper.connect:是ZooKeeper服务器的列表
现在是时候为每个代理创建属性了。 由于broker.id属性,我们需要使用相应的broker.id创建不同的文件
因此,我们的第一个经纪人文件如下所示(broker.id 1)。 请记住,这些代理将在相同的docker-compose文件上运行。 因此,zookeeper.connect属性包含内部docker compose dns名称。 该文件的名称将命名为server1.properties。
socket.send.buffer.bytes= 102400
delete.topic.enable= true
socket.request.max.bytes= 104857600
log.cleaner.enable= true
log.retention.check.interval.ms= 300000
log.retention.hours= 168
num.io.threads= 8
broker.id= 1
transaction.state.log.replication.factor= 1
log4j.opts=-Dlog4j.configuration\=file\:/etc/kafka/log4j.properties
group.initial.rebalance.delay.ms= 0
log.dirs=/var/lib/kafka
auto.create.topics.enable= true
offsets.topic.replication.factor= 1
num.network.threads= 3
socket.receive.buffer.bytes= 102400
log.segment.bytes= 1073741824
num.recovery.threads.per.data.dir= 1
num.partitions= 1
transaction.state.log.min.isr= 1
zookeeper.connection.timeout.ms= 6000
zookeeper.connect=zookeeper- 1 \: 2181 ,zookeeper- 2 \: 2181 ,zookeeper- 3 \: 2181
同样的配方适用于broker.id = 2和broker.id = 3
创建了这三个代理配置文件之后,该更改docker-compose配置了。
version: "3.8"
services:
zookeeper-1:
container_name: zookeeper-1
image: zookeeper
ports:
- "2181:2181"
environment:
ZOO_MY_ID: "1"
ZOO_SERVERS: server.1=0.0.0.0:2888:3888;2181 server.2=zookeeper-2:2888:3888;2181 server.3=zookeeper-3:2888:3888;2181
zookeeper-2:
container_name: zookeeper-2
image: zookeeper
ports:
- "2182:2181"
environment:
ZOO_MY_ID: "2"
ZOO_SERVERS: server.1=zookeeper-1:2888:3888;2181 server.2=0.0.0.0:2888:3888;2181 server.3=zookeeper-3:2888:3888;2181
zookeeper-3:
container_name: zookeeper-3
image: zookeeper
ports:
- "2183:2181"
environment:
ZOO_MY_ID: "3"
ZOO_SERVERS: server.1=zookeeper-1:2888:3888;2181 server.2=0.0.0.0:2888:3888;2181 server.3=zookeeper-3:2888:3888;2181
kafka-1:
container_name: kafka-1
image: confluent /kafka
ports:
- "9092:9092"
volumes:
- type : bind
source : . /server1 .properties
target: /etc/kafka/server .properties
kafka-2:
container_name: kafka-2
image: confluent /kafka
ports:
- "9093:9092"
volumes:
- type : bind
source : . /server2 .properties
target: /etc/kafka/server .properties
kafka-3:
container_name: kafka-3
image: confluent /kafka
ports:
- "9094:9092"
volumes:
- type : bind
source : . /server3 .properties
target: /etc/kafka/server .properties
让我们启动docker-compose文件。
> docker-compose -f docker-compose.yaml up
就像前面的示例一样,我们将在容器中运行一些命令。
现在,我们已经与Zookeeper和多个Kafka经纪人建立了一个适当的集群,现在该测试它们是否一起工作。第一个操作是创建一个复制因子为3的主题。预期的结果将是对该主题进行复制3 kafka经纪人
> docker exec -it kafka-1 /bin/bash
confluent@92a6d381d0db:/$ kafka-topics --zookeeper zookeeper-1:2181,zookeeper-2:2181,zookeeper-3:2181 --create --topic tutorial-topic --replication-factor 3 --partitions 1
我们的主题已创建,让我们检查主题的描述。
confluent@92a6d381d0db:/$ kafka-topics --describe --topic tutorial-topic --zookeeper zookeeper-1:2181,zookeeper-2:2181,zookeeper-3:2181
Topic:tutorial-topic PartitionCount:1 ReplicationFactor:3 Configs:
Topic: tutorial-topic Partition: 0 Leader: 2 Replicas: 2,1,3 Isr: 2,1,3
如我们所见,分区的领导者是经纪人2
下一步是将一些数据放入最近创建的主题。 在执行此操作之前,我将添加一个使用者以侦听该主题的消息。 在我们将消息发布到主题时,这些消息将由该消费者打印。
> docker exec -it kafka-3 /bin/bash
confluent@4042774f8802:/$ kafka-console-consumer --topic tutorial-topic --from-beginning --zookeeper zookeeper-1:2181,zookeeper-2:2181,zookeeper-3:2181
让我们添加一些主题数据。
> docker exec -it kafka-1 /bin/bash
confluent@92a6d381d0db:/$ kafka-console-producer --topic tutorial-topic --broker-list kafka-1:9092,kafka-2:9092
test1
test2
test3
正如预期的那样,另一个终端上的使用者将打印预期的消息。
test1
test2
test3
由于具有集群,最好停止领导经纪人,并请其他经纪人担任领导。 在执行此操作时,预期结果将是复制所有消息,并且不会中断使用和发布消息。
停止领导者是经纪人2
> docker stop kafka-2
检查其他经纪人的领导
confluent@92a6d381d0db:/$ kafka-topics --describe --topic tutorial-topic --zookeeper zookeeper-1:2181,zookeeper-2:2181,zookeeper-3:2181
Topic:tutorial-topic PartitionCount:1 ReplicationFactor:3 Configs:
Topic: tutorial-topic Partition: 0 Leader: 1 Replicas: 2,1,3 Isr: 1,3
领导者现在是kafka-1
阅读消息以确保它们确实已被复制。
> docker exec -it kafka-3 /bin/bash
confluent@4042774f8802:/$ kafka-console-consumer --topic tutorial-topic --from-beginning --zookeeper zookeeper-1:2181,zookeeper-2:2181,zookeeper-3:2181
test1
test2
test3
正如预期的那样,除了建立领导层外,我们的数据也已被复制!
如果我们尝试发布新消息,这也将是成功的行动。
因此,总而言之,我们确实运行了一个与动物园管理员集成的Kafka集群。 我们确实创建了一个对3个代理启用了复制的主题,最后但并非最不重要的一点是,我们测试了如果一个代理发生故障会发生什么。
在下一个博客中,我们将对其进行包装,以便我们的本地计算机客户端可以连接到docker compose集成。
翻译自: https://www.javacodegeeks.com/2020/11/kafka-zookeeper-for-development-connecting-brokers-to-the-ensemble.html
kafka教程