docker部署kafka

1、拉取镜像

docker pull wurstmeister/zookeeper  
docker pull wurstmeister/kafka 

2、创建容器

创建并运行zookeeper

docker run -d --network=docker-network  --name=zookeeper -p 2181:2181  --privileged=true --restart always -v /etc/localtime:/etc/localtime wurstmeister/zookeeper 

创建并运行kafka

docker run -d --restart=always --privileged=true --log-driver json-file --log-opt max-size=100m --log-opt max-file=2 --name kafka  -p 9092:9092 -e KAFKA_BROKER_ID=0 -e KAFKA_ZOOKEEPER_CONNECT=192.168.139.187:2181/kafka   -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.139.187:9092 -e KAFKA_LISTENERS=PLAINTEXT://:9092 --restart always -v /etc/localtime:/etc/localtime wurstmeister/kafka

这里我遇到了个问题

kafka.zookeeper.ZooKeeperClientTimeoutException: Timed out waiting for connection while in state: CONNECTING
	at kafka.zookeeper.ZooKeeperClient.$anonfun$waitUntilConnected$3(ZooKeeperClient.scala:242)
	at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:23)
	at kafka.utils.CoreUtils$.inLock(CoreUtils.scala:251)
	at kafka.zookeeper.ZooKeeperClient.waitUntilConnected(ZooKeeperClient.scala:238)
	at kafka.zookeeper.ZooKeeperClient.<init>(ZooKeeperClient.scala:96)
	at kafka.zk.KafkaZkClient$.apply(KafkaZkClient.scala:1825)
	at kafka.server.KafkaServer.createZkClient$1(KafkaServer.scala:361)
	at kafka.server.KafkaServer.initZkClient(KafkaServer.scala:385)
	at kafka.server.KafkaServer.startup(KafkaServer.scala:205)
	at kafka.server.KafkaServerStartable.startup(KafkaServerStartable.scala:38)
	at kafka.Kafka$.main(Kafka.scala:75)
	at kafka.Kafka.main(Kafka.scala)

这个问题是因为我原先的 KAFKA_ZOOKEEPER_CONNECT 配置的问题
我曾尝试过这些,这些对我来说都有问题

KAFKA_ZOOKEEPER_CONNECT=0.0.0.0:2181/kafka 
KAFKA_ZOOKEEPER_CONNECT=127.0.0.1:2181/kafka
#因为127.0.0.1或0.0.0.0相对kafka镜像来说是自己的镜像内部的内部ip,docker镜像外部无法访问
KAFKA_ZOOKEEPER_CONNECT=172.19.0.2:2181/kafka
 #172.19.0.2  为zookeeper网卡的IP 
参数说明:
-e KAFKA_BROKER_ID=0 在kafka集群中,每个kafka都有一个BROKER_ID来区分自己

-e KAFKA_ZOOKEEPER_CONNECT=192.168.139.187:2181/kafka 将配置中 KAFKA_ZOOKEEPER_CONNECT的zookeeper的端口设置为外网ip,因为127.0.0.1或0.0.0.0相对kafka镜像来说是自己的镜像内部的内部ip,docker镜像外部无法访问。

-e KAFKA_LISTENERS=PLAINTEXT://:9092 配置kafka的监听端口 就是主要用来定义Kafka Broker的Listener的配置项。 是kafka真正bind的地址

-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.139.187:9092 参数的作用就是将Broker的Listener信息发布到Zookeeper中 是暴露给外部的listeners,如果没有设置,会用listeners

-v /etc/localtime:/etc/localtime 容器时间同步虚拟机的时间

3、修改kafka的配置文件server.properties

cd /opt/kafka_2.13-2.6.0/
vi server.properties

server.properties配置文件的内容如下所示

broker.id=0   										# 表示broker的编号,如果集群中有多个broker,则每个broker的编号需要设置的不同
listeners=PLAINTEXT://:9092 			# brokder对外提供的服务入口地址
log.dirs=/tmp/kafka-logs  							# 设置存放消息日志文件的地址
zookeeper.connect=192.168.139.187:2181/kafka 				# Kafka所需Zookeeper集群地址,学习中Zookeeper和Kafka都安装本机

4、创建主题

这个个指令在我安装配置的kafka会发生新手级别错误:

bin/kafka-topics.sh --zookeeper 192.168.139.187:2181 --create --topic itheima --partitions 2 --replication-factor 1				# 创建主题,表示副本因子,表示每一个分区具有的副本数(包含分区本身),副本因子数不能超过broker的数量

这里我遇到这个问题

Error while executing topic command : Replication factor: 1 larger than available brokers: 0.
[2020-10-29 14:24:53,137] ERROR org.apache.kafka.common.errors.InvalidReplicationFactorException: Replication factor: 1 larger than available brokers: 0.
 (kafka.admin.TopicCommand$)

这个问题只因为指定的zookeeper地址不对,创建kafka的时候配置的是KAFKA_ZOOKEEPER_CONNECT=192.168.139.187:2181/kafka所以正确的指定令为:

bin/kafka-topics.sh --zookeeper 192.168.139.187:2181/kafka --create --topic itheima --partitions 2 --replication-factor 1	

# 查看所有的主题
bin/kafka-topics.sh --zookeeper 192.168.139.187:2181/kafka  --list	
# 查看主题的详细信息
bin/kafka-topics.sh --zookeeper 192.168.139.187:2181/kafka  --describe --topic itheima				
# 删除主题							
bin/kafka-topics.sh --delete --zookeeper 192.168.139.187:2181/kafka  --topic itheima											
# 开启一个消费者(使用新shell窗口,用来测试消费数据)
bin/kafka-console-consumer.sh --bootstrap-server 192.168.139.187:9092 --topic itheima	
# 开启一个生产者(使用新shell窗口,用来测试接收数据)		
bin/kafka-console-producer.sh --broker-list 192.168.139.187:9092 --topic itheima										

修改分区数
增加分区数
bin/kafka-topics.sh --alter --zookeeper 192.168.139.187:2181/kafka --topic itheima --partitions 3

修改分区数时,仅能增加分区个数。
bin/kafka-topics.sh --alter --zookeeper 192.168.139.187:2181/kafka --topic heima --partitions 2
Logo

Kafka开源项目指南提供详尽教程,助开发者掌握其架构、配置和使用,实现高效数据流管理和实时处理。它高性能、可扩展,适合日志收集和实时数据处理,通过持久化保障数据安全,是企业大数据生态系统的核心。

更多推荐