Kafka学习笔记(一)Linux环境基于Zookeeper搭建Kafka集群、Kafka的架构

news2024/12/24 11:34:28

文章目录

  • 1 Kafka简介
    • 1.1 什么是Kafka
    • 1.2 Kafka的应用场景
    • 1.3 Kafka的优势
  • 2 搭建Kafka集群
    • 2.1 搭建Zookeeper集群
      • 2.1.1 上传并解压安装包
      • 2.1.2 修改配置文件
      • 2.2.3 创建dataDir和myid文件
      • 2.2.4 分发到另外两个节点
      • 2.2.5 修改node-02节点、node-03节点的配置文件和myid文件
      • 2.2.6 启动Zookeeper集群
    • 2.2 搭建Kafka集群
      • 2.2.1 下载Kafka安装包
      • 2.2.2 上传并解压
      • 2.2.3 修改配置文件server.properties
      • 2.2.4 将`kafka01`目录分发至node-02、node-03节点
      • 2.2.5 分别修改node-02节点、node-03节点的配置文件
      • 2.2.6 启动Kafka集群
    • 2.3 使用工具连接Kafka集群
      • 2.3.1 连接Kafka集群
      • 2.3.2 创建topic
    • 2.4 问题处理
  • 3 Kafka的架构
    • 3.1 Broker(服务器节点)
    • 3.2 Topic(主题)
    • 3.3 Partition(分区)
    • 3.4 Producer(生产者)、Consumer(消费者)
    • 3.5 Consumer Group(消费者组)
    • 3.6 Leader Partition(领导者分区)
    • 3.7 Follower Partition(跟随者分区)
    • 3.8 Offset(偏移量)

1 Kafka简介

1.1 什么是Kafka

以下是 Kafka官网 的介绍:

Apache Kafka 是一个开源的分布式事件流平台,被数千家公司用做高性能数据管道、流分析、数据集成和关键任务应用程序。超过80%的财富100强公司信任并使用Kafka。

Kafka 组合了三个关键功能,是一个经过实战测试的实现了端到端事件流的解决方案:

  • 发布(写入)和订阅(读取)事件流,包括从其他系统连续导入/导出数据。
  • 根据需要持久可靠地存储事件流
  • 在事件发生时或回顾性地处理事件流

1.2 Kafka的应用场景

Kafka 通常用在两类程序中:

  • 建立实时数据管道,以可靠地在系统或应用程序之间获取数据
  • 构建实时流应用程序,以转换或响应数据流

  • Producers:生产者,可以有很多的应用程序,将消息数据放入到Kafka集群中。
  • Consumers:消费者,可以有很多的应用程序,将消息数据从Kafka集群中拉取出来。
  • Connectors:连接器,可以将数据库中的数据导入到Kafka,也可以将Kafka的数据导出到
    数据库中。
  • Stream Processors:流处理器,可以从Kafka中拉取数据,也可以将数据写入到Kafka中。

1.3 Kafka的优势

2 搭建Kafka集群

2.1 搭建Zookeeper集群

在2.8.0版本以前,Kafka集群的搭建依赖于Zookeeper环境,需要将Kafka集群节点IP及topic等相关的元数据存入Zookeeper服务中。所以在搭建Kafka集群前,需要先搭建Zookeeper集群。

准备在3台网络互通的虚拟机上搭建Zookeeper集群,信息如下:

节点IP端口
node-01192.168.245.1302181
node-02192.168.245.1312181
node-03192.168.245.1322181

2.1.1 上传并解压安装包

先在node-01主机上操作:

[root@node-01 ~]$ tar -zxvf apache-zookeeper-3.8.4-bin.tar.gz
[root@node-01 ~]$ mv apache-zookeeper-3.8.4-bin zookeeper01

2.1.2 修改配置文件

# 进入配置文件目录
[root@node-01 ~]$ cd zookeeper01/conf/
# 拷贝一份配置文件并重新命名
[root@node-01 conf]$ cp zoo_sample.cfg zoo.cfg
# 修改配置文件
[root@node-01 conf]$
vim zoo.cfg

