前言
文章主要介绍以docker容器的方式部署kafka集群。 很多内容参考(chao xi)了的博文,同时把自己搭建过程中遇到的问题及觉得需要重点关注的地方做了说明补充。
环境说明
- 三台虚拟机:centos7.3 docker1.12.6(192.168.83.151,192.168.83.152,192.168.83.153)
- zookeeper镜像:wurstmeister/zookeeper:latest --20171012 latest标签版本是3.4.9
- kafka镜像:wurstmeister/kafka:0.10.1.1 --20171012 dockerfile中scala版本是2.11,kafka版本是0.10.1.1
- kafka-manager镜像:sheepkiller/kafka-manager:latest
环境搭建的整体思路:
在宿主机上创建kafka_cluster目录,其下分别创建kafka和zookeeper两个目录;然后在这两个目录下分别创建配置目录,数据目录,和日志目录。配置文件提前按照组网配置完成。
docker启动时将配置目录,数据目录,日志目录映射到刚才在宿主机上创建的目录,完成容器启动。
zookeeper部署
zookeeper配置文件(zoo.cfg)的关键配置
zookeeper镜像中设定会将zookeeper的data与dataLog分别映射到/data, /datalog 本质上,这个配置文件是为zookeeper的容器所用,容器中路径的配置与容器所在的宿主机上的路径是有区别的,要区分清楚。
server.x,数字x对应到data/myid文件中的值。三台机器x的值分别就是1,2,3。
关键目录存储结构
1./kafka_cluster/zookeeper/conf
2./kafka_cluster/zookeeper/data
3./kafka_cluster/zookeeper/datalog
启动zookeeper容器(三台机器均执行)
docker run -tid --name=zookeeper --restart=always --net=host --privileged=true -v /kafka_cluster/zookeeper/conf:/opt/zookeeper-3.4.9/conf -v /kafka_cluster/zookeeper/data:/data -v /kafka_cluster/zookeeper/datalog:/datalog docker.io/wurstmeister/zookeeper:latest
1.--net=host: 容器与主机共享同一Network Namespace,即容器与网络看到的是相同的网络视图
(host模式存在一定的风险,对安全要求很高的生产环境最好不要用host模式,应考虑除此之外的其他几种模式)
2.-v: 指定主机到容器的目录映射关系
这样就以容器的方式启动了zookeeper的服务,可以通过 "docker exec -it zookeeper bash" 命令进入容器中进行一些操作,
例如查看服务启动是否正常。也可以通过查看2181端口是否被监听判断zookeeper的服务是否运行。
3.zookeeper是否为集群可以通过./zkServer.sh status 命令查看,具体参见本文最后记录的”问题2“
kafka部署
kafka配置文件(server.properties)的关键配置
关键目录存储结构
1./kafka_cluster/kafka/config
2./kafka_cluster/kafka/data
3./kafka_cluster/kafka/logs
启动kafka容器(三台机器分别执行)
docker run -itd --name=kafka --restart=always --net=host --privileged=true -v /etc/hosts:/etc/hosts -v /kafka_cluster/kafka/data:/kafka/kafka-logs-localhost.localdomain -v /kafka_cluster/kafka/logs:/opt/kafka/logs -e KAFKA_ADVERTISED_HOST_NAME=192.168.83.151 -e JMX_PORT=9999 -e HOST_IP=127.0.0.1 -e KAFKA_ADVERTISED_PORT=9092 -e KAFKA_ZOOKEEPER_CONNECT=192.168.83.151:2181,192.168.83.152:2181,192.168.83.153:2181 -e KAFKA_BROKER_ID=0 -e KAFKA_HEAP_OPTS="-Xmx512M -Xms512M" wurstmeister/kafka:0.10.1.1docker run -itd --name=kafka --restart=always --net=host --privileged=true -v /etc/hosts:/etc/hosts -v /kafka_cluster/kafka/data:/kafka/kafka-logs-localhost.localdomain -v /kafka_cluster/kafka/logs:/opt/kafka/logs -e KAFKA_ADVERTISED_HOST_NAME=192.168.83.152 -e JMX_PORT=9999 -e HOST_IP=127.0.0.1 -e KAFKA_ADVERTISED_PORT=9092 -e KAFKA_ZOOKEEPER_CONNECT=192.168.83.151:2181,192.168.83.152:2181,192.168.83.153:2181 -e KAFKA_BROKER_ID=1 -e KAFKA_HEAP_OPTS="-Xmx512M -Xms512M" wurstmeister/kafka:0.10.1.1docker run -itd --name=kafka --restart=always --net=host --privileged=true -v /etc/hosts:/etc/hosts -v /kafka_cluster/kafka/data:/kafka/kafka-logs-localhost.localdomain -v /kafka_cluster/kafka/logs:/opt/kafka/logs -e KAFKA_ADVERTISED_HOST_NAME=192.168.83.153 -e JMX_PORT=9999 -e HOST_IP=127.0.0.1 -e KAFKA_ADVERTISED_PORT=9092 -e KAFKA_ZOOKEEPER_CONNECT=192.168.83.151:2181,192.168.83.152:2181,192.168.83.153:2181 -e KAFKA_BROKER_ID=2 -e KAFKA_HEAP_OPTS="-Xmx512M -Xms512M" wurstmeister/kafka:0.10.1.1
1.通过-e 指定的环境变量与在server.properties中配置的选项其效果是一样的
2.配置文件中的选项若要通过环境变量来指定,方式为:如broker.id对应KAFKA_BROKER_ID,类似的log.dirs对应KAFKA_LOG_DIRS
3.KAFKA_HEAP_OPTS="-Xmx512M -Xms512M"指java堆内存大小的设置,此数值要结合机器的内存大小给出。官方的配置使6G。
4.启动成功后,可以通过"docker logs kafka"命令查看日志
注:wurstmeister/kafka:0.10.1.1镜像中kafka的安装目录为/opt/kafka/config,知道这个,上面docker运行命令中的-v的一些映射就好理解了。
部署监控工具kafka-manager
启动kafka-manager容器
docker run -itd --restart=always --net host --name=kafka-manager -p 9000:9000 -e ZK_HOSTS="192.168.83.151:2181,192.168.83.152:2181,192.168.83.153:2181" sheepkiller/kafka-manager:latest
1.ZK_HOSTS:ZooKeeper访问地址(需指定机器的ip,localhost:2181或127.0.0.1:2181均会报 "java.net.ConnectException: Connection refused" 异常)
访问192.168.83.153:9000地址
遇到问题
1、Docker挂载主机目录Docker访问出现Permission denied的解决办法
原因是CentOS7中的安全模块selinux把权限禁掉了,至少有以下三种方式解决挂载的目录没有权限的问题:
1)在运行容器的时候,给容器加特权,及加上 --privileged=true 参数: docker run -i -t -v /soft:/soft --privileged=true 686672a1d0cc /bin/bash
2)临时关闭selinux: setenforce 0
3)添加selinux规则,改变要挂载的目录的安全性文本
2、kafka-manager上看到的broker只有1个,为什么不是3个?
zk怎么看是否是集群?
在项目实施中经常需要用用zookeeeper集群环境,当需要定位zookeeper集群是否稳定的时候,会需要判断集群中leader是否进行改变,这时候就需要命令来查看
命令:zookeeper-3.4.6/bin$ ./zkServer.sh status
如 Mode: leader Mode: follower
Mode: standalone 则表示单机
kafka怎么看是否是集群?
之前的zk是单机(因为zk的conf目录映射错误,导致zk用的配置文件不是期望的文件,从而本来想搭建集群结果搭建了三个单机),所以看到的broker只有1个。zk变为集群后,broker数目变为3。
另外,由下面两张图可以看出zk集群时,配置任一台zk看到的都是整个集群的信息。
再如查看topic时,用任一台zk都可以
参考: