Apache Kafka 简介

Apache Kafka

简介

Apache Kafaka 是一个分布式流平台(distributed streaming platform)

流平台有以下三个主要功能:

  • 发布和订阅流中的数据(records),和消息队列或者企业消息系统类似
  • 以容错和持久的方式保存流中的数据
  • 当流中的数据出现时,处理该流中的数据

Kafka主要有两类用途:

  • 构建能让系统或应用之间可靠地获取数据的实时流数据管道
  • 构建转换或响应流数据的实时流应用

为了了解Kafka是如何实现上面的功能,让我们自下而上更深入的探索Kafka的这些能力。

一些关键概念:

  • Kafka以集群的方式运行在一个或多个服务器上,这些服务器可以跨多个数据中心
  • Kafka集群将流的数据(records)保存在名为 topics 的分类(categories)
  • 每条数据由键(Key)、值(Value)和时间戳(Timestamp)组成

Kafka 有四个核心API:

  • Producer API :该接口允许应用发布一个流数据到一个或多个 topics
  • Consumer API :该接口允许应用订阅一个或多个 topics 然后处理这些 topics 中的流数据
  • Streams API :该接口允许应用作为一个 流处理器(stream processor) ,从一个或多个 topics 的输入流中消费数据,然后转换并生产数据到一个或多个 topics 的输出流中
  • Connector API :该接口允许构建和运行可重用的生产者(Producer)或者消费者(Consumer),这些生产者或消费者讲Kafka中的 topics 和现有的应用或者数据系统(如数据库)连接起来。比如一个 connector 可以连接到一个关系型数据库从而可以捕捉到数据表中的任何变化,然后进行响应的处理

这些API的关系如下图:

Apache Kafka Core API

Kafka 使用一种简单、高效、语言无关的 TCP协议 来完成客户端和服务端的数据交换。这是一种版本化并且向后兼容的协议。Kafka 默认提供了 Java 客户端,并且也有大部分其他语言可用的客户端。

Topics 和 Logs

我们首先来看看 Kafka 对流数据 ( a stream of records) 的提供的核心抽象 —— Topic

Topic 是数据被发布到 Kafka 的一个分类。Topics 可以有零个、一个或者多个消费者(Consumers),这些消费订阅(subscribe)被写入 topics 的数据。

对每个 topic, Kafka 集群维护了一个分区的记录(log),如下图所示:

Anatomy of a Topic

每一个分区 (Partition) 都是一个有序的、不可变的数据序列,这些数据被不断的添加到序列的尾部,每个分区都是一种结构化的 提交记录 (commit log)。 在分区中的每一条数据都被赋予了一个连续的数字ID,这个ID叫做 偏移量 (offset) 。 偏移量唯一的标识了每个分区中的每条数据。

Kafka 集群会持久化保存所有被发布到 topics 中的数据(无论这些数据是否已经被消费),数据的保存时间是可以配置的。比如,如果保留周期设置为两天,那么一条数据被发布到 topic 以后,在两天内都是可以被消费的,两天以后会被 Kafka 丢弃以释放磁盘空间。Kafka 的性能在数据大小方面是恒定的,所以长时间的存储数据不是问题。

Anatomy of a Partition

实际上,每个消费者 (Consumer) 唯一保留的数据就是该消费者在记录 (log) 中的偏移量 (offset)。该偏移量由消费者自身控制:一般情况下,消费者会在读取数据的时候线性地增加其偏移量,但实际上,由于偏移量是由消费者自身控制,因此它可以按照自己喜欢的任何顺序来消费数据 (records) 。比如,消费者可以把偏移量重置为以前的位置来重新处理过去的数据,或者跳到最近的数据从“现在”开始消费。

这些功能的组合意味着 Kafka 的消费者非常轻量级,他们可以随意的运行和停止而对集合或其他消费者没有太大影响。比如,你可以使用自带的命令行工具的命令 tail 来获取任何 topic 的内容而不会改变现有的消费者。

记录(Log) 中的分区有几个目的。第一个是允许 Log 扩展到超过适合单个服务器的大小。第二个是每个分区的大小必须合适它所在的服务器,但是一个 topic 可以有许多分区,所以一个 topic 可以有任意数量的数据。

分布式

记录(Log) 的分区分布在 Kafka 集群的服务器中,每个服务器处理数据并向分区的共享发起请求。每个分区都在数量可配置的服务器中进行复制,以实现容错。

每个分区都有一个服务器作为 Leader,其他服务器作为 FollowersLeader 负责处理分区的所有读写请求,Followers 仅仅被动地从 Leader 复制数据。 如果 Leader 挂掉了,其中一个 Followers 会自动变成新的 Leader。每个服务器都扮演某些分区中的 Leader 和某些分区中的 Followers,所以负载在集群中得到了很好的均衡。

Producers

Producers 发布数据到它们选择的 topics 中。 Producer 决定数据放到哪个 topic 的哪个分区(Partition) 中。可以通过流行的 round-robin 来完成,也可以通过某些语义分区功能来实现。

Consumers