修改如下内容:

# 数据目录修改为指定目录
dataDir=/root/zookeeper01/data
# zookeeper集群的3个节点
server.1=192.168.245.130:2888:3888
server.2=192.168.245.131:2888:3888
server.3=192.168.245.132:2888:3888

2.2.3 创建dataDir和myid文件

# 创建zoo.cfg配置文件指定的数据目录
[root@node-01 ~]$ cd zookeeper01
[root@node-01 zookeeper01]$ mkdir data
# 在数据目录下创建myid文件,内容也是zoo.cfg配置文件中server.1指定的
[root@node-01 zookeeper01]$ echo 1 > zookeeper/myid
[root@node-01 zookeeper01]$ cat data/myid 
1

2.2.4 分发到另外两个节点

# 分发到node-02节点
[root@node-01 ~]# scp -r zookeeper01/ root@192.168.245.131:~/zookeeper02
# 分发到node-03节点
[root@node-01 ~]# scp -r zookeeper01/ root@192.168.245.132:~/zookeeper03

此时可以在node-02节点、node-03节点看到对应的目录:

2.2.5 修改node-02节点、node-03节点的配置文件和myid文件

  • 修改node-02节点的配置文件的数据目录
# zookeeper02/config/zoo.cfg
dataDir=/root/zookeeper02/data
  • 修改node-02节点的myid的内容为2
[root@node-02 zookeeper02]$ cat data/myid 
2
  • 修改node-03节点的配置文件的数据目录
# zookeeper03/config/zoo.cfg
dataDir=/root/zookeeper03/data
  • 修改node-03节点的myid的内容为3
[root@node-03 zookeeper03]$ cat data/myid 
3

2.2.6 启动Zookeeper集群

分别进入Zookeeper的bin目录下,然后借助Xshell工具,同时向3个节点发送启动命令:

[root@node-01 bin]$ zkServer.sh start
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /root/zookeeper01/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

查看Zookeeper集群状态,可以发现leader是编号最大的服务器,即node-03:

至此,Zookeeper集群搭建好了。

2.2 搭建Kafka集群

2.2.1 下载Kafka安装包

Kafka目前最新的版本是3.8.0,可以依赖Zookeeper环境,也可以不依赖Zookeeper环境:

2.2.2 上传并解压

将Kafka安装包上传至node-01节点并解压,修改文件夹名为kafka01

[root@node-01 ~]$ tar -zxvf kafka_2.13-3.8.0.tgz
[root@node-01 ~]$ mv kafka_2.13-3.8.0 kafka01

2.2.3 修改配置文件server.properties

[root@node-01 ~]$ vim kafka01/config/server.properties

修改内容如下:

# kafka01/config/server.properties

# 指定broker的id
broker.id=1
# 指定Kafka数据的位置
log.dirs=/root/kafka01/data
# 配置zookeeper的三个节点
zookeeper.connect=192.168.245.130:2181,192.168.245.131:2181,192.168.245.132:2181

2.2.4 将kafka01目录分发至node-02、node-03节点

scp -r kafka01/ root@192.168.245.131:~/kafka02
scp -r kafka01/ root@192.168.245.132:~/kafka03

此时可以在node-02节点、node-03节点看到对应的目录:

2.2.5 分别修改node-02节点、node-03节点的配置文件

  • 修改node-02节点的配置文件
# kafka02/config/server.properties
broker.id=2
log.dirs=/root/kafka02/data
  • 修改node-03节点的配置文件
# kafka03/config/server.properties
broker.id=3
log.dirs=/root/kafka03/data

2.2.6 启动Kafka集群

进入kafka安装目录下的bin目录,同时启动3个节点:

[root@node-01 ~]$ cd kafka01/bin/
[root@node-01 bin]$ nohup ./kafka-server-start.sh ../config/server.properties &

这样,Kafka集群就搭建完成了。

2.3 使用工具连接Kafka集群

2.3.1 连接Kafka集群

