【KAFKA】通过docker部署kafka集群


声明:本文转载自https://my.oschina.net/zjg23/blog/1551673,转载目的在于传递更多信息,仅供学习交流之用。如有侵权行为,请联系我,我会及时删除。

前言

文章主要介绍以docker容器的方式部署kafka集群。 很多内容参考(chao xi)了http://www.jianshu.com/p/d77149efa59f的博文,同时把自己搭建过程中遇到的问题及觉得需要重点关注的地方做了说明补充。

环境说明

  • 三台虚拟机: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)的关键配置

image

zookeeper镜像中设定会将zookeeper的data与dataLog分别映射到/data, /datalog 本质上,这个配置文件是为zookeeper的容器所用,容器中路径的配置与容器所在的宿主机上的路径是有区别的,要区分清楚。
image
server.x,数字x对应到data/myid文件中的值。三台机器x的值分别就是1,2,3。

关键目录存储结构

1./kafka_cluster/zookeeper/conf

2./kafka_cluster/zookeeper/data

3./kafka_cluster/zookeeper/datalog

image

启动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)的关键配置

image

关键目录存储结构

1./kafka_cluster/kafka/config

2./kafka_cluster/kafka/data

3./kafka_cluster/kafka/logs

image

启动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.1  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.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.1  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.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地址

image

遇到问题

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规则,改变要挂载的目录的安全性文本

http://blog.csdn.net/rznice/article/details/52170085

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看到的都是整个集群的信息。

imageimage

再如查看topic时,用任一台zk都可以

image

 

参考:http://www.jianshu.com/p/d77149efa59f

本文发表于2017年10月17日 16:34
(c)注:本文转载自https://my.oschina.net/zjg23/blog/1551673,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除.

阅读 2934 讨论 0 喜欢 0

抢先体验

扫码体验
趣味小程序
文字表情生成器

闪念胶囊

你要过得好哇,这样我才能恨你啊,你要是过得不好,我都不知道该恨你还是拥抱你啊。

直抵黄龙府,与诸君痛饮尔。

那时陪伴我的人啊,你们如今在何方。

不出意外的话,我们再也不会见了,祝你前程似锦。

这世界真好,吃野东西也要留出这条命来看看

快捷链接
网站地图
提交友链
Copyright © 2016 - 2021 Cion.
All Rights Reserved.
京ICP备2021004668号-1