用 docker 部署kafka

这篇具有很好参考价值的文章主要介绍了用 docker 部署kafka。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 参考链接

  1. Docker快速搭建Kafka 1.x集群
  2. Kafka Docker - Run multiple Kafka brokers in Docker
  3. Running a Multi-Broker Apache Kafka 0.8 Cluster on a Single Node
  4. Using Vagrant to get up and running with Apache Kafka
  5. kafka listeners 和 advertised.listeners 的区别及应用
  6. kafka配置KAFKA_LISTENERS和KAFKA_ADVERTISED_LISTENERS

2. 摘抄引用

2.1 Docker镜像选型

Kafka是没有官方Docker镜像的,所以要么自己写一个Dockerfile,要么用第三方已经构建好的。

自己写一个Dockerfile不是不可以,但不符合我要“最快”的目标,所以用第三方已经构建好的镜像那是最快的。

由于是第三方镜像,希望已经用过的人越多越好,这样坑相对会比较少一些。

带着上面的要求,开始寻找合适的第三方镜像,比较出名的有以下几个:

  1. wurstmeister/kafka特点:star数最多,版本更新到 Kafka 1.0,zookeeper与kafka分开于不同镜像。
  2. spotify/kafka特点:star数较多,有很多文章或教程推荐,zookeeper与kafka置于同一镜像中;但kafka版本较老(还停留在0.10.1.0)。
  3. confluent/kafka背景:Confluent是书中提到的哪位开发Kafka的Jay Kreps从LinkedLn离职后创立的新公司,Confluent Platform是一个流数据平台,围绕Kafka打造了一系列的产品。特点:大咖操刀,文档详尽,但是也和Confluent Platform进行了捆绑。

上述三个项目中,最终选定使用wurstmeister/kafka,star最多,版本一直保持更新,用起来应该比较放心。

2.2 wurstmeister/kafka镜像简介的先决条件

  • 安装docker-compose
  • docker-compose.yml配置文件中修改KAFKA_ADVERTISED_HOST_NAME去匹配你的docker主机IP(注意:如果你想要运行多broker集群,不要使用localhost127.0.0.1作为主机ip)
  • 如果你想要添加自定义的Kafka参数,只需要将它们添加到docker-compose.yml。例如:
    • 增加message.max.bytes参数,添加KAFKA_MESSAGE_MAX_BYTES: 2000000environment部分。
    • 关闭自动主题创建集,配置KAFKA_AUTO_CREATE_TOPICS_ENABLE: 'false'
  • Kafka可以通过添加环境变量前缀LOG4J_来自定义log4j用法。这些环境变量会映射到log4j.properties。例如:LOG4J_LOGGER_KAFKA-AUTHORIZER_LOGGER=DEBUG,authorizerAppender

**注意:**配置网络有几个“问题”。如果你不知道的要求是什么,请查看连接指南

2.3 简单使用

启动集群:

  • docker-compose up -d

添加更多brokers

  • docker-compose scale kafka=3

销毁一个集群

  • docker-compose stop

3. 安装过程

3.1 安装Docker(略)

3.2 安装Docker Compose(略)

3.3 从github拉取最新打包资源

# 克隆docker制作脚本
git clone https://github.com/wurstmeister/kafka-docker.git

# 进入目录查看目录文件
cd kafka-docker

# 查看所有标签,找到最新版本
git tag

# 切换到最新版本
git checkout <last_tag_name>

kafka-docker仓库目录文件展示:

[root@jiewli kafka-docker]# ll
总用量 72
-rwxr-xr-x. 1 root root   210 7月   7 17:18 broker-list.sh
-rw-r--r--. 1 root root   969 7月   7 17:18 CHANGELOG.md
-rwxr-xr-x. 1 root root  1221 7月   7 17:18 create-topics.sh
-rw-r--r--. 1 root root   367 7月   7 17:08 docker-compose-single-broker.yml
-rw-r--r--. 1 root root   705 7月   7 17:08 docker-compose-swarm.yml
-rw-r--r--. 1 root root   324 7月   7 17:18 docker-compose.yml
-rw-r--r--. 1 root root  1132 7月   7 17:18 Dockerfile
-rwxr-xr-x. 1 root root   395 7月   7 17:18 download-kafka.sh
-rw-r--r--. 1 root root 11325 7月   7 17:08 LICENSE
-rw-r--r--. 1 root root  9887 7月   7 17:18 README.md
-rwxr-xr-x. 1 root root  4591 7月   7 17:18 start-kafka.sh
-rwxr-xr-x. 1 root root   131 7月   7 17:08 start-kafka-shell.sh
drwxr-xr-x. 2 root root  4096 7月   7 17:18 test

