0. 背景
本文简述 kafka 的相关内容。
1. 简介
Kafka 是一种高吞吐量的分布式发布订阅消息系统。
有如下特性:
- 稳定性能:以时间复杂度为O(1)的磁盘数据结构提供消息的持久化,即使TB量级的消息存储也能够保持长时间的稳定性能。
- 高吞吐量: 即使是非常普通的硬件Kafka也可以支持每秒数百万的消息。
- 集群: 支持通过Kafka服务器和消费机集群来分区消息。
官方口号:
Kafka 用于构建实时的数据管道和流式的app。它可以水平扩展,高可用,速度快,并且已经运行在数千家公司的生产环境。
简单理解就是:
- 消息队列(管道)
- 流
- 水平扩展
藉由消息队列和流的特性,Kafka适合什么样的应用场景?
Kafka 适用的场景:
- 消息队列特性:构造实时流数据管道,它可以在系统或应用之间可靠地获取数据。
- 流式应用特性:构建实时流式应用程序,对这些流数据进行转换或者影响。
流式应用特性就是流处理,通过kafka stream topic和topic之间内部转换。简单理解就是:
生产者 >--输入流--> | Kafka流应用(处理输入流,写到输出流) | >--输出流---> 消费者
主要能力:
(1) 发布 & 订阅
可以让你发布和订阅流式的记录。这一方面与消息队列或者企业消息系统类似。(2) 流处理
编写可扩展的流处理应用程序,可以在流式记录产生时就进行处理。(3) 流式的记录存储
可以储存流式的记录,并且有较好的容错性。它以安全的方式将流式的数据存储在一个分布式,有副本备份,容错的集群。
后面我们会介绍这三种能力对应的场景,现在让我们了解一些基本概念。
2. 基本概念
一些概念:
- Kafka作为一个集群,运行在一台或者多台服务器上.
- Kafka 通过 topic 对存储的流数据进行分类。
- 每条记录中包含一个key,一个value和一个timestamp(时间戳)。
Kafka有四个核心的API:
- The Producer API :允许应用程序发布流式的数据到 topic。
- The Consumer API :允许应用程序订阅 topic ,和对流式数据进行处理。
- The Streams API :允许应用程序作为一个流处理器,消费topic产生的输入流,进行有效的转换,然后生产输出流到topic中去。
- The Connector API :允许构建生产者或者消费者,将Kafka topics连接到已存在的应用程序或者数据系统。比如,连接到关系型数据库,监控 表(table)的所有变更内容。
Topics 和 记录集
Topic(主题)
流式的记录集是kafka的核心概念, 即 topic。
Topic 就是 主题,是 数据记录集 发布的地方, 可以用来区分业务系统。
Kafka中的Topics总是多订阅者模式,一个topic可以拥有一个或者多个消费者来订阅它的数据。
分区(Partition)
对于每一个topic, Kafka集群都会维持一个分区(Partition),如下所示:
追加到文件
每个分区都是有序且顺序不可变的记录集,并且不断地追加到结构化的记录文件中。
偏移量(offset)
分区中的每一个记录都会分配一个id号来表示顺序,我们称之为offset,offset用来唯一的标识分区中每一条记录。
存活期限 (retention period)
Kafka 集群保留所有发布的记录(无论他们是否已被消费),并通过一个可配置的存活期限来控制.。比如, 如果存活策略设置为2天,一条记录发布后2天内,可以随时被消费,两天过后这条记录会被抛弃并释放磁盘空间。
Kafka的性能和数据大小无关,所以长时间存储数据没有什么问题.
在每一个消费者中唯一保存的是offset(偏移量), 即消费到的记录偏移的位置。
偏移量由消费者所控制: 在读取记录后,消费者会以线性的方式增加偏移量。
实际上,由于这个位置由消费者控制,所以消费者可以采用任何顺序来消费记录。例如,一个消费者可以重置到一个旧的偏移量,从而重新处理过去的数据;也可以从"现在"开始消费。
这些细节说明Kafka 消费者是非常廉价的—消费者的增加和减少,对集群或者其他消费者没有多大的影响。
分布式
Partition(分区)有以下几个用途:
- 第一,当日志大小超过了单台服务器的限制,方便日志进行扩展。一个主题可能有多个分区,因此可以处理无限量的数据。
- 第二,可以作为并行的单元集
分区(partition)的特点:
- 分区 可以分布 在Kafka集群的服务器上。
- 每个服务器在处理数据和请求时,共享这些分区。
- 每个分区都会在已配置的服务器上进行备份,确保容错性.
分区的 leader 与 宕机后选举
- 每个分区都有一台 server 作为 “leader”,零台或者多台server作为 follwers 。
- leader server 处理一切对 partition (分区)的读写请求,而follwers只需被动的同步leader上的数据。
- 当leader宕机了,followers 中的一台服务器会自动成为新的 leader。
- 每台 server 都会成为某些分区的 leader 和某些分区的 follower,因此集群的负载是平衡的。
生产者
生产者可以将数据发布到所选择的topic(主题)中。生产者负责将记录分配到topic的哪一个 分区中。
生产时负载均衡
- 可以使用循环的方式来简单地实现负载均衡
- 也可以根据某些语义分区函数(例如:记录中的key)来完成。
消费者
消费者使用一个 消费组 名称来进行标识,发布到topic中的每条记录被分配给订阅消费组中的一个消费者实例.消费者实例可以分布在多个进程中或者多个机器上。
- 如果所有的消费者实例在同一消费组中,消息记录会负载平衡到每一个消费者实例.
- 如果所有的消费者实例在不同的消费组中,每条消息记录会广播到所有的消费者进程.
保证
high-level Kafka给予以下保证:
- 生产者 发送到特定分区的消息将按照发送顺序处理。
- 一个消费者实例按照日志中的顺序查看记录.
- 对于具有N个副本的主题,我们最多容忍N-1个服务器故障,从而保证不会丢失。
4. kafka 应用
kafka 可以作为 消息系统,存储系统,流处理,它和这些传统的系统相比,也有其自身的特性,下面逐一讨论。
4.1 Kafka作为消息系统
传统的消息系统
传统的消息系统有两个模块: 队列 和 发布-订阅。
(1)在队列中,消费者从消息队列读取消息记录,每条记录被一个消费者消费;
(2)在发布订阅中,记录被广播到所有的消费者。
两者均有优缺点:
(1) 队列的优点在于它允许你将处理数据的过程分给多个消费者实例,使你可以扩展处理过程。 缺点是:一旦一个进程读取了数据,数据就会被丢弃。
(2)而发布-订阅系统允许你广播数据到多个进程,但是无法进行扩展处理,因为每条消息都会发送给所有的订阅者。
消费组在Kafka有两层概念
- 在队列中,消费组允许你将处理过程分发给一系列进程(消费组中的成员)。
- 在发布订阅中,Kafka允许你将消息广播给多个消费组。
Kafka的优势在于:每个topic都有可以扩展处理
并且允许多订阅者模式(不只选其中一个).
Kafka 比传统消息队列有更严格的顺序保证
传统队列在服务器上保存着有序的记录,如果多个消费者消费队列中的数据, 服务器将按照存储顺序输出记录。 记录被
异步传递给消费者, 因此记录可能会无序的到达不同的消费者
。在并行消费的情况下, 记录的顺序是丢失的。因此消息系统通常使用“唯一消费者”的概念,即只让一个进程从队列中消费, 但这就无法并行处理。Kafka 设计的更好。topic中的partition是一个并行的概念。 Kafka通过将topic中的不同 partition 分配给消费者组中的消费者来提供顺序保证和负载平衡, 以便
每个分区由消费组中的一个消费者消费
。
通过这样,我们能够确保消费者是该分区的唯一读者,并按顺序消费数据。 众多分区保证了多个消费者实例间的负载均衡。但请注意,消费者组中的消费者实例个数不能超过分区的数量。
4.2 Kafka作为存储系统
(1)写入,备份,确保继续写入
数据写入Kafka后被写到磁盘,并且进行备份以便容错。直到完全备份,Kafka才让生产者认为完成写入,即使写入失败Kafka也会确保继续写入。
(2)扩展性
Kafka使用磁盘结构,具有很好的扩展性—50kb和50TB的数据在server上表现一致。
(3)可以存储大量数据
可以存储大量数据,并且可通过客户端控制它读取数据的位置。
您可认为Kafka是一种高性能、低延迟、具备日志存储、备份和传播功能的分布式文件系统。
4.3 Kafka作为流处理
Kafka 流处理不仅仅用来读写和存储流式数据,它最终的目的是为了能够进行实时的流处理。
在Kafka中,“流处理器
” 不断地从 “输入的topic
” 获取流数据,处理数据后,再不断将“产生的流数据
” 写入到 “输出的topic
” 中去。
例如,零售应用程序可能会接收销售和出货的输入流,经过价格调整计算后,再输出一串流式数据。
简单的数据处理可以直接用生产者和消费者的API。对于复杂的数据变换,Kafka提供了Streams API。 Stream API 允许应用做一些复杂的处理,比如将流数据聚合或者join。
4.4 总结
一般来说,我们可能已经有了很多的历史数据,同时又要处理存储新来的数据,和准备持续处理未来的数据。
流式应用程序
通过低延迟订阅和组合存储,流式应用程序可以以同样的方式处理过去和未来的数据。 一个单一的应用程序可以处理历史记录的数据,并且可以持续不断地处理以后到达的数据,而不是在到达最后一条记录时结束进程。 这是一个广泛的流处理概念,其中包含批处理以及消息驱动应用程序。
低延迟
作为流数据管道,能够订阅实时事件使得Kafk具有非常低的延迟;
组合存储
同时Kafka还具有可靠存储数据的特性,可用来存储重要的支付数据, 或者与离线系统进行交互,系统可间歇性地加载数据,也可在停机维护后再次加载数据。
总结就是:“kafka 具有对数据批处理的能力”
5. 参考
官网
http://kafka.apache.org/
中文
http://kafka.apachecn.org/
https://www.cnblogs.com/qingyunzong/p/9004509.html
https://www.jianshu.com/p/430454d9e30b