在 Offset Explorer官网 下载Kafka连接工具:

安装后新建Kafka集群连接:

连接成功后可以看到Kafka集群的3个节点:

2.3.2 创建topic

2.4 问题处理

  • 问题1

部署Kafka过程中,出现java.net.UnknownHostException: node-02异常:

出现这个问题是因为3台主机之间没有实现主机名互通。

  • 修改node-01节点的/etc/hosts文件,新增以下内容:
192.168.245.131 node-02
192.168.245.132 node-03

配置完成后,即可通过主机名访问其他节点:

同样的方法配置node-02节点、node-03节点。随后重启Kafka集群,不再报错。

  • 问题2

使用工具创建topic时,报错:

经过排查发现出现这个问题的原因仍然是无法解析主机名。

修改C:\Windows\System32\drivers\etc\hosts文件,添加以下内容:

192.168.245.130 node-01
192.168.245.131 node-02
192.168.245.132 node-03

再次尝试创建topic,成功:

3 Kafka的架构

3.1 Broker(服务器节点)

Kafka集群包含一个或多个服务器节点,服务器节点称为Broker,用于存储Topic的数据。

如果某Topic有N个Partition(分区),集群也有N个Broker,那么每个Broker就存储其中一个Partition,刚好是一对一。

如果某Topic有N个Partition,集群有(N+M)个Broker,那么其中有N个Broker存储N个Partition,剩下的M个Broker不存储该Topic的Partition数据。

如果某Topic有N个partition,但集群中Broker数目少于N个,那么一个Broker就需要存储该Topic的一个或多个Partition。在实际生产环境中,尽量避免这种情况的发生,这种情况容易导致Kafka集群数据不均衡。

3.2 Topic(主题)

每条发布到Kafka集群的消息都有一个类别,这个类别就被称为主题(Topic)。

在物理上,不同Topic的消息会分开存储;在逻辑上,一个Topic的消息虽然保存于一个或多个Broker上,但用户只需指定消息的Topic,而不必关心数据存于何处。

3.3 Partition(分区)

每个Topic被分割为一个或多个Partition(分区),而每个Partition中的数据使用多个Segment文件存储。Partition中的数据是有序的,但不同Partition间的数据则丢失了顺序。

因此,如果一个Topic有多个Partition,消费数据时就不能保证数据的顺序,在需要严格保证消息的消费顺序的场景下,需要将Partition数目设为1。

3.4 Producer(生产者)、Consumer(消费者)

Producer即数据的发布者,将消息发布到Kafka的某个Topic中。

Broker接收到生产者发送的消息后,将该消息存储到一个Partition中。生产者也可以指定数据存储的Partition。

Consumer即数据的消费者,可以消费一个多个Topic中的数据。

3.5 Consumer Group(消费者组)

每个Consumer属于一个特定的Consumer Group(可为每个Consumer指定Group名称,若不指定Group名称则属于默认的Group)。

这是Kafka用来实现一个Topic消息的广播(发给某个Consumer Group下的所有Consumer)和单播(发给某个Consumer Group下的任意一个Consumer)的手段。一个Topic可以有多个Consumer Group。

3.6 Leader Partition(领导者分区)

每个Partition有多个副本,其中有且仅有一个作为Leader,Leader是当前负责数据的读写的Partition。

3.7 Follower Partition(跟随者分区)

Follower跟随Leader,所有写请求都通过Leader路由,数据变更会广播给所有Follower,使得Follower与Leader保持数据同步。如果Leader失效,则从Follower中选举出一个新的Leader。

3.8 Offset(偏移量)

Kafka的存储文件都是按照offset.kafka来命名,用offset做名字的好处是方便查找。例如你想找位于2049的位置,只要找到2048.kafka的文件即可(从00.kafka开始)。

本节完,更多内容请查阅分类专栏:微服务学习笔记

感兴趣的读者还可以查阅我的另外几个专栏:

  • SpringBoot源码解读与原理分析
  • MyBatis3源码深度解析
  • Redis从入门到精通
  • MyBatisPlus详解
  • SpringCloud学习笔记

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

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