3.4 更新docker-compose.yml中你docker主机ip

通过命令vim docker-compose.yml查看仓库目录中的docker-compose.yml配置文件。

version: '2'
services:
  zookeeper:
    image: wurstmeister/zookeeper
    ports:
      - "2181:2181"
  kafka:
    build: .
    ports:
      - "9092"
    environment:
      DOCKER_API_VERSION: 1.22
      KAFKA_ADVERTISED_HOST_NAME: 192.168.99.100
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

重要:
kafka 0.9.x以后的版本新增了advertised.listeners配置
kafka 0.9.x以后的版本不要使用 advertised.host.nameadvertised.host.port 已经 deprecated
host.nameport 为 deprecated,使用 listeners 代替

所以,KAFKA_ADVERTISED_HOST_NAME配置也要改成 KAFKA_ADVERTISED_LISTENERS, 而后者要求必须配置 KAFKA_LISTENERS,不然会抛异常:

ERROR: Missing environment variable KAFKA_LISTENERS. Must be specified when using KAFKA_ADVERTISED_LISTENERS

version: '2'
services:
  zookeeper:
    image: wurstmeister/zookeeper
    ports:
      - "2181:2181"
  kafka:
    build: .
    ports:
      - "9092"
    environment:
      DOCKER_API_VERSION: 1.22
      KAFKA_LISTENERS: PLAINTEXT://:9092
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://192.168.99.100:9094
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

将上面KAFKA_ADVERTISED_HOST_NAME改为你的docker主机ip。

如果你想要添加自定义的Kafka参数,只需要将它们添加到docker-compose.yml。例如:

  • 增加message.max.bytes参数,添加KAFKA_MESSAGE_MAX_BYTES: 2000000environment部分。
  • 关闭自动主题创建集,配置KAFKA_AUTO_CREATE_TOPICS_ENABLE: 'false'

启动失败:

[root@jiewli kafka-docker]# docker logs -f --tail=300 kafka-docker_kafka_1
ERROR: Missing environment variable KAFKA_LISTENERS. Must be specified when using KAFKA_ADVERTISED_LISTENERS
ERROR: Missing environment variable KAFKA_LISTENERS. Must be specified when using KAFKA_ADVERTISED_LISTENERS
ERROR: Missing environment variable KAFKA_LISTENERS. Must be specified when using KAFKA_ADVERTISED_LISTENERS
ERROR: Missing environment variable KAFKA_LISTENERS. Must be specified when using KAFKA_ADVERTISED_LISTENERS
ERROR: Missing environment variable KAFKA_LISTENERS. Must be specified when using KAFKA_ADVERTISED_LISTENERS
ERROR: Missing environment variable KAFKA_LISTENERS. Must be specified when using KAFKA_ADVERTISED_LISTENERS
ERROR: Missing environment variable KAFKA_LISTENERS. Must be specified when using KAFKA_ADVERTISED_LISTENERS
ERROR: Missing environment variable KAFKA_LISTENERS. Must be specified when using KAFKA_ADVERTISED_LISTENERS
ERROR: Missing environment variable KAFKA_LISTENERS. Must be specified when using KAFKA_ADVERTISED_LISTENERS

3.5 启动集群

$ docker-compose up -d

例如,启动一个有两个broker的的集群

$ docker-compose scale kafka=2

这会启动一个单独的zookeeper实例,和两个Kafka实例。你可以使用docker-compose ps命令去显示正在运行的实例。
如果你想去添加更多的Kafka brokers,只需要通过命令docker-compose scale kafka=n增加值。

3.5.1 当执行docker-compose -f docker-compose.yml up -d命令遇到错误
wget: server returned error: HTTP/1.1 404 Not Found
The command '/bin/sh -c apk add --no-cache bash curl jq docker  && mkdir /opt  && chmod a+x /tmp/*.sh  && mv /tmp/start-kafka.sh /tmp/broker-list.sh /tmp/create-topics.sh /usr/bin  && sync && /tmp/download-kafka.sh  && tar xfz /tmp/kafka_${SCALA_VERSION}-${KAFKA_VERSION}.tgz -C /opt  && rm /tmp/kafka_${SCALA_VERSION}-${KAFKA_VERSION}.tgz  && ln -s /opt/kafka_${SCALA_VERSION}-${KAFKA_VERSION} /opt/kafka  && rm /tmp/*  && wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/${GLIBC_VERSION}/glibc-${GLIBC_VERSION}.apk  && apk add --no-cache --allow-untrusted glibc-${GLIBC_VERSION}.apk  && rm glibc-${GLIBC_VERSION}.apk' returned a non-zero code: 1
ERROR: Service 'kafka' failed to build

