Docker搭建kafka集群

news2024/9/27 21:20:18

Docker搭建kafka集群

  • 集群规划
    • 镜像版本
    • kafka为什么需要依赖zookeeper
  • 创建docker网络
  • 搭建zk集群
    • 新建文件docker-compose-zk.yml
    • 启动
  • 搭建kafka集群
    • 新建docker-compose-kafka.yml
    • 启动集群
  • 安装kafka-manager
    • 新建 docker-compose-kafka-manager.yml
    • 启动kafka-manager
    • 配置cluster
  • 修改kafka-run-class.sh
    • 修改原因
    • 修改文件
  • 测试

集群规划

镜像版本

  • Zookeeper采用zookeeper

  • Kafka采用wurstmeister/kafka

  • Kafka-Manager采用scjtqs/kafka-manager

kafka为什么需要依赖zookeeper

ZooKeeper 作为给分布式系统提供协调服务的工具被 kafka 所依赖。在分布式系统中,消费者需要知道有哪些生产者是可用的,而如果每次消费者都需要和生产者建立连接并测试是否成功连接,那效率也太低了,显然是不可取的。而通过使用 ZooKeeper 协调服务,Kafka 就能将 Producer,Consumer,Broker 等结合在一起,同时借助 ZooKeeper,Kafka 就能够将所有组件在无状态的条件下建立起生产者和消费者的订阅关系,实现负载均衡
1.Brork管理

在Kafka的设计中,选择了使用Zookeeper来进行所有Broker的管理,体现在zookeeper上会有一个专门用来进行Broker服务器列表记录的点,节点路径为/brokers/ids

Zookeeper用一个专门节点保存Broker服务列表,也就是 /brokers/ids。

broker启动时,向Zookeeper发送注册请求,Zookeeper会在/brokers/ids下创建这个broker节点,如/brokers/ids/[0…N],并保存broker的IP地址和端口,Broker 创建的是临时节点,在连接断开时节点就会自动删除,所以在 ZooKeeper 上就可以通过 Broker 中节点的变化来得到 Broker 的可用性。

2、负载均衡

broker向Zookeeper进行注册后,生产者根据broker节点来感知broker服务列表变化,这样可以实现动态负载均衡。

3、Topic 信息

在 Kafka 中可以定义很多个 Topic,每个 Topic 又被分为很多个 Partition。一般情况下,每个 Partition 独立在存在一个 Broker 上,所有的这些 Topic 和 Broker 的对应关系都由 ZooKeeper 进行维护。

创建docker网络

docker network create kafaka-net --subnet 172.28.10.0/16

搭建zk集群

新建文件docker-compose-zk.yml

version: '3.4'

services:
 zook1:
   image: zookeeper:latest
   #restart: always #自动重新启动
   hostname: zook1
   container_name: zook1 #容器名称,方便在rancher中显示有意义的名称
   ports:
   - 39181:2181 #将本容器的zookeeper默认端口号映射出去
   volumes: # 挂载数据卷 前面是宿主机即本机的目录位置,后面是docker的目录
   - "/volumn/kafaka/zkcluster/zook1/data:/data"
   - "/volumn/kafaka/zkcluster/zook1/datalog:/datalog"
   - "/volumn/kafaka/zkcluster/zook1/logs:/logs"
   environment:
       ZOO_MY_ID: 1  #即是zookeeper的节点值,也是kafka的brokerid值
       ZOO_SERVERS: server.1=zook1:2888:3888;2181 server.2=zook2:2888:3888;2181 server.3=zook3:2888:3888;2181
   networks:
       docker-net:
           ipv4_address: 172.28.10.11

 zook2:   
   image: zookeeper:latest
   #restart: always #自动重新启动
   hostname: zook2
   container_name: zook2 #容器名称,方便在rancher中显示有意义的名称
   ports:
   - 39182:2181 #将本容器的zookeeper默认端口号映射出去
   volumes:
   - "/volumn/kafaka/zkcluster/zook2/data:/data"
   - "/volumn/kafaka/zkcluster/zook2/datalog:/datalog"
   - "/volumn/kafaka/zkcluster/zook2/logs:/logs"
   environment:
       ZOO_MY_ID: 2  #即是zookeeper的节点值,也是kafka的brokerid值
       ZOO_SERVERS: server.1=zook1:2888:3888;2181 server.2=zook2:2888:3888;2181 server.3=zook3:2888:3888;2181
   networks:
       docker-net:
           ipv4_address: 172.28.10.12
           
 zook3:   
   image: zookeeper:latest
   #restart: always #自动重新启动
   hostname: zook3
   container_name: zook3 #容器名称,方便在rancher中显示有意义的名称
   ports:
   - 39183:2181 #将本容器的zookeeper默认端口号映射出去
   volumes:
   - "/volumn/kafaka/zkcluster/zook3/data:/data"
   - "/volumn/kafaka/zkcluster/zook3/datalog:/datalog"
   - "/volumn/kafaka/zkcluster/zook3/logs:/logs"
   environment:
       ZOO_MY_ID: 3  #即是zookeeper的节点值,也是kafka的brokerid值
       ZOO_SERVERS: server.1=zook1:2888:3888;2181 server.2=zook2:2888:3888;2181 server.3=zook3:2888:3888;2181
   networks:
       docker-net:
           ipv4_address: 172.28.10.13
