通过docker 安装zookeeper和kafka
安装kafka 和zk
拉取镜像zookeeper和kafka的镜像
docker pull wurstmeister/zookeeper
docker pull wurstmeister/kafka
启动镜像,在启动中设置端口好,挂载,名称,环境变量,kafka要绑定使用哪个zk,因为各种应用,例如hbase也是使用zk,所以k8s上可能有多个zk。
# 后台启动zk
docker run -d --name kafka-zookeeper -p 2181:2181 --volume /etc/localtime:/etc/localtime wurstmeister/zookeeper:latest
# 后台启动kafka
docker run -d --name kafka -p 9092:9092 --link kafka-zookeeper --env KAFKA_ZOOKEEPER_CONNECT=kafka-zookeeper:2181 --env KAFKA_ADVERTISED_HOST_NAME=localhost --env KAFKA_ADVERTISED_PORT=9092 --volume /etc/localtime:/etc/localtime wurstmeister/kafka:latest
坑点:
若非本地环境,此外有坑,即只能本地访问kafka,外网无法访问kafka:
-
如果advertised.host.name没有设,host.name不能设为0.0.0.0,否则client通过zk拿到的broker地址就是0.0.0.0。
如果指定要bind到所有interface,host.name不设就可以。 -
如果host.name和advertised.host.name都不设,client通过zk拿到的就是JVM返回的本机hostname,如果这个hostname是client无法访问到的,client就会连不上broker。
所以如果要bind到所有interface,client又能访问,解决的办法是host.name不设或设置0.0.0.0,advertised.host.name一定要设置为一个client可以访问的地址,如直接设IP地址。
如果不需要bind到所有interface,也可以只在host.name设置IP地址。
简单的检查broker是否可以被client访问到的办法,就是在zookeeper中看broker信息,上面显示的hostname是否是client可以访问到的地址。
在zkCli中执行get /brokers/<id>
处理方法:
需要进入kafka容器,
cd /opt/kafka/config
vi server.properties
# 添加以下两行,才能从外网ip进行访问
listeners=PLAINTEXT://:9092
advertised.listeners=PLAINTEXT://外网ip:9092
# 重启 kafka
docker kill xxxxid
docker ps -a
docker start xxxxid
测试发送消息
执行docker ps,找到kafka的CONTAINER ID,进入容器内部:
docker exec -it <CONTAINER ID> /bin/bash
进入kafka默认目录
cd opt/kafka_2.11-2.0.0/
创建一个主题:主题是由zk保管的
bin/kafka-topics.sh --create --zookeeper kafka-zookeeper:2181 --replication-factor 1 --partitions 1 --topic mykafka
运行一个消息生产者,指定topic为刚刚创建的主题
bin/kafka-console-producer.sh --broker-list localhost:9092 --topic mykafka
运行生产者以后,命令行便可以一直输入数据。
启动消费者
另起一个端口进入容器,启动消费者
cd opt/kafka/
查看所有的topic列表
bin/kafka-topics.sh --list --zookeeper kafka-zookeeper:2181
运行一个消费者,指定同样的主题
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic mykafka --from-beginning
这时在生产者输入测试消息,在消费者就可以接收消息了

浙公网安备 33010602011771号