当前位置:   article > 正文

【Kafka】docker部署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部署环境目录(三台服务器相同)
  1. sudo mkdir /data/kafka_cluster
  2. cd /data/kafka_cluster
  3. sudo mkdir -p zookeeper/config
  4. sudo mkdir -p zookeeper/data

cef96ac31034437c81db535e36fdff2b.png


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

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

  •  启动Zookeeper服务(三台服务器容器命名可以相同)
  1. # 节点1服务器:131
  2. 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
  3. # 节点2服务器:132
  4. 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
  5. # 节点3服务器:133
  6. 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服务(三台服务器不同)
  1. # 该处的启动方式加入了部分环境变量,等同于修改配置文件,更加方便
  2. zookeepers_con="192.168.**.131:2181,192.168.**.132:2181,192.168.**.133:2181"
  3. # 节点1服务器:131
  4. sudo docker run -p 9092:9092 --name kafka-1 -itd \
  5. -e KAFKA_BROKER_ID=1 -e KAFKA_ZOOKEEPER_CONNECT=${zookeepers_con} \
  6. -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.**.131:9092 \
  7. -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 -v /data/kafka/log:/kafka wurstmeister/kafka
  8. # 节点2服务器:132
  9. sudo docker run -p 9092:9092 --name kafka-2 -itd \
  10. -e KAFKA_BROKER_ID=2 -e KAFKA_ZOOKEEPER_CONNECT=${zookeepers_con} \
  11. -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.**.132:9092 \
  12. -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 -v /data/kafka/log:/kafka wurstmeister/kafka
  13. # 节点3服务器:133
  14. sudo docker run -p 9092:9092 --name kafka-3 -itd \
  15. -e KAFKA_BROKER_ID=3 -e KAFKA_ZOOKEEPER_CONNECT=${zookeepers_con} \
  16. -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.**.133:9092 \
  17. -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 -v /data/kafka/log:/kafka wurstmeister/kafka

  •  启动Kafka-manager服务(为了便于可视化管理,可只在主节点)
  1. sudo docker run -p 9000:9000 --name kafka-manager -itd \
  2. -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

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/575499
推荐阅读
相关标签
  

闽ICP备14008679号