networks:
 docker-net:
     name: kafaka-net

启动

docker compose -p zookeeper -f ./docker-compose-zk.yml up -d

搭建kafka集群

新建docker-compose-kafka.yml

version: '2'

services:
 kafka1:
   image: docker.io/wurstmeister/kafka
   #restart: always #自动重新启动
   hostname: kafka1
   container_name: kafka1
   ports:
     - 39093:9093
     - 39193:9193
   environment:
     KAFKA_BROKER_ID: 1
     KAFKA_LISTENERS: INSIDE://:9093,OUTSIDE://:9193
     #KAFKA_ADVERTISED_LISTENERS=INSIDE://<container>:9092,OUTSIDE://<host>:9094
     SKAFKA_ADVERTISED_LISTENERS: INSIDE://kafka1:9093,OUTSIDE://localhost:9193
     KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT
     KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE
     KAFKA_ZOOKEEPER_CONNECT: zook1:2181,zook2:2181,zook3:2181
     ALLOW_PLAINTEXT_LISTENER : 'yes'
     JMX_PORT: 9999 #开放JMX监控端口,来监测集群数据
   volumes:
     - /volumn/kafaka/kafka1/wurstmeister/kafka:/wurstmeister/kafka
     - /volumn/kafaka/kafka1/kafka:/kafka
     #- /volumn/kafaka/kafka1/bin/kafka-run-class.sh:/opt/kafka_2.13-2.8.1/bin/kafka-run-class.sh
   external_links:
     - zook1
     - zook2
     - zook3
   networks:
     docker-net:
       ipv4_address: 172.28.10.14

 kafka2:
   image: docker.io/wurstmeister/kafka
   #restart: always #自动重新启动
   hostname: kafka2
   container_name: kafka2
   ports:
     - 39094:9094
     - 39194:9194
   environment:
     KAFKA_BROKER_ID: 2
     KAFKA_LISTENERS: INSIDE://:9094,OUTSIDE://:9194
     #KAFKA_ADVERTISED_LISTENERS=INSIDE://<container>:9092,OUTSIDE://<host>:9094
     KAFKA_ADVERTISED_LISTENERS: INSIDE://kafka2:9094,OUTSIDE://localhost:9194
     KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT
     KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE
     KAFKA_ZOOKEEPER_CONNECT: zook1:2181,zook2:2181,zook3:2181
     ALLOW_PLAINTEXT_LISTENER : 'yes'
     JMX_PORT: 9999 #开放JMX监控端口,来监测集群数据
   volumes:
     - /volumn/kafaka/kafka2/wurstmeister/kafka:/wurstmeister/kafka
     - /volumn/kafaka/kafka2/kafka:/kafka
    # - /volumn/kafaka/kafka2/bin/kafka-run-class.sh:/opt/kafka_2.13-2.8.1/bin/kafka-run-class.sh
   external_links:
     - zook1
     - zook2
     - zook3
   networks:
     docker-net:
       ipv4_address: 172.28.10.15

 kafka3:
   image: docker.io/wurstmeister/kafka
   #restart: always #自动重新启动
   hostname: kafka3
   container_name: kafka3
   ports:
     - 39095:9095
     - 39195:9195
   environment:
     KAFKA_BROKER_ID: 3
     KAFKA_LISTENERS: INSIDE://:9095,OUTSIDE://:9195
     #KAFKA_ADVERTISED_LISTENERS=INSIDE://<container>:9092,OUTSIDE://<host>:9094
     KAFKA_ADVERTISED_LISTENERS: INSIDE://kafka3:9095,OUTSIDE://localhost:9195
     KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT
     KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE
     KAFKA_ZOOKEEPER_CONNECT: zook1:2181,zook2:2181,zook3:2181
     ALLOW_PLAINTEXT_LISTENER : 'yes'
     JMX_PORT: 9999 #开放JMX监控端口,来监测集群数据
   volumes:
     - /volumn/kafaka/kafka3/wurstmeister/kafka:/wurstmeister/kafka
     - /volumn/kafaka/kafka3/kafka:/kafka
    # - /volumn/kafaka/kafka3/bin/kafka-run-class.sh:/opt/kafka_2.13-2.8.1/bin/kafka-run-class.sh
   external_links:
     - zook1
     - zook2
     - zook3
   networks:
     docker-net:
       ipv4_address: 172.28.10.16