根据提示,是wget命令下载某个文件的时候遇到了404。

3.5.2 分析脚本执行过程

DockerfileRUN指令中可以找到:

docker kafka,Kafka,Linux,docker,kafka,docker,分布式

经过一番排查,最终定位到download-kafka.sh这个脚本中的wget命令,我增加一行echo命令,将整个wget命令打印出来看看:

# echo打印结果
wget -q "https://mirrors.tuna.tsinghua.edu.cn/apache/kafka/1.1.0/kafka_2.12-1.1.0.tgz" -O "/tmp/kafka_2.12-1.1.0.tgz"

根据链接查找这个文件,发现是在“清华大学开源软件镜像站”中下载的,但是1.1.0这个目录都没有了,取而代之的是2.x.x的目录了。

docker kafka,Kafka,Linux,docker,kafka,docker,分布式

下载不了,很明显这个版本太落后了。一看仓库git-tag的创建时间居然是2018年,已经三年多没有发布新的tag版本了。

3.5.3 使用master分支的构建脚本启动2.x.x版本的kafka

那么回到master分支看看,一看最新提交,2021年6月有提交过。仔细研究了一下master分支的脚本和Dockerfile,其实作者早已经将kafka版本调整到2.x.x,并且修改了下载地址。

那么切换到master分支后,重新使用命令$ docker-compose up -d启动kafka集群就可以了。

3.6 开启单个节点

docker-compose -f docker-compose-single-broker.yml up -d

开启容器如下所示:

[root@jiewli ~]# docker ps
CONTAINER ID   IMAGE                       COMMAND                  CREATED         STATUS       PORTS                                                NAMES
43fb3efd832f   kafka-docker_kafka          "start-kafka.sh"         24 hours ago    Up 4 hours   0.0.0.0:9092->9092/tcp                               kafka-docker_kafka_1
b8bc06090259   wurstmeister/zookeeper      "/bin/sh -c '/usr/sb…"   24 hours ago    Up 4 hours   22/tcp, 2888/tcp, 3888/tcp, 0.0.0.0:2181->2181/tcp   kafka-docker_zookeeper_1

4. Kafka Shell

进入docker容器交互命令行

docker exec -it kafka-docker_kafka_1 /bin/bash

查看 kafka 安装目录,找到脚本位置

bash-5.1# echo $KAFKA_HOME
/opt/kafka
bash-5.1# cd $KAFKA_HOME
bash-5.1# ls
LICENSE    NOTICE     bin        config     libs       licenses   logs       site-docs

默认情况下,kafka 安装目录是 /opt/kafka

你可以通过Kafka Shell与你的Kafka集群进行交互。

$ $KAFKA_HOME/bin/start-kafka-shell.sh <DOCKER_HOST_IP> <ZK_HOST:ZK_PORT>

5. 测试

测试你的安装步骤。

启动一个shell终端,创建一个topic和启动一个生产者。

$ $KAFKA_HOME/bin/kafka-topics.sh --create --topic topic \
--partitions 4 --zookeeper $ZK --replication-factor 2

$ $KAFKA_HOME/bin/kafka-topics.sh --describe --topic topic --zookeeper $ZK

$ $KAFKA_HOME/bin/kafka-console-producer.sh --topic=topic \
--broker-list=`broker-list.sh`

启动另一个shell终端,并启动一个消费者。

$ $KAFKA_HOME/bin/kafka-console-consumer.sh --topic=topic --zookeeper=$ZK

6. 在MAC电脑上运行Kafka-docker

安装Docker Toolbox,并将docker-machine ip命令返回的ip配置到KAFKA_ADVERTISED_HOST_NAME文章来源地址https://www.toymoban.com/news/detail-792337.html

7. 故障排除

  • 默认情况下,Kafka broker使用1GB内存,因此如果您在启动代理是遇到问题,请检查docker-compose logs/docker logs查找容器并确保主机上有足够的可用内存。
  • 如果要运行多个broker,请不要使用localhost127.0.0.1作为主机IP,否则broker将无法通信。

