【Kafka】docker部署Kafka集群

目录

Kafka概述

Kafka集群docker部署流程

简述

环境准备

部署流程

 参考文献


 

Kafka概述

        以下概述Kafka内的几个核心概念,可参考官方文档,有兴趣可读:kafka.apache.org

Topic与日志

        Topic 就是数据主题,是数据记录发布的地方,可以用来区分业务系统。Kafka 中的 Topics 总是多订阅者模式,一个topic可以拥有一个或者多个消费者来订阅它的数据。对于每一个topic, Kafka 集群都会维持一个分区日志,如下所示:

4aab2ec8afeccaffda38b4e85cae839c.png

        每个分区都是有序且顺序不可变的记录集,并且不断地追加到结构化的commit log文件。分区中的每一个记录都会分配一个id号来表示顺序,我们称之为offset,offset用来唯一的标识分区中每一条记录。

        Kafka 集群保留所有发布的记录—无论他们是否已被消费—并通过一个可配置的参数——保留期限来控制。Kafka的性能和数据大小无关,因此能够长时间存储数据。

        在每一个消费者中唯一保存的元数据是offset(偏移量)即消费在log中的位置。偏移量由消费者所控制:通常在读取记录后,消费者会以线性的方式增加偏移量,但实际上,由于这个位置由消费者控制,所以消费者可以采用任何顺序来消费记录。例如,一个消费者可以重置到一个旧的偏移量,从而重新处理过去的数据;也可以跳过最近的记录,从"现在"开始消费。

生产者

        生产者可以将数据发布到所选择的topic(主题)中。生产者负责将记录分配到topic的哪一个 partition(分区)中。可以使用循环的方式来简单地实现负载均衡,也可以根据某些语义分区函数(例如:记录中的key)来完成。

消费者

        消费者使用一个 消费组 名称来进行标识,发布到topic中的每条记录被分配给订阅消费组中的一个消费者实例.消费者实例可以分布在多个进程中或者多个机器上。如果所有的消费者实例在同一消费组中,消息记录会负载平衡到每一个消费者实例。如果所有的消费者实例在不同的消费组中,每条消息记录会广播到所有的消费者进程。

0e20d23a63308f134937f51c7e753a8e.png

        如图,这个 Kafka 集群有两台 server 的,四个分区(p0-p3)和两个消费者组。消费组A有两个消费者,消费组B有四个消费者。通常情况下,每个 topic 都会有一些消费组,一个消费组对应一个"逻辑订阅者"。一个消费组由许多消费者实例组成,便于扩展和容错。这就是发布和订阅的概念,只不过订阅者是一组消费者而不是单个的进程。

        在Kafka中实现消费的方式是将日志中的分区划分到每一个消费者实例上,以便在任何时间,每个实例都是分区唯一的消费者。维护消费组中的消费关系由Kafka协议动态处理。如果新的实例加入组,他们将从组中其他成员处接管一些 partition 分区;如果一个实例消失,拥有的分区将被分发到剩余的实例。

        Kafka 只保证分区内的记录是有序的,而不保证主题中不同分区的顺序。每个 partition 分区按照key值排序足以满足大多数应用程序的需求。但如果你需要总记录在所有记录的上面,可使用仅有一个分区的主题来实现,这意味着每个消费者组只有一个消费者进程。

分布式

        日志的分区partition (分布)在Kafka集群的服务器上。每个服务器在处理数据和请求时,共享这些分区。每一个分区都会在已配置的服务器上进行备份,确保容错性。每个分区都有一台 server 作为 “leader”,零台或者多台server作为 follwers 。leader server 处理一切对 partition (分区)的读写请求,而follwers只需被动的同步leader上的数据。当leader宕机了,followers 中的一台服务器会自动成为新的 leader。每台 server 都会成为某些分区的 leader 和某些分区的 follower,因此集群的负载是平衡的。

以上内容摘自:www.wenjiangs.com/doc/kafka-intro

 

Kafka集群docker部署流程

简述

        本文部署kafka集群至3个服务器节点。

环境准备

  • 硬件环境