networks:
 docker-net:
     name: kafaka-net

启动集群

docker compose -f ./docker-compose-kafka.yml up -d

安装kafka-manager

新建 docker-compose-kafka-manager.yml

version: '2'
services:
 kafka-manager:
   image: scjtqs/kafka-manager:latest
   restart: always
   hostname: kafka-manager
   container_name: kafka-manager
   ports:
     - 39196:9000
   external_links:  # 连接本compose文件以外的container
     - zook1
     - zook2
     - zook3
     - kafka1
     - kafka2
     - kafka3
   environment:
     ZK_HOSTS: zook1:2181,zook2:2181,zook3:2181
     KAFKA_BROKERS: kafka1:9093,kafka2:9094,kafka3:9095
     APPLICATION_SECRET: letmein
     KM_ARGS: -Djava.net.preferIPv4Stack=true
   networks:
     docker-net:
       ipv4_address: 172.28.10.20
networks:
 docker-net:
     name: kafaka-net

启动kafka-manager

docker compose -f ./docker-compose-kafka-manager.yml up -d

配置cluster

在这里插入图片描述

修改kafka-run-class.sh

修改原因

主要防止kafka-topics.sh命令创建主题时报错

Error: Exception thrown by the agent : java.rmi.server.ExportException: Port already in use: 9966; nested exception is:
        java.net.BindException: Address in use (Bind failed)

修改文件

kafka-run-class.sh在容器中/opt/kafka_2.13-2.6.0/bin/路径下

40   file=$1
 41   if [ -z "$(echo "$file" | egrep "$regex")" ] ; then
 42     return 0
 43   else
 44     return 1
 45   fi
 46 }
 ------加入以下4行配置------
 - 47 ISKAFKASERVER="false"
 - 48 if [[ "$*" =~ "kafka.Kafka" ]]; then
 - 49     ISKAFKASERVER="true"
 - 50 fi
 ------------以上-----------
 51 base_dir=$(dirname $0)/..
 52
 53 if [ -z "$SCALA_VERSION" ]; then
 54   SCALA_VERSION=2.13.2
 55   if [[ -f "$base_dir/gradle.properties" ]]; then
 56     SCALA_VERSION=`grep "^scalaVersion=" "$base_dir/gradle.properties" | cut -d= -f 2`
 57   fi
 58 fi
 ......
 187 # JMX settings
 188 if [ -z "$KAFKA_JMX_OPTS" ]; then
 189   KAFKA_JMX_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false  -    Dcom.sun.management.jmxremote.ssl=false "
 190 fi
 191
 192 # JMX port to use
 - 193 #if [  $JMX_PORT ]; then       #注释掉这一行
 - 194 if [  $JMX_PORT ] && [ -z "$ISKAFKASERVER" ]; then     #添加这一行新的配置进去
 195   KAFKA_JMX_OPTS="$KAFKA_JMX_OPTS -Dcom.sun.management.jmxremote.port=$JMX_PORT "
 196 fi
 197
 198 # Log directory to use
 199 if [ "x$LOG_DIR" = "x" ]; then
 200   LOG_DIR="$base_dir/logs"
 201 fi

测试

进入kafka

