简介
原文:http://kafka.apache.org/intro.html
Apache Kafka是一个分布式的流式计算平台。这到底是什么意思?
一个流式计算平台应该有3个关键特性:
- 发布和订阅数据流,类似于一个消息队列或者企业消息系统;
- 以容错的持久化方式存储数据流;
- 产生数据流时处理流数据;
Kafka通常应用于以下两大类应用程序:
- 构建实时的数据流管道,这种数据流管道能够可靠地在系统和应用之间传输数据;
- 构建实时的数据流应用程序,这种应用程序能够转换以及响应数据流;
要理解Kafka是如何做到这些事情的,让我们从底层深入理解和探索Kafka的能力。
首先,有一些概念:
- Kafka是以集群的方式运行的,集群由一个或者多个服务器组成,这些服务器可以跨越多个数据中心;
- Kafka是以分类的方式存储流数据的,这个分类就叫做主题(Topic);
- 数据中的每一个记录(Record)由key,value和timestamp三者组成;
Kafka有4个核心的APIs:
- 生产者API(Producer API):允许应用发布(Publish)数据流到一个或者多个主题(Topic);
- 消费者API(Consumer API):允许应用订阅(Subscribe)一个或者多个主题(Topic),同时处理发布到这些主题的流数据;
- 流处理API(Streams API):允许应用程序作为一个流处理器,一个流处理器消费一个或多个主题的数据,然后输出处理后的数据到一个或者多个主题。效果就等同于将输入流转换后发布到输出流;
- 连接器API(Connector API):允许构建可重复使用的生产者或者消费者,这些生产者、消费者将Kafka主题连接到已有应用或数据系统。例如,一个连接到关系型数据库的连接器,可能会捕获一张表的所有数据变动;
Kafka的客户端和服务器连接使用一个简单的、高性能的、语言中立的TCP协议(TCP Protocol)。这个协议是版本化的,同时兼容老版本的协议。我们提供了一个Java版本的Kafka客户端,同时也有其他语言的客户端。
主题和日志
让我们首先深入理解Kafka提供的对数据流的核心抽象–主题。
主题就是数据被发布到的一个分类或者Feed Name。Kafka的主题永远都是被多订阅的,意思就是一个主题可以被零个、一个或多个消费者订阅。
对于每一个主题来说,Kafka集群会为其维护一个分区日志,如下所示:
每一个分区都是一个有序的、不可改变的数据记录序列,数据被持续地附加到这个结构化的日志文件。分区中的每一个数据记录都会被分配一个id序列号,称之为偏移量(offset),这个序列号(偏移量)唯一标识了同一个分区中的数据记录。
Kafka集群使用一个可配置的保留周期持久化所有已发布的数据–不管这些数据是否已经被消费。例如,如果保留策略设置为2天,那么在数据发布到主题后的两天内,这些数据都是可以被消费的,2天之后,这些数据就会被丢弃以释放磁盘空间。Kafka的性能在日志数据大小方面实际上是常数级的,因此保留长时间的日志数据是没有问题的。
实际上,对于每一个消费者为其维护的唯一元数据就是消费者在日志文件中的偏移量或者位置。这个偏移量是被消费者所控制的:通常当一个消费者读取数据时它会线性地增加这个偏移量,但是,事实上消费者可以按照任意它所喜好的顺序来消费数据,因为这个偏移量是由这个消费者控制的。例如,一个消费者可以将偏移量设置到过去的某个位置重新处理老数据或者跳过所有的数据到最新的数据位置然后从“现在”开始消费。
这些特性组合到一起决定了Kafka的消费者是非常轻量级的–消费者可以随时的加入和离开而不会对集群和其他消费者产生过多的影响。例如,你可以使用我们提供的命令行工具“tail”任意一个主题的内容而不会改变已有消费者所消费的内容。
分区日志有多个用处,首先让整体日志文件大小可以突破单机磁盘限制。这是因为,虽然每一个分区日志文件不能超过持有它的物理机磁盘空间大小,但是一个主题可以由无数多个分区组成,因此一个主题可以处理任意大小的数据。其次,分区是并发度的单位–接下来会有更多关于并发度的讲解。
分布式
日志的分区分布于Kafka集群的多个服务器上。每个分区都可以根据配置复制多份分布到集群中,用于容错。每个分区都有一个服务器作为“Leader”,有零个或者多个服务器作为“Follower”。Leader处理所有的针对这个分区的读写请求,所有的Follower都主动地复制Leader。如果Leader挂了,会自动从Follower中重新选取一个作为新的Leader。集群中的每一个服务器作为一些分区的Leader同时也作为其他分区的Follower,因此在整个集群中负载都分配的很好。
跨地域复制
Kafka的MirroMaker为集群提供了跨地域复制支持。使用MirrorMaker,数据可以在不同的数据中心或者云区域间复制。你可以在主动/被动方案中使用它备份和恢复数据;或者在主动/主动方案中使数据更接近用户,或者支持数据位置要求。