到了这里,关于用 docker 部署kafka的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【软件开发/设计】分布式架构中的组件(如Kafka、MongoDB和Nginx)如何进行容器化部署

    容器化部署是将应用程序及其依赖打包成一个容器镜像,然后在任何支持容器的环境中运行这个镜像的过程。在分布式架构中,像Nginx、MongoDB、Kafka这样的组件通过容器化可以更易于部署、扩展和管理。以下是这些组件容器化部署的一般步骤和原理: 容器化部署的一般步骤

    2024年02月04日
    浏览(47)
  • 【大数据工具】Kafka伪分布式、分布式安装和Kafka-manager工具安装与使用

    Kafka 安装包下载地址:https://archive.apache.org/dist/kafka/ 1. Kafka 伪分布式安装 1. 上传并解压 Kafka 安装包 使用 FileZilla 或其他文件传输工具上传 Kafka 安装包: kafka_2.11-0.10.0.0.tgz 解压安装包 2. 编辑配置文件 3. 拷贝并修改配置文件 分别修改 server2.properties、server3.properties 4. 创建日志

    2024年02月14日
    浏览(46)
  • 【分布式应用】kafka集群、Filebeat+Kafka+ELK搭建

    主要原因是由于在高并发环境下,同步请求来不及处理,请求往往会发生阻塞。比如大量的请求并发访问数据库,导致行锁表锁,最后请求线程会堆积过多,从而触发 too many connection 错误,引发雪崩效应。 我们使用消息队列,通过异步处理请求,从而缓解系统的压力。消息队

    2024年02月16日
    浏览(47)
  • 分布式 - 消息队列Kafka:Kafka 消费者的消费位移

    01. Kafka 分区位移 对于Kafka中的分区而言,它的每条消息都有唯一的offset,用来表示消息在分区中对应的位置。偏移量从0开始,每个新消息的偏移量比前一个消息的偏移量大1。 每条消息在分区中的位置信息由一个叫位移(Offset)的数据来表征。分区位移总是从 0 开始,假设一

    2024年02月12日
    浏览(46)
  • 分布式消息服务kafka

    什么是消息中间件? 消息中间件是分布式系统中重要的组件,本质就是一个具有接收消息、存储消息、分发消息的队列,应用程序通过读写队列消息来通信。 例如:在淘宝购物时,订单系统处理完订单后,把订单消息发送到消息中间件中,由消息中间件将订单消息分发到下

    2024年02月01日
    浏览(43)
  • 分布式 - 消息队列Kafka:Kafka生产者架构和配置参数

    生产者发送消息流程参考图1: 先从创建一个ProducerRecord对象开始,其中需要包含目标主题和要发送的内容。另外,还可以指定键、分区、时间戳或标头。在发送ProducerRecord对象时,生产者需要先把键和值对象序列化成字节数组,这样才能在网络上传输。 接下来,如果没有显式

    2024年02月13日
    浏览(45)
  • 分布式 - 消息队列Kafka:Kafka生产者发送消息的方式

    不管是把Kafka作为消息队列、消息总线还是数据存储平台,总是需要一个可以往Kafka写入数据的生产者、一个可以从Kafka读取数据的消费者,或者一个兼具两种角色的应用程序。 Kafka 生产者是指使用 Apache Kafka 消息系统的应用程序,它们负责将消息发送到 Kafka 集群中的一个或多

    2024年02月13日
    浏览(40)
  • 分布式 - 消息队列Kafka:Kafka消费者的分区分配策略

    Kafka 消费者负载均衡策略? Kafka 消费者分区分配策略? 1. 环境准备 创建主题 test 有5个分区,准备 3 个消费者并进行消费,观察消费分配情况。然后再停止其中一个消费者,再次观察消费分配情况。 ① 创建主题 test,该主题有5个分区,2个副本: ② 创建3个消费者CustomConsu

    2024年02月13日
    浏览(43)
  • 分布式 - 消息队列Kafka:Kafka生产者发送消息的分区策略

    01. Kafka 分区的作用 分区的作用就是提供负载均衡的能力,或者说对数据进行分区的主要原因,就是为了实现系统的高伸缩性。不同的分区能够被放置到不同节点的机器上,而数据的读写操作也都是针对分区这个粒度而进行的,这样每个节点的机器都能独立地执行各自分区的

    2024年02月13日
    浏览(51)
  • 分布式 - 消息队列Kafka:Kafka消费者分区再均衡(Rebalance)

    01. Kafka 消费者分区再均衡是什么? 消费者群组里的消费者共享主题分区的所有权。当一个新消费者加入群组时,它将开始读取一部分原本由其他消费者读取的消息。当一个消费者被关闭或发生崩溃时,它将离开群组,原本由它读取的分区将由群组里的其他消费者读取。 分区

    2024年02月12日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包