前面给大家讲过flume的简介与安装,还没有安装好的朋友可以再去看看教程
Flume简介与详细安装教程
今天就给大家详细介绍下当下流行的分布式发布 - 订阅消息系统Kafka.
那么问题来了,什么是Kafka呢?为什么要使用kafka?有哪些好处?带着这样的问题,今天小编就给大家好好说说。

什么是Kafka

Apache Kafka是一个分布式发布 - 订阅消息系统和一个强大的队列,可以处理大量的数据,并使您能够将消息从一个端点传递到另一个端点。 Kafka适合离线和在线消息消费。 Kafka消息保留在磁盘上,并在群集内复制以防止数据丢失。 Kafka构建在ZooKeeper同步服务之上。 它与Apache Storm和Spark非常好地集成,用于实时流式数据分析。

Kafka专为分布式高吞吐量系统而设计。 Kafka往往工作得很好,作为一个更传统的消息代理的替代品。 与其他消息传递系统相比,Kafka具有更好的吞吐量,内置分区,复制和固有的容错能力,这使得它非常适合大规模消息处理应用程序。

什么是消息系统

消息系统负责将数据从一个应用程序传输到另一个应用程序,因此应用程序可以专注于数据,但不担心如何共享它。分布式消息传递基于可靠消息队列的概念。消息在客户端应用程序和消息传递系统之间异步排队。
有两种类型的消息模式可用 :
一种是点对点;
另一种是发布 - 订阅(pub-sub)消息系统。大多数消息模式遵循 pub-sub 。

1. 点对点消息系统

在点对点系统中,消息被保留在队列中。 一个或多个消费者可以消耗队列中的消息,但是特定消息只能由最多一个消费者消费。一旦消费者读取队列中的消息,它就从该队列中消失。该系统的典型示例是订单处理系统,其中每个订单将由一个订单处理器处理,但多个订单处理器也可以同时工作。 如下图所描述:

2. 发布-订阅消息系统

在发布 - 订阅系统中,消息被保留在主题中。 与点对点系统不同,消费者可以订阅一个或多个主题并使用该主题中的所有消息。 在发布 - 订阅系统中,消息生产者称为发布者,消息使用者称为订阅者。 一个现实生活的例子是Dish电视,它发布不同的渠道,如运动,电影,音乐等,任何人都可以订阅自己的频道集,并获得他们订阅的频道时可用。如下图所描述:

使用Kafka好处

  1. 可靠性 - Kafka是分布式,分区,复制和容错的。
  2. 可扩展性 - Kafka消息传递系统轻松缩放,无需停机。
  3. 耐用性 - Kafka使用分布式提交日志,这意味着消息会尽可能快地保留在磁盘上,因此它是持久的。
  4. 性能 - Kafka对于发布和订阅消息都具有高吞吐量。 即使存储了许多TB的消息,它也保持稳定的性能。
  5. 快速 - 单Broker每秒几百MB读取 Kafka非常快,并保证零停机和零数据丢失。

为什么需要用到Kafka

Kafka是一个统一的平台,用于处理所有实时数据Feed。 Kafka支持低延迟消息传递,并在出现机器故障时提供对容错的保证。 它具有处理大量不同消费者的能力。 Kafka非常快,执行2百万写/秒。 Kafka将所有数据保存到磁盘,这实质上意味着所有写入都会进入操作系统(RAM)的页面缓存。 这使得将数据从页面缓存传输到网络套接字非常有效。

Kafka广泛应用

  • 指标 - Kafka通常用于操作监控数据。 这涉及聚合来自分布式应用程序的统计信息,以产生操作数据的集中馈送。
  • 日志聚合解决方案 - Kafka可用于跨组织从多个服务收集日志,并使它们以标准格式提供给多个服务器。
  • 流处理 - 流行的框架(如Storm和Spark Streaming)从主题中读取数据,对其进行处理,并将处理后的数据写入新主题,供用户和应用程序使用。 Kafka的强耐久性在流处理的上下文中也非常有用。

消息中间件中的术语

在了解Kafka之前,必须先了解主题,经纪人,生产者和消费者等主要术语。下面为大家详细说明:

1. Topics(主题)
属于特定类别的消息流称为主题。 数据存储在主题中。发布订阅模式下的消息统一汇集地;
主题被拆分成分区。 对于每个主题,Kafka保存一个分区的数据。 每个这样的分区包含不可变有序序列的消息。 分区被实现为具有相等大小的一组分段文件。