docker exec -ti kafka1 /bin/bash
cd opt/kafka_2.13-2.8.1/

创建topic

bin/kafka-topics.sh --create --zookeeper zook1:2181 --replication-factor 2 --partitions 2 --topic partopic

查看topic的状态

bin/kafka-topics.sh --describe --zookeeper zook1:2181 --topic partopic

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/170193.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Pandas 数据结构 - DataFrame

Pandas 数据结构 - DataFrameDataFrame 是一个表格型的数据结构&#xff0c;它含有一组有序的列&#xff0c;每列可以是不同的值类型&#xff08;数值、字符串、布尔型值&#xff09;。DataFrame 既有行索引也有列索引&#xff0c;它可以被看做由 Series 组成的字典&#xff08…

nexus3 搭建maven私服

首先下载nexus3安装包 这里使用linux版, 需要win或mac版请自行百度 链接&#xff1a;https://pan.baidu.com/s/11Z_884pt11l04460ldUyVA?pwdycuo 提取码&#xff1a;ycuo 上传linux服务器进行解压缩 解压缩后的文件目录 进入到 nexus的执行目录 /nexus-3.31.1-01/bin 运行…

Qt 6.x中的信号和槽介绍及示例

信号(signals)和槽(slots)用于对象之间的通信&#xff0c;Qt使用信号和槽完成了事件监听操作。信号和槽机制是Qt的核心特性&#xff0c;可能也是与其它框架提供的特性最大的不同之处。信号和槽是通过Qt的元对象系统(Meta-Object system)实现的&#xff0c;Qt的元对象系统使信号…

【寒假每日一题】DAY.10 杨辉直角(等腰)三角

目录 一、杨辉直角三角 思路 按部就班 代码实现 二、杨辉等腰三角 注&#xff1a;由于VS不支持变长数组&#xff0c;这里我就用n4来写 一、题目名称 题目内容&#xff1a; 输入一个数n&#xff0c;在屏幕上打印n行n列的杨辉三角。例如&#xff1a;输入&#xff1a;4输出&am…

CSRF与XSS组合拳

目录 先介绍下这两个漏洞&#xff1a; CSRF XSS 实验&#xff1a; 环境&#xff1a; CSRF与反射型xss的第一拳 CSRF与存储型XSS的第二拳&#xff1a; 先介绍下这两个漏洞&#xff1a; CSRF CSRF是跨站请求伪造攻击&#xff0c;由客户端发起,是由于没有在关键操作执行时进…

美团滑块(1-18,js逆向)

网址&#xff1a;aHR0cHM6Ly9wYXNzcG9ydC5tZWl0dWFuLmNvbS9hY2NvdW50L3VuaXRpdmVsb2dpbg整体流程&#xff1a; 1、获取主页参数 2、逆向pwd、h5Fingerprint 3、请求page_data链接 4、逆向Authencation、behavior、token_ 5、最终请求验证一、获取主页参数 url_ "https:/…

信息论复习—信息论的基本概念

信息的概念&#xff1a;古代的信息技术&#xff1a;现代的信息技术信息与消息的关系&#xff1a;消息&#xff1a;用文字、符号、数据、语言、音符、图片、图像等能够被人们感觉器官所感知的形式&#xff0c;把客观物质运动和主观思维活动的状态表达出来就称为消息。信息&#…

Flink 实时计算DIM层实现方案

1 概述 DIM层设计要点&#xff1a; &#xff08;1&#xff09;DIM层的设计依据是维度建模理论&#xff0c;该层存储维度模型的维度表。 &#xff08;2&#xff09;DIM层的数据存储在 HBase 表中DIM 层表是用于维度关联的&#xff0c;要通过主键去获取相关维度信息&#xff0c;…

html2canvas移动端使用问题及解决

1、jsbridge重复调用问题现象&#xff1a;与移动端进行通信&#xff0c;通过<script>标签里的jsbridge.js来调用端上的接口&#xff0c;在调用接口之后&#xff0c;调用html2canvas来生成图片&#xff0c;发现刚才调用的接口又被调用了一次解决方案&#xff1a;在html2ca…

比YOLOv8还要强的YOLOv6 v3.0

