0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

为什么Kafka会怎么快 Kafka 的应用场景

马哥Linux运维 来源:51CTO技术栈 作者:51CTO技术栈 2021-06-04 16:12 次阅读

“Kafka 是由 LinkedIn 公司推出的一个高吞吐的分布式消息系统,通俗地说就是一个基于发布和订阅的消息队列,温故而知新,反复学习优秀的框架,定有所获。

应用场景

Kafka 的应用场景如下:

异步解构:在上下游没有强依赖的业务关系或针对单次请求不需要立刻处理的业务。

系统缓冲:有利于解决服务系统的吞吐量不一致的情况,尤其对处理速度较慢的服务来说起到缓冲作用。

消峰作用:对于短时间偶现的极端流量,对后端的服务可以启动保护作用。

数据流处理:集成 spark 做实时数据流处理。

Kafka 拓扑图(多副本机制)

153ddaa8-c482-11eb-9e57-12bb97331649.png

由上图我们可以发现 Kafka 是分布式,对于每一个分区都存在多副本,同时整个集群的管理都通过 Zookeeper 管理。

Kafka 核心组件

①broker

Kafka 服务器,负责消息存储和转发;一个 broker 就代表一个 kafka 节点。一个 broker 可以包含多个 topic。

②topic

消息类别,Kafka 按照 topic 来分类消息。

③partition

topic 的分区,一个 topic 可以包含多个 partition,topic 消息保存在各个 partition 上。

由于一个 topic 能被分到多个分区上,给 kafka 提供给了并行的处理能力,这也正是 kafka 高吞吐的原因之一。

partition 物理上由多个 segment 文件组成,每个 segment 大小相等,顺序读写(这也是 kafka 比较快的原因之一,不需要随机写)。

每个 Segment 数据文件以该段中最小的 offset ,文件扩展名为.log。当查找 offset 的 Message 的时候,通过二分查找快找到 Message 所处于的 Segment 中。

154b3e96-c482-11eb-9e57-12bb97331649.png

④offset

消息在日志中的位置,可以理解是消息在 partition 上的偏移量,也是代表该消息的唯一序号。

同时也是主从之间的需要同步的信息

⑤Producer

生产者,负责向 Kafka Broker 发消息的客户端。

⑥Consumer

消息消者,负责消费 Kafka Broker 中的消息。

⑦Consumer Group

消费者组,每个 Consumer 必须属于一个 group;(注意:一个分区只能由组内一个消费者消费,消费者组之间互不影响。)

⑧Zookeeper

管理 kafka 集群,负责存储了集群 broker、topic、partition 等 meta 数据存储,同时也负责 broker 故障发现,partition leader 选举,负载均衡等功能。

服务治理

既然 Kafka 是分布式的发布/订阅系统,这样如果做的集群之间数据同步和一致性,kafka 是不是肯定不会丢消息呢?以及宕机的时候如果进行 Leader 选举呢?

①数据同步

在 Kafka 中的 Partition 有一个 leader 与多个 follower,producer 往某个 Partition 中写入数据,是只会往 leader 中写入数据,然后数据才会被复制进其他的 Replica 中。

而每一个 follower 可以理解成一个消费者,定期去 leader 去拉消息。而只有数据同步了后,kafka 才会给生产者返回一个 ACK 告知消息已经存储落地了。

②ISR

在 Kafka 中,为了保证性能,Kafka 不会采用强一致性的方式来同步主从的数据。

而是维护了一个:in-sync Replica 的列表,Leader 不需要等待所有 Follower 都完成同步,只要在 ISR 中的 Follower 完成数据同步就可以发送 ACK 给生产者即可认为消息同步完成。

同时如果发现 ISR 里面某一个 follower 落后太多的话,就会把它剔除。

具体流程如下:

15c1f270-c482-11eb-9e57-12bb97331649.png

15e25722-c482-11eb-9e57-12bb97331649.png

1606bec8-c482-11eb-9e57-12bb97331649.png

上述的做法并无法保证 Kafka 一定不丢消息。虽然 Kafka 通过多副本机制中最大限度保证消息不会丢失,但是如果数据已经写入系统 page cache 中但是还没来得及刷入磁盘,此时突然机器宕机或者掉电,那消息自然而然地就会丢失。

③Kafka 故障恢复

Kafka 通过 Zookeeper 连坐集群的管理,所以这里的选举机制采用的是Zab(zookeeper 使用):

生产者发生消息给 leader ,这个时候 leader 完成数据存储,突然发生故障,没有给 producer 返回 ack。

通过 ZK 选举,其中一个 follower 成为 leader ,这个时候 producer 重新请求新的 leader,并存储数据。

Kafka 为什么这么快

①顺序写磁盘

Kafka 采用了顺序写磁盘,而由于顺序写磁盘相对随机写,减少了寻地址的耗费时间。(在 Kafka 的每一个分区里面消息是有序的)

②Page Cache

Kafka 在 OS 系统方面使用了 Page Cache 而不是我们平常所用的 Buffer。Page Cache 其实不陌生,也不是什么新鲜事物。