2. Partition(分区)
主题可能有许多分区,因此它可以处理任意数量的数据

3. Partition offset(分区偏移)
每个分区消息具有称为 offset 的唯一序列标识。

4. Replicas of partition(分区备份)
副本只是一个分区的备份。 副本从不读取或写入数据。 它们用于防止数据丢失。

5. Brokers(经纪人)

  • 消息服务器,提供核心服务;

  • 代理是负责维护发布数据的简单系统。 每个代理中的每个主题可以具有零个或多个分区。
    假设,如果在一个主题和N个代理中有N个分区,每个代理将有一个分区。

  • 假设在一个主题中有N个分区并且多于N个代理(n + m),则第一个N代理将具有一个分区,并且下一个M代理将不具有用于该特定主题的任何分区。

  • 假设在一个主题中有N个分区并且小于N个代理(n-m),每个代理将在它们之间具有一个或多个分区共享。 由于代理之间的负载分布不相等,不推荐使用此方案。

6.Kafka Cluster(Kafka集群)
Kafka有多个代理被称为Kafka集群。 可以扩展Kafka集群,无需停机。 这些集群用于管理消息数据的持久性和复制.

7.Producers(生产者)
生产者是发送给一个或多个Kafka主题的消息的发布者。 生产者向Kafka经纪人发送数据。
每当生产者将消息发布给代理时,代理只需将消息附加到最后一个段文件。 实际上,该消息将被附加到分区。 生产者还可以向他们选择的分区发送消息。

8.Consumers(消费者)
Consumers从经纪人处读取数据。 消费者订阅一个或多个主题,并通过从代理中提取数据来使用已发布的消息。

9.Leader(领导者)
Leader 是负责给定分区的所有读取和写入的节点。 每个分区都有一个服务器充当Leader。

10.Follower(追随者)
跟随领导者指令的节点被称为Follower。 如果领导失败,一个追随者将自动成为新的领导者。 跟随者作为正常消费者,拉取消息并更新其自己的数据存储。

Kafka 集群架构

Kafka的集群图,如下图所示:

组件解析:

  • Broker(代理)
    Kafka集群通常由多个代理组成以保持负载平衡。 Kafka代理是无状态的,所以他们使用ZooKeeper来维护它们的集群状态。
    一个Kafka代理实例可以每秒处理数十万次读取和写入,每个Broker可以处理TB的消息,而没有性能影响。 Kafka经纪人领导选举可以由ZooKeeper完成。

  • ZooKeeper
    ZooKeeper用于管理和协调Kafka代理。 ZooKeeper服务主要用于通知生产者和消费者Kafka系统中存在任何新代理或Kafka系统中代理失败。
    根据Zookeeper接收到关于代理的存在或失败的通知,然后产品和消费者采取决定并开始与某些其他代理协调他们的任务。

  • Producers(生产者)
    生产者将数据推送给经纪人。 当新代理启动时,所有生产者搜索它并自动向该新代理发送消息。 Kafka生产者不等待来自代理的确认,并且发送消息的速度与代理可以处理的一样快。

  • Consumers(消费者)

因为Kafka代理是无状态的,这意味着消费者必须通过使用分区偏移来维护已经消耗了多少消息。
如果消费者确认特定的消息偏移,则意味着消费者已经消费了所有先前的消息。 消费者向代理发出异步拉取请求,以具有准备好消耗的字节缓冲区。
消费者可以简单地通过提供偏移值来快退或跳到分区中的任何点。 消费者偏移值由ZooKeeper通知。

Kafka 工作流程

Kafka只是分为一个或多个分区的主题的集合。 Kafka分区是消息的线性有序序列,其中每个消息由它们的索引(称为偏移)来标识。 Kafka集群中的所有数据都是不相连的分区联合。 传入消息写在分区的末尾,消息由消费者顺序读取。 通过将消息复制到不同的代理提供持久性。
Kafka以快速,可靠,持久,容错和零停机的方式提供基于pub-sub和队列的消息系统。 在这两种情况下,生产者只需将消息发送到主题,消费者可以根据自己的需要选择任何一种类型的消息传递系统。

