博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【KAFKA】通过docker部署kafka集群
阅读量:6479 次
发布时间:2019-06-23

本文共 4561 字,大约阅读时间需要 15 分钟。

  hot3.png

前言

文章主要介绍以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都可以

 

参考:

转载于:https://my.oschina.net/zjg23/blog/1551673

你可能感兴趣的文章
中台之上(十四):尝试构建轻量级架构设计工具
查看>>
苹果Q1财报出炉:手机收入下滑15%,服务收入增长19%
查看>>
一文看懂.NET的各种变体
查看>>
HAProxy 1.9发布,支持端到端 HTTP/2,改进缓冲区和连接管理
查看>>
与专门团队一起持续交付
查看>>
C# 8的新提案:new关键字类型推断
查看>>
通过Jinq简化数据库查询
查看>>
Windows 10 超过Windows 7成为最受欢迎的操作系统
查看>>
本地vs云:大数据厮杀的最终幸存者会是谁?
查看>>
已经到来的革命
查看>>
机器人操作系统来到Windows
查看>>
绩效考核如何跟工资、等级挂钩?
查看>>
Eclipse更新了Eclipse公共许可(EPL)
查看>>
关于Visual Studio 2019的前期详情
查看>>
知道大数据却不清楚工业大数据,知识架构“欠”在哪里?
查看>>
“LinkedOut” 失败注入测试框架
查看>>
甲骨文解散Java Mission Control团队事件新进展
查看>>
前端阅读笔记 2016-11-25
查看>>
几种有效的清除浮动的方法
查看>>
ViewPager的自动轮播
查看>>