相关文章

【原创教程】西门子_部件手动模式FB块编辑

1、软件配置 ①软件配置 名称 版本 博图 V16 2、建立FB块 在编辑手动程序前应该建立手动程序的FB块,FB块的建立内容如下图所示 ①FB块的输入接口 Input:FB块的输入接口,将下拉列表中的数据应用于该FB块所编辑的程序中。 NO:当前部件…

数据科学 - 字符文本处理

1. 字符串的基本操作 1.1 结构操作 1.1.1 拼接 • 字符串之间拼接 字符串之间的拼接使用进行字符串的拼接 a World b Hello print(b a) • 列表中的字符串拼接 将以分隔符‘,’为例子 str [apple,banana] print(,.join(str)); • 字符串中选择 通过索引进行切片操…

一个 Java 语言简化处理 PDF 的框架,提供了一套简单易用的 API 接口,满足多样化需求又能简化开发流程的处理方案(附教程)

前言 当前市面上处理 PDF 文件的工具众多,但它们往往存在一定的局限性,比如复杂交互、功能单一等问题。尤其对于那些需要频繁生成或编辑 PDF 文档的应用场景来说,找到一个既能满足多样化需求又能简化开发流程的处理方案显得尤为重要。那么&a…

思想和认知,从身边的事情和从小经历就在培养。谁在起跑线!

世界地图就像一张藏宝图,有的地方有宝藏,有的地方物资匮乏。当你拼命努力却一直挖不到宝藏的时候,不妨换个位置挖掘。如果你运气好,很可能就挖到一堆金子直接实现财富自由。运气不好,也能轻松过上小康生活。财富和位置…

新书推荐——《Python贝叶斯深度学习》

在过去的十年中,机器学习领域取得了长足的进步,并因此激发了公众的想象力。但我们必须记住,尽管这些算法令人印象深刻,但它们并非完美无缺。本书旨在通过平实的语言介绍如何在深度学习中利用贝叶斯推理,帮助读者掌握开…

【Java】Java中String、StringBuilder、StringJoiner详解

目录 引言 一、String 1.1 String的定义 1.1.1 直接赋值 1.1.2 new关键字创建 1.2 常用方法 1.3 字符串的不可变性 1.4 字符串内存的存储原理 二、StringBuilder 2.1 常用方法 2.2 动态扩容策略 2.3 使用场景 三、StringJoiner 3.1 构造方法 3.2 常用方法 3.3…

ArcGIS共享数据的最佳方法(不丢可视化、标注等各类显示信息一样带)

今天我们介绍一下ArcGIS数据共享的几个小妙招 我们时常要把数据发给对方,特别是很多新手朋友要将shp发给对方时只是发送了shp后缀的文件,却把shp的必要组成文件dbf、shx等等给落下了。 还有很多朋友给图层做好了符号化标注,但是数据一发给别…

介绍几个LDO低压差线性稳压器(ME6206、RT9013、XC6206)

最近翻了翻开源平台上面的一些设计,收集了一些LDO的电路设计,这边分享记录一下。 ME6206 不同的产品型号对应不同的输出电压,工作电流,封装形式。 典型应用电路图也很简单,就在电压的输入输出端各加一个电容。 输入电…

Miniforge详细安装教程(macOs和Windows)

(注:主要是解决商业应用anaconda收费问题,这是轻量级的代替,个人完全可以使用anaconda和miniconda) Miniforge 是一个轻量级的包管理器,类似于 Anaconda 和 Miniconda。它主要用于安装基于 conda 的 Python 环境,专注于…

【智能算法应用】樽海鞘群算法求解二维路径规划问题

摘要 路径规划是机器人导航和自主无人机领域中的关键问题。本文提出了一种基于智能优化算法——樽海鞘群算法(Salp Swarm Algorithm, SSA)的二维路径规划方法。该算法模拟樽海鞘的链式运动行为,旨在寻找障碍物环境中的最优路径。通过仿真实验…