论文地址&#xff1a;https://arxiv.org/pdf/2301.05586.pdf 开源地址&#xff1a;https://github.com/meituan/YOLOv6 YOLOv6 v3.0的主要贡献简述如下&#xff1a; 对检测器的Neck部件进行了翻新&#xff0c;引入BiC(Bi-directional Concatenation)提供更精确的定位信息&…

好看的vscode深色主题,搜索主题名称即可设置

1.watermelon-theme 西瓜颜色的主题&#xff0c;满满的夏天感&#xff0c;红色交替的温柔。 2.Kawaine Theme 好看的粉色系主题&#xff0c; 3. Feminine Color Theme 很适合女孩子的一个主题&#xff0c;好看如其名。 4.pinkFlower-theme 这个真的超粉&#xff0c;很好看的…

Python采集常用:谷歌浏览器驱动——Chromedriver 插件安装教程

人生苦短 &#xff0c;我用Python 趁放假&#xff0c;偷偷卷起来&#xff01;&#xff01;&#xff01; 我们经常要使用谷歌浏览器驱动&#xff0c; 今天分享下这个Chromedriver 插件的安装方法。 一、打开谷歌浏览器打开设置面板 二、查看当前谷歌浏览器版本号 三、点击插件…

计算机取证科普性基础

内容为美亚柏科公开课笔记。 1 Windows系统与取证 1.1 存储介质取证概述 专业名词 未分配空间文件残留区 物理大小逻辑大小文件大小物理大小-逻辑大小 临时文件 C:\Windows\Temp*.tmpC:\Documents and Settings\Username\Local Setting\Temporary Internet FilesC:\Documen…

接口超时分析

原文&#xff1a;接口突然超时&#xff01;&#xff01;&#xff01; 1、网络异常 1.1、网络抖动 经常上网的我们&#xff0c;肯定遇到过这样的场景&#xff1a;大多数情况下我们访问某个网站很快&#xff0c;但偶尔会出现网页一直转圈&#xff0c;加载不出来的情况。 有可…

centos7 升级 gcc 版本

查看动态库版本 strings /usr/lib64/libstdc.so.6 | grep CXXABI查找gcc生成的最新动态库 find / -name "libstdc.so*"方法一&#xff1a; 1、查看当前gcc版本 #默认4.8.5 g -v 或者 gcc --version2、下载gcc源码&#xff08;10.2.0&#xff09; wget https://f…

2022.12青少年软件编程(Python)等级考试试卷(六级)

2022.12.10青少年软件编程(Python)等级考试试卷(六级) 一、单选题(共25题,共50分) 1.数据文件“abc.txt”中包含若干个英文单词,如图所示: 读取文件“abc.txt”中数据的Python程序段如下: file = abc.txt word_b = [] for word in open(file): if w…

spring boot支持https请求(建议收藏)

文章目录前言一、借助keytools二、详细步骤三、配置spring项目支持https总结前言 博主个人社区&#xff1a;开发与算法学习社区 博主个人主页&#xff1a;Killing Vibe的博客 欢迎大家加入&#xff0c;一起交流学习~~ 众所周知&#xff0c;http是不安全的协议&#xff0c;那么要…

OC/Swift 技术 链接跳转外置(内置)Safari/加载网页(源码)

一直觉得自己写的不是技术&#xff0c;而是情怀&#xff0c;一个个的教程是自己这一路走来的痕迹。靠专业技能的成功是最具可复制性的&#xff0c;希望我的这条路能让你们少走弯路&#xff0c;希望我能帮你们抹去知识的蒙尘&#xff0c;希望我能帮你们理清知识的脉络&#xff0…

javascript将地址转换为经纬度_调用百度地图API_地址解析

1、注册账号和密钥申请 百度地图 选择&#xff0c;开发文档->javascriptAPI 进入后先进行账号和密钥获取&#xff0c;并且申请成为百度开发者&#xff0c;点击使用方法内的步骤即可跳转 获取服务密钥ak 应用类型选择浏览器端 白名单自己设置&#xff1a;只有白名单中的网站…

【博客595】从linux收包与发包过程看iptables链如何发挥作用

从linux收包与发包过程看iptables链如何发挥作用 1、linux收包过程&#xff08;以udp包为例&#xff09; 2、linux发包过程&#xff08;以udp包为例&#xff09; 3、收发包过程中iptables的hook如何发挥作用 主要分为三个部分&#xff1a; 接收数据的处理流程是&#xff1a;…