我们在 Linux 上查看内存的时候,经常可以看到 buff/cache,两者都是用来加速 IO 读写用的,而 cache 是作用于读。

也就是说,磁盘的内容可以读到 cache 里面,这样应用程序读磁盘就非常快。

而 buff 是作用于写,我们开发写磁盘都是,一般如果写入一个 buff 里面再 flush 就非常快。

而 Kafka 正是把这两者发挥到了极致:Kafka 虽然是 scala 写的,但是依旧在 Java 的虚拟机上运行。

尽管如此,Kafka 它还是尽量避开了 JVM 的限制,它利用了 Page cache 来存储,这样躲开了数据在 JVM 因为 GC 而发生的 STW。

另一方面也是 Page Cache 使得它实现了零拷贝,具体下面会讲。

③零拷贝

无论是优秀的 Netty 还是其他优秀的 Java 框架,基本都在零拷贝减少了 CPU 的上下文切换和磁盘的 IO。

当然 Kafka 也不例外。零拷贝的概念具体这里不作太详细的复述,大致地给大家讲一下这个概念。

传统的一次应用程请求数据的过程:

1682867a-c482-11eb-9e57-12bb97331649.png

这里大致可以发传统的方式发生了 4 次拷贝,2 次 DMA 和 2 次 CPU,而 CPU 发生了4次的切换。

DMA 简单理解就是,在进行 I/O 设备和内存的数据传输的时候,数据搬运的工作全部交给 DMA 控制器,而 CPU 不再参与任何与数据搬运相关的事情。

④零拷贝的方式

通过优化我们可以发现,CPU 只发生了 2 次的上下文切换和 3 次数据拷贝。

Linux 系统提供了系统事故调用函数 “sendfile()”,这样系统调用,可以直接把内核缓冲区里的数据拷贝到 socket 缓冲区里,不再拷贝到用户态。

⑤分区分段

我们上面也介绍过,Kafka 采取了分区的模式,而每一个分区又对应到一个物理分段,查找的时候可以根据二分查找快速定位。这样不仅提供了数据读的查询效率,也提供了并行操作的方式。

⑥数据压缩

Kafka 对数据提供了:Gzip 和 Snappy 压缩协议等压缩协议,对消息结构体进行了压缩,一方面减少了带宽,也减少了数据传输的消耗。

Kafka 安装

①安装 JDK

由于使用压缩包还需要自己配置环境变量,所以这里推荐直接用 yum 安装,熟悉查看目前 Java 的版本:

yum -y list Java*

安装你想要的版本,这里我是 1.8:

yum install java-1.8.0-openjdk-devel.x86_64

查看是否安装成功:

Java -version

②安装 Zookeeper

首先需要去官网下载安装包,然后解压:

tar -zxvf zookeeper-3.4.9.tar.gz

要做的就是将这个文件复制一份,并命名为:zoo.cfg,然后在 zoo.cfg 中修改自己的配置即可。

cp zoo_sample.cfg zoo.cfgvim zoo.cfg

主要配置解释如下:

# zookeeper内部的基本单位,单位是毫秒,这个表示一个tickTime为2000毫秒,在zookeeper的其他配置中,都是基于tickTime来做换算的tickTime=2000# 集群中的follower服务器(F)与leader服务器(L)之间 初始连接 时能容忍的最多心跳数(tickTime的数量)。initLimit=10#syncLimit:集群中的follower服务器(F)与leader服务器(L)之间 请求和应答 之间能容忍的最多心跳数(tickTime的数量)syncLimit=5# 数据存放文件夹,zookeeper运行过程中有两个数据需要存储,一个是快照数据(持久化数据)另一个是事务日志dataDir=/tmp/zookeeper

## 客户端访问端口clientPort=2181

配置环境变量:

vim ~/.bash_profile

export ZK=/usr/local/src/apache-zookeeper-3.7.0-bin

export PATH=$PATH:$ZK/bin

export PATH

// 启动

zkServer.sh start

下面能看启动成功:

③安装 Kafka

下载 Kafka:

https://www.apache.org/dyn/closer.cgi?path=/kafka/2.8.0/kafka-2.8.0-src.tgz

安装 Kafka:

tar -xzvf kafka_2.12-2.0.0.tgzbr

配置环境变量:

export ZK=/usr/local/src/apache-zookeeper-3.7.0-bin

export PATH=$PATH:$ZK/bin

export KAFKA=/usr/local/src/kafka

export PATH=$PATH:$KAFKA/bin

启动 Kafka:

nohup kafka-server-start.sh 自己的配置文件路径/server.properties &br

16c4c6a2-c482-11eb-9e57-12bb97331649.png

大功告成!

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    6700

    浏览量

    88261
  • 服务器
    +关注

    关注

    12

    文章

    8675

    浏览量

    84459
  • 拓扑图
    +关注

    关注

    1

    文章

    19

    浏览量

    14513