服务器(或虚拟机)角色
192.168.**.131

zookeeper节点1、kafka节点1

192.168.**.132

zookeeper节点2、kafka节点2

192.168.**.133

zookeeper节点3、kafka节点3

  • 软件环境
软件角色
docker

环境部署(提前Pull镜像)

sudo docker pull zookeeper

sudo docker pull wurstmeister/kafka

sudo docker pull sheepkiller/kafka-manager

部署流程


  • 创建Zookeeper部署环境目录(三台服务器相同)
sudo mkdir /data/kafka_cluster
cd /data/kafka_cluster
sudo mkdir -p zookeeper/config
sudo mkdir -p zookeeper/data

cef96ac31034437c81db535e36fdff2b.png


  •  创建Zookeeper配置文件(三台服务器相同)
sudo vim zookeeper/config/zoo.cfg
# 粘贴下方代码保存退出
clientPort=2181
dataDir=/data
dataLogDir=/data/log
tickTime=2000
initLimit=5
syncLimit=2
autopurge.snapRetainCount=3
autopurge.purgeInterval=0
maxClientCnxns=60
4lw.commands.whitelist=*
server.1=192.168.**.131:2888:3888
server.2=192.168.**.132:2888:3888
server.3=192.168.**.133:2888:3888

  •  配置Zookeeper节点ID(三台服务器myid不同)
sudo vim zookeeper/data/myid
# 分别向131,132,133节点写入1,2,3保存退出

  •  启动Zookeeper服务(三台服务器容器命名可以相同)
# 节点1服务器:131
sudo docker run --network host -v /data/kafka_cluster/zookeeper/data:/data -v /data/kafka_cluster/zookeeper/conf/zoo.cfg:/conf/zoo.cfg --name zookeeper-1 -itd zookeeper
# 节点2服务器:132
sudo docker run --network host -v /data/kafka_cluster/zookeeper/data:/data -v /data/kafka_cluster/zookeeper/conf/zoo.cfg:/conf/zoo.cfg --name zookeeper-2 -itd zookeeper
# 节点3服务器:133
sudo docker run --network host -v /data/kafka_cluster/zookeeper/data:/data -v /data/kafka_cluster/zookeeper/conf/zoo.cfg:/conf/zoo.cfg --name zookeeper-3 -itd zookeeper

  • 创建kafka-server部署环境目录(三台服务器相同)
sudo mkdir -p kafka/log

  •  启动Kafka服务(三台服务器不同)
# 该处的启动方式加入了部分环境变量,等同于修改配置文件,更加方便
zookeepers_con="192.168.**.131:2181,192.168.**.132:2181,192.168.**.133:2181"
# 节点1服务器:131
sudo docker run -p 9092:9092 --name kafka-1 -itd \
-e KAFKA_BROKER_ID=1 -e KAFKA_ZOOKEEPER_CONNECT=${zookeepers_con} \
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.**.131:9092 \
-e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 -v /data/kafka/log:/kafka wurstmeister/kafka
# 节点2服务器:132
sudo docker run -p 9092:9092 --name kafka-2 -itd \
-e KAFKA_BROKER_ID=2 -e KAFKA_ZOOKEEPER_CONNECT=${zookeepers_con} \
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.**.132:9092 \
-e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 -v /data/kafka/log:/kafka wurstmeister/kafka
# 节点3服务器:133
sudo docker run -p 9092:9092 --name kafka-3 -itd \
-e KAFKA_BROKER_ID=3 -e KAFKA_ZOOKEEPER_CONNECT=${zookeepers_con} \
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.**.133:9092 \
-e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 -v /data/kafka/log:/kafka wurstmeister/kafka

  •  启动Kafka-manager服务(为了便于可视化管理,可只在主节点)
sudo docker run -p 9000:9000 --name kafka-manager -itd \
-e ZK_HOSTS=${zookeepers_con} sheepkiller/kafka-manager

  • 环境验证

        网页端打开主节点的9000端口,如下图所示进行集群的添加,其他设置可暂时不设置; 

8990f5a137fc4ec987b7665b3b89c42e.png

         选择创建的集群test-cluster,查看集群信息;