StopWath,apache commons lang3 包下的一个任务执行时间监视器的使用

StopWath是 apache commons lang3 包下的一个任务执行时间监视器&#xff0c;与我们平时常用的秒表的行为比较类似&#xff0c;我们先看一下其中的一些重要方法&#xff1a; <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 --> <dependen…

3D 模型GLTF、GLB格式文件介绍使用;FBX格式

一、GLTF、GLB介绍 GLTF&#xff08;GL Transmission Format&#xff09;和 GLB&#xff08;GL Binary&#xff09;是用于在 Web 和各种应用程序中传输和加载 3D 场景和模型的开放标准格式。它们由 Khronos Group 开发&#xff0c;旨在提供一种高效、可扩展且易于使用的 3D 内…

RUST语言的初印象-从一个模拟登陆谈起-slint+reqwest+aes

本文就一个做了三四天的小程序讲第一次学用RUST的感受&#xff0c;内附代码。 了角语言 从一些渠道听说了R&#xff0c;这个字母挺魔性&#xff0c;那个文章说C和R的团体已经上升到了宗教崇拜的高度&#xff0c;然后&#xff0c;我觉得必 有过人之处&#xff0c;大约10年没碰…

C# DotNetty客户端

1. 引入DotNetty包 我用的开发工具是VS2022&#xff0c;不同工具引入可能会有差异 工具——>NuGet包管理器——>管理解决方案的NuGet程序包 搜索DotNetty 2.新建EchoClientHandler.cs类 用于接收服务器返回数据 public class EchoClientHandler : SimpleChannelIn…

vs code自动报错

让vs code自动报错&#xff0c; 点击插件 → 搜索error lens → 点击install&#xff0c; 下载完后&#xff0c;编写的代码有问题就会自动报错了。 5、修改默认缩进字符 点击设置&#xff08;settings&#xff09; → 点击常用设置 → 修改字符缩进。

汽车自研算法部署芯片份额浅思

国内汽车行业如火如荼发展,汽车从业的研发人员也激增,从三电到座舱到智能驾驶和动力底盘一体化发展。 芯片承载着算法落地,国内主流的主机厂(OEM)的EE架构规划都基本使用主流的车规级芯片,如 英飞凌(Infineon):德国半导体制造商,行业当前在预控的SOC的MCU选择TC39X…

ROC、TPR、FPR的含义

1、ROC&#xff08;Receiver Operating Characteristic&#xff09; ROC&#xff08;Receiver Operating Characteristic&#xff09;曲线是一种用于评估分类模型性能的工具。它通过绘制真阳性率&#xff08;True Positive Rate, TPR&#xff09;与假阳性率&#xff08;False…

新书速览|Stable Diffusion-ComfyUI AI绘画工作流解析

《Stable Diffusion-ComfyUI AI绘画工作流解析》 本书内容 《Stable Diffusion-ComfyUI AI绘画工作流解析》从零开始&#xff0c;详尽系统地讲解从本地部署ComfyUI、下载安装自定义节点&#xff0c;到搭建各种工作流程的全过程。同时&#xff0c;辅以3D形象转绘、艺术二维码和证…

智能制造的生产力基础设施

由于全球大多数细分市场的半导体工厂都满负荷运转&#xff0c;因此&#xff0c;生产力如今成为整个行业关注的重要问题也就不足为奇了。工厂经理会仔细监控关键绩效指标 (KPI)&#xff0c;以发现任何生产力下降的迹象&#xff0c;以便快速做出反应&#xff0c;找出并解决这些偏…

UE4中 -skipbuild -nocompile 有什么区别

在项目开发中&#xff0c;我看到了在调用 Engine\\Build\\BatchFiles\\RunUAT.bat 相关的命令行中&#xff0c;有 -skipbuild、 -nocompile 两个很像的参数&#xff0c;于是想探究一下它们的区别与含义。 -skipbuild 参数 到底有没有 -skipbuild 这个参数&#xff1f;根据 http…