原文标题:为什么Kafka如此之快?

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    面试官:Kafka丢消息吗?

    许多开发人员普遍认为,Kafka 的设计本身就能保证不会丢失消息。然而,Kafka 架构和配置的细微差别导致消息的丢失。我们需要了解它如何以及何时可能丢失消息,并防止此类情况的发生。
    的头像 发表于 04-29 17:32 792次阅读
    面试官:<b class='flag-5'>Kafka</b><b class='flag-5'>会</b>丢消息吗?

    Redis流与Kafka相比如何?

    我们先来看看Kafka的基本架构。基本的数据结构是主题。它是一个按时间排序的记录序列,只需追加。使用这种数据结构的好处在Jay Kreps的经典博文The Log中得到了很好的描述。
    的头像 发表于 02-21 16:09 327次阅读
    Redis流与<b class='flag-5'>Kafka</b>相比如何?

    AG32VF-MIPI应用场景

    MIPI接口技术在图像和视频传输中的应用越来越广泛,应用场景也在不断拓展,而不仅限于移动设备。MIPI接口在物联网、智能家居、智能监控、智能电视、智能汽车等领域也得到广泛应用。 MIPI还可
    发表于 01-22 08:56

    kafka基本原理详解

    今天浩道跟大家分享一篇关于kafka相关原理的硬核干货,可以说即使你没有接触过kafka,也可以秒懂,一起看看!
    的头像 发表于 01-03 09:57 776次阅读
    <b class='flag-5'>kafka</b>基本原理详解

    kafka支持哪些消息交付语义?

    在读完kafka官方文档,kafka设计里的消息交付语义一章后,给我的第一印象是内容很抽象,于是草拟和总结了给个副标题,并把相关内容进行了归类;有些生涩的句子,尽量用大白话和举例进行说明,并加入了总结。
    的头像 发表于 12-22 11:27 392次阅读
    <b class='flag-5'>kafka</b>支持哪些消息交付语义?

    如何保证kafka消息不丢失

    如果在简历上写了使用过kafka消息中间件,面试官大概80%的概率问你:"如何保证kafka消息不丢失?"反正我是屡试不爽。
    的头像 发表于 12-19 09:52 600次阅读
    如何保证<b class='flag-5'>kafka</b>消息不丢失

    zookeeper和kafka的关系

    Zookeeper和Kafka是两个不同的开源软件,它们可以在分布式系统中发挥不同的作用。下面我将详细说明它们之间的关系以及它们在分布式系统中的作用。 首先,让我们先介绍一下Zookeeper
    的头像 发表于 12-03 16:39 1343次阅读

    golang中使用kafka的综合指南

    kafka是一个比较流行的分布式、可拓展、高性能、可靠的流处理平台。在处理kafka的数据时,这里有确保处理效率和可靠性的多种最佳实践。本文将介绍这几种实践方式,并通过sarama实现他们。
    的头像 发表于 11-30 11:18 448次阅读

    如何将Kafka使用到我们的后端设计中

    本文介绍了以下内容: 1.什么是Kafka? 2.为什么我们需要使用Kafka这样的消息系统及使用它的好处 3.如何将Kafka使用到我们的后端设计中。 译自timber.io
    的头像 发表于 10-30 14:30 410次阅读
    如何将<b class='flag-5'>Kafka</b>使用到我们的后端设计中

    labview 和 wincc 的区别 使用场景

    labview 和 wincc 的区别 使用场景 都是上位机软件,都可以做监控软件 wincc的名气也比较大 对比的资料较少 写这些文章的人,从自己的从事的行业出发,带有自己的思维 使用的场景 肯定
    发表于 10-27 18:01

    kafka相关命令详解

    kafka常用命令详解
    的头像 发表于 10-20 11:34 706次阅读

    SMT组装工艺流程的应用场景

    工艺流程的应用场景。 01单面纯贴片工艺 应用场景: 仅在一面有需要焊接的贴片器件。 02双面纯贴片工艺 应用场景: A/B面均为贴片元件。 03单面混装工艺 应用场景: A面有贴
    发表于 10-20 10:31

    Kafka架构技术:Kafka的架构和客户端API设计

    Kafka 给自己的定位是事件流平台(event stream platform)。因此在消息队列中经常使用的 "消息"一词,在 Kafka 中被称为 "事件"。
    的头像 发表于 10-10 15:41 715次阅读
    <b class='flag-5'>Kafka</b>架构技术:<b class='flag-5'>Kafka</b>的架构和客户端API设计

    Spring Kafka的各种用法

    最近业务上用到了Spring Kafka,所以系统性的探索了下Spring Kafka的各种用法,发现了很多实用的特性,下面介绍下Spring Kafka的消息重试机制。 0. 前言 原生
    的头像 发表于 09-25 17:04 798次阅读

    kafka client在 spring如何实现

    消息中间件,比如 Kafka、RabbitMq,只需要简单的引入 jar,就可以通过注解+配置快速集成到项目中。 开始一个 Pulsar Starter 既然已经了解了 Apache Pulsar ,又
    的头像 发表于 09-25 11:21 383次阅读
    <b class='flag-5'>kafka</b> client在 spring如何实现