16c4e104cc0a4e0daffc9faee6004092.png

b90878886aeb49b6a76b91284184f37a.png

 


  • 消息测试

        在主节点创建消息主题test-topic:

64b07b4a9aa94bbe8365d6ada90113db.png

         在网页管理端查看集群topic概况已能够查询到消息主题test-topic:

16fc59f93f5d4b8c9353766040af01e1.png

         创建生产者并发布消息: 

8e3eda0bb7454b0a80ba3713f7ebfe8a.png

         创建消费者并订阅消息,消息消费显示正常:  

3c43c61fc1084a07adf9f899448de101.png

 参考文献

  • http://www.jianshu.com/p/1dc1d3d59500
  • http://www.jianshu.com/p/a297e8aefe7c

 

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
### 回答1: 当Docker启动Kafka后自动退出的问题通常有以下几种可能原因: 1. 端口冲突:如果在启动Docker容器时,Kafka所使用的端口已被其他进程占用,Docker会自动退出。可以通过查看Docker容器日志或检查宿主机上的端口占用情况来确定是否存在端口冲突问题。 2. 资源限制:Kafka是一个较为资源密集型的应用,如果Docker容器所配置的资源(如内存和CPU等)不足以支持Kafka的运行,Docker会因资源限制而退出。可以尝试增加Docker容器的资源限制,并重新启动容器。 3. 配置错误:Kafka的配置文件可能存在错误导致启动失败。可以检查Kafka的配置文件,查看是否有错误的配置项或配置项值是否合法。可以通过尝试使用默认配置文件或重新编写配置文件来解决配置错误导致的启动问题。 4. 日志输出:启动Kafka时,Docker可能会将Kafka的日志输出到标准输出,而不是保存到文件中。如果未设置适当的配置或重定向日志输出,Docker会在Kafka启动后立即退出。可以通过查看Docker容器日志输出来确认是否存在此问题。 综上所述,当Docker启动Kafka后自动退出时,需要注意检查端口冲突、资源限制、配置错误和日志输出等问题,以确定具体原因并采取相应的解决方案。 ### 回答2: Docker 是一种轻量级的容器化平台,Kafka 是一个分布式流处理平台,可以处理大规模的实时数据流。在使用 Docker 启动 Kafka 过程中,可能会遇到一些问题导致自动退出的情况。下面是一些可能导致 Docker 启动 Kafka 自动退出的原因以及对应的解决方法: 1. 端口冲突:Kafka 默认使用 9092 端口进行通信,如果这个端口被其他进程占用,可能会导致 Docker 容器无法启动。解决方法是通过修改 Docker 容器中 Kafka 的监听端口,可以用其他未被占用的端口替代。 2. 配置错误:Kafka 的配置文件可能存在错误,导致无法正常启动。解决方法是检查配置文件中的参数是否正确,并确保配置文件的格式没有问题。 3. 内存不足:Kafka 需要较大的内存空间来保存数据和处理消息,如果 Docker 容器分配的内存不足,可能会导致启动失败。解决方法是增加 Docker 容器的内存分配,确保足够的内存供 Kafka 使用。 4. 硬盘空间不足:Kafka 在运行过程中会生成大量的日志文件和数据文件,如果 Docker 容器的硬盘空间不足,可能会导致无法启动。解决方法是释放一些硬盘空间,或者扩容 Docker 容器的硬盘大小。 5. 镜像问题:Docker 容器启动 Kafka 时使用的镜像可能存在问题,如版本不适配或者镜像本身存在 bug,可以尝试使用其他版本的镜像或者下载更新的镜像。 6. 其他错误:还有一些其他的错误可能导致 Docker 容器无法启动 Kafka,如网络连接问题、权限问题等。解决方法是逐一排查错误,并根据具体情况进行相应的修复。 总结来说,导致 Docker 启动 Kafka 自动退出的原因可能有很多,解决的方法也因具体原因而异。在解决问题时,需要仔细分析错误日志,逐步排查原因,并尝试不同的解决方法,直到成功启动 Kafka

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Felier.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值