发布 - 订阅消息的工作流程

  1. 生产者定期向主题发送消息。
  2. Kafka代理存储为该特定主题配置的分区中的所有消息。 它确保消息在分区之间平等共享。 如果生产者发送两个消息并且有两个分区,Kafka将在第一分区中存储一个消息,在第二分区中存储第二消息。
  3. 消费者订阅特定主题。
  4. 一旦消费者订阅主题,Kafka将向消费者提供主题的当前偏移,并且还将偏移保存在Zookeeper系综中。
  5. 消费者将定期请求Kafka(如100 Ms)新消息。
  6. 一旦Kafka收到来自生产者的消息,它将这些消息转发给消费者。
  7. 消费者将收到消息并进行处理。
  8. 一旦消息被处理,消费者将向Kafka代理发送确认。
  9. 一旦Kafka收到确认,它将偏移更改为新值,并在Zookeeper中更新它。 由于偏移在Zookeeper中维护,消费者可以正确地读取下一封邮件。
  10. 以上流程将重复,直到消费者停止请求。
  11. 消费者可以随时回退/跳到所需的主题偏移量,并阅读所有后续消息。

队列消息/用户组的工作流程

在队列消息传递系统而不是单个消费者中,具有相同组ID 的一组消费者将订阅主题。 简单来说,订阅具有相同 Group ID 的主题的消费者被认为是单个组,并且消息在它们之间共享。

  1. 生产者以固定间隔向某个主题发送消息。
  2. Kafka存储在为该特定主题配置的分区中的所有消息,类似于前面的方案。
  3. 单个消费者订阅特定主题,假设 Topic-1 为 Group ID 为 Group-1 。
  4. Kafka以与发布 - 订阅消息相同的方式与消费者交互,直到新消费者以相同的组ID 订阅相同主题 Topic-1 1
  5. 一旦新消费者到达,Kafka将其操作切换到共享模式,并在两个消费者之间共享数据。 此共享将继续,直到用户数达到为该特定主题配置的分区数。
  6. 一旦消费者的数量超过分区的数量,新消费者将不会接收任何进一步的消息,直到现有消费者取消订阅任何一个消费者。 出现这种情况是因为Kafka中的每个消费者将被分配至少一个分区,并且一旦所有分区被分配给现有消费者,新消费者将必须等待。
  7. 此功能也称为使用者组。 同样,Kafka将以非常简单和高效的方式提供两个系统中最好的。

ZooKeeper的作用

Kafka的一个关键依赖是Apache Zookeeper,它是一个分布式配置和同步服务。 Zookeeper是Kafka代理和消费者之间的协调接口。 Kafka服务器通过Zookeeper集群共享信息。 Kafka在Zookeeper中存储基本元数据,例如关于主题,代理,消费者偏移(队列读取器)等的信息。

由于所有关键信息存储在Zookeeper中,并且它通常在其整体上复制此数据,因此Kafka代理/ Zookeeper的故障不会影响Kafka集群的状态。 Kafka将恢复状态,一旦Zookeeper重新启动。 这为Kafka带来了零停机时间。 Kafka代理之间的领导者选举也通过使用Zookeeper在领导者失败的情况下完成。

说了这么多,相信大家对Kafka已经有了清晰的了解,那么接下来就是动手开始安装。

首先要确保已经安装好了JDK和zookeeper,还没安装好的自己再去看我前面文章,都有详细教程,在这里就不多说了,今天主要说下Kafka的安装。

Kafka的单机部署安装

1.下载Kafka

http://kafka.apache.org/downloads

我下的是2.4.0版,如下图所示:

其中"kafka_2.11-2.4.0"表示 Kafka 版本 2.4.0,Scala 版本 2.11。建议 使用Scala2.11

2.解压tgz文件

tar -zxf kafka_2.11-2.4.0.tgz

3.解压后放到soft目录下并重命名

mv kafka_2.11-2.4.0 soft/kafka211

4.进入config更改配置信息

cd /opt/soft/kafka211/config

5.先改zookeeper.properties 信息

vi zookeeper.properties 

更改dataDir信息,就是配置zookeeper时的存放日志信息目录,单台机可以不配置

dataDir=/opt/soft/zk345/tmp  clientPort=2181 

6.改server.properties 信息