Consumers 使用 Consumer group 的名字来标识自己,并且每个发布到 topic 的数据 (record) 都会被传递到每个 consumer group 中的 一个 消费者实例。消费者实例可以在单独的进行中或者在不同的机器中。

  • 如果所有的消费者实例都在同一个 consumer group 中,那么数据将会轮流被组中的消费者消费。
  • 如果所有的消费者实例都在不同的 consumer group 中,那么每一条数据都会被所有的消费者消费,即广播。
Consumer

一个有两个服务器的 Kafka 集群,托管了四个分区(P0 - P3),包含了两个 consumer group,第一个组拥有两个消费者实例,第二个组拥有四个消费者实例。

然而,更常见的是,每个 topic 有少量的 consumer group, 每个组都由许多的消费者实例组成,以实现可伸缩性和容错性。这和传统的“发布-订阅”模式没有什么不同,只不过订阅者不是一个单独的进程,而是一个消费者集群。

在 Kafka 中实现消费的方式是通过在消费者实例划分 Log 中的分区,这样每个实例在任何时间都是“公平等分”的独占消费者。维护消费者组中成员资格的过程是由 Kafka 自己的协议动态处理的。如果有新的实例加入到组中,新的实例将会接管一些其他成员的分区;如果有实例挂掉了,该实例管理的分区将会被分给其他实例。

Kafka 只提供分区中的数据总记录,而不是在不同 topic 不同分区之间的记录。

多用户

Kafka 可以被部署为多用户解决方案。可以通过配置哪些 topic 可以生成或消费数据来启用多用户功能。多用户也支持配额。管理员可以定义和强制执行配额,以控制客户端使用的 broker 资源。

保证

Kafka 提供了以下保证:

  • 生产者发送到某个 topic 分区的消息将按照其发送的顺序依次添加
  • consumer 实例按照它们储存在 log 中的顺序查看数据
  • 对于具有复制因子 N 的 topic,我们会允许最多 N - 1 个服务器故障,而不会丢失任何提交到 log 的数据

Kafka 作为消息系统(消息队列)

Kafka的流概念与传统的企业消息系统相比如何?

消息传统上有两种模型:队列和发布 - 订阅。在队列中,消费者池可以从服务器读取并处理数据个;在发布 - 订阅中,数据被广播给所有消费者。这两种模型中的每一种都有优点和缺点。队列的优势在于它允许在多个消费者实例上处理数据,从而可以扩展数据的处理。但是,队列不是多用户的,一旦一个消费者读取数据,该数据就被使用。发布 - 订阅允许将数据广播到多个订阅者,但由于每条消息都发送给每个订阅者,因此无法进行扩展处理。

Kafka 的消费者组概念概括了传统消息系统的两个概念。与队列一样,消费者组允许将数据处理划分为一组进程。与发布 - 订阅一样,Kafka 允许向多个消费者组广播消息。

Kafka 模型的优势在于每个 topic 都具有这些属性,它可以扩展数据处理并且也是多用户的。

与传统的消息系统相比,Kafka 有更强的顺序保证。

传统队列在服务器上按顺序保留记录,如果多个消费者从队列中消耗,则服务器按照存储顺序分发数据。但是,虽然服务器按顺序分发数据,但是数据是异步传递给消费者的,因此它们可能会在不同的消费者处出现问题。这实际上意味着在存在并行消费的情况下丢失数据的顺序。消息系统通常通过具有“独占消费者”概念来解决这个问题,该概念只允许一个进程从队列中消费数据,这样就没有了并行性。

在 Kafka 中。通过在 topic 中具有并行性概念 分区 ,Kafka 能够在消费者流程池中提供顺序保证和负载均衡。这是通过将 topic 中的分区分配给消费者组中的消费者来实现的,以便每个分区仅由该组中的一个消费者使用。这样,就可以确保消费者是该分区的唯一读取者并按顺序使用数据。由于有许多分区,便可以平衡许多消费者实例的负载。但请注意,消费者组中的消费者实例不能超过分区。

Kafka 作为存储系统

任何允许 发布与消费 消息解耦的消息队列,实际上扮演了一个消息的存储系统。 Kafka的不同之处在于它是一个非常好的存储系统。

写入 Kafka 的数据将写入磁盘并进行复制以实现容错。 Kafka 允许生产者等待确认,以便在完全复制之前写入认为是不完整的,直到数据全部复制到所有服务器上。

Kafka 的磁盘结构很好地使用了伸缩,无论服务器上有50 KB还是50 TB的数据,Kafka 的磁盘性能影响都差不多。

Kafka 是一种专用于高性能,低延迟提交日志(commoit log)存储,复制和传播的专用分布式文件系统。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容

  • 姓名:周小蓬 16019110037 转载自:http://blog.csdn.net/YChenFeng/art...
    aeytifiw阅读 34,522评论 13 425
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,099评论 18 139
  • kafka的定义:是一个分布式消息系统,由LinkedIn使用Scala编写,用作LinkedIn的活动流(Act...
    时待吾阅读 5,234评论 1 15
  • 本文转载自http://dataunion.org/?p=9307 背景介绍Kafka简介Kafka是一种分布式的...
    Bottle丶Fish阅读 5,353评论 0 34
  • 纯英文授课,建构英文思维 中外教,幼儿园阶段3:1,s4阶段2:2,s6阶段纯外教
    书宇YY阅读 309评论 0 0