#每个文件配置的 id的值不能一样,如果是集群的话
broker.id=0
#用于存储日志文件
log.dirs=/opt/soft/kafka211/datas
#zookeeper的连接,自己本机ip和配置的端口号
zookeeper.connect=192.168.5.150:2181
#开启远程监听,让第三方连接,改自己本机ip地址
listeners=PLAINTEXT://192.168.5.150:9092 

注意:

Kafka 必须依赖 ZooKeeper,所以应该确保 ZooKeeper 已成功运行。
Kafka 内置 了 ZooKeeper,故如果未安装 ZooKeeper 可以使用其内置 ZooKeeper。

7.配置kafka环境变量
vi /etc/profile

export KAFKA_HOME=/opt/soft/kafka211
export PATH=$PATH:$KAFKA_HOME/bin

8.激活配置

source /etc/profile

9.先启动zookeeper服务

zkServer.sh start

10.再启动kafka 在bin 目录下

cd /opt/soft/kafka211/bin
./kafka-server-start.sh /opt/soft/kafka211/config/server.properties 

如下图所示:

出现如上图所示,说明已经启动成功!

11.使用jps验证服务是否启动
jps出现kafka的进程,说明已经启动成功。如下图所示:

kafka基本操作命令

1. 创建Kafka主题
Kafka提供了一个名为 kafka-topics.sh 的命令行实用程序,用于在服务器上创建主题;
可以并创建多个分区 并发执行 但是顺序就是无序的,只是局部有序
语法:

kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1
--partitions 1 --topic topic-name

示例:

kafka-topics.sh --create --zookeeper 192.168.5.150:2181 --replication-factor 1 --partitions 1 --topic mydemo

2.获取主题列表
语法:

kafka-topics.sh --zookeeper 192.168.5.150:2181 --list

3.启动生产者以发送消息
语法:

kafka-console-producer.sh --broker-list localhost:9092 --topic topic-name

示例:

kafka-console-producer.sh --broker-list 192.168.5.150:9092 --topic mydemo

4.启动消费者以接收消息
语法:

kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic topic-name --from-beginning

示例:

kafka-console-consumer.sh --bootstrap-server 192.168.5.150:9092  --topic mydemo --from-beginning

5.修改主题
语法:

kafka-topics.sh —zookeeper localhost:2181 --alter --topic topic_name
--partitions n

示例:

kafka-topics.sh --zookeeper 192.168.5.150:2181 --alter --topic mydemo --partitions 2

6.删除主题
语法:

kafka-topics.sh --delete --zookeeper localhost:2181 --topic topic_name

示例:

kafka-topics.sh --delete --zookeeper 192.168.5.150:2181 --topic mydemo

然后把server.properties中的配置改为true
delete.enable.topic=true
最后再删server.properties 中的日志datas,目录在log.dirs=/opt/soft/kafka211/datas下 ,把datas删掉,这样才能真正的删除主题。

7.查看topic某分区偏移量最大(小)量
不仅可以显示总条数 ,还可以把游标还原到启始位置
语法:
bin目录下启动

kafka-run-class.sh kafka.tools.GetOffsetShell --topic topic_name --time -1 --broker-list localhost:9092 --partitions n

示例:
cd /opt/soft/kakfak211/bin

./kafka-run-class.sh kafka.tools.GetOffsetShell --topic mydemo --time -1 --broker-list 192.168.5.150:9092 --partitions 0

8.移动游标从读的位置回到启始位置
语法:

kafka-consumer-groups.sh --bootstrap-server localhost:9092 --group group_name --reset-offsets --all-topics --to-earliest --execute
kafka-consumer-groups.sh --bootstrap-server 192.168.5.150:9092 --group group1 --reset-offsets --all-topics --to-earliest --execute

Kafka简介及详细安装教程相关推荐

  1. HBuilderX 详细安装教程

    HBuilderX 详细安装教程 HBuilderX简介 1.下载 1.1进入[DCloud官网](https://www.dcloud.io/) 1.2点击左上角下载 1.3选择想要下载的版本下载 ...

  2. Autodesk 123D Design最新中文版详细安装教程!

    CAD的软件安装教程已经分享过了,但是有盘友想用123D,我在网上查找了一下,没有找到最新版的,旧版不支持中文,网上那些中文版教程也不太详细.所以今天就分享123D_R2.2(最新版)详细安装教程,安 ...

  3. Keil5软件详细安装教程

    文章目录 Keil5软件详细安装教程 一.Keil5软件简介 二.Keil5软件下载 三.下载芯片支持包(.pack文件) 四.特别注意:如果想要Keil_MDK和Keil_C51共存,那么首先需要安 ...

  4. 《已测试》2021新版恋爱撩妹话术小程序前后双端源码+详细安装教程+无限多开独立后台版本

    详情简介: 恋爱话术小程序前后双端稳定运营版本 1.支持流量主 2.支持卡密交易 3.支持收费与免费 4.功能多.稳定运营 在线演示地址: 安装教程: 测试环境: 宝塔linux nginx1.18 ...

  5. Java详细安装教程--Java(jdk)安装

    Java详细安装教程–Java(jdk)安装 一.java历史简介 1991 年Sun公司的James Gosling等人开始开发名称为 Oak (橡树)的语言.希望用于控制嵌入在有线电视交换盒.PD ...

  6. mysql为什么每天0点就装东西_MySQL的详细安装教程

    1.安装之前需要注意的几点 建议不要安装最新版本,一般找mysql5.0系列版本即可: mysq1官网有.zip和.msi两种安装形式: zip是压缩包,直接解压缩以后使用的,需要自己配置各种东西:m ...

  7. mysql windows 管道连接,科技常识:Windows Server 2016 MySQL数据库安装配置详细安装教程...

    今天小编跟大家讲解下有关Windows Server 2016 MySQL数据库安装配置详细安装教程 ,相信小伙伴们对这个话题应该也很关注吧,小编也收集到了有关Windows Server 2016 ...

  8. python安装了运行不了_python详细安装教程

    本章开始,我们将详细介绍Python编程环境的搭建,工欲善其事必先利其器,所以我们这里先介绍python详细安装教程.由于Python是跨平台的,他可以运行在Windows.Linux.Mac等系统上 ...

  9. Apache的详细安装教程和遇到的问题解决方案

    Apache的详细安装教程和遇到的问题解决方案 参考文章: (1)Apache的详细安装教程和遇到的问题解决方案 (2)https://www.cnblogs.com/jave1ove/p/54864 ...

最新文章

  1. 【转】Python 代码调试技巧
  2. Unity 网络编程(Socket)应用
  3. 宇宙最強的IDE - Visual Studio 25岁生日快乐
  4. linux加大ram 内核需要,Linux 5.1内核发布:io_uring接口+支持持久性内存用作RAM
  5. Java盲点:双重检查锁定及单例模式
  6. iPhone 13有搞头,经典功能或将回归!
  7. Altium AD20导入DXF/DWG文件,导入AutoCAD绘制的树莓派4B板框及图形
  8. esri-leaflet入门教程(3)-自定义底图
  9. win7+VMware+Ubuntu16.04
  10. 数据库表设计(一):字段设计规范和命名规范
  11. axio基础配置方法
  12. 智慧路灯杆网关_路灯杆控制网关_路灯杆通信网关
  13. mysql中as是什么意思_数据库中as是什么意思
  14. 戴尔服务器加装固态硬盘吗,戴尔如何加装固态硬盘_戴尔电脑增加固态硬盘教程...
  15. iOS-App Logo和闪屏图尺寸
  16. 如何运行PION/ION(分布式流媒体系统)
  17. SecureCRT 多个会话显示在同一窗口
  18. RTSP 协议漫谈,揭秘 RTSP 协议内幕
  19. 基于enc28j60的学习心得
  20. 预见2019吴晓波年终秀演讲PPT整理

热门文章

  1. 实战OpenPose项目4:实时准确的全身多人姿态估计和跟踪系统
  2. Maven中央仓库地址
  3. android mp3 lrc歌词文件utf-8歌词显示为乱码,百度歌词显示乱码 LRC歌词批量转换 UTF-8编码批量转换为GB或ANSI 文本编码批量转换...
  4. repeat()方法
  5. 如何理解向量组的秩和矩阵的秩
  6. 姚重华曾获得过计算机领域最高的奖项图灵奖,微软研究员泰克获计算领域最高奖项图灵奖...
  7. javascript英语单词音节拆分_英语连读时拆分中间单词吗?
  8. 大数据日志分析系统-logstash
  9. 【个人网页设计】简单大方
  10. TensorFlow CRNN