Kafka简介
摘自:http://mp.weixin.qq.com/s/pOiXJBqrC5MJe-AskXKOJQ
概念
Kafka是什么
最早是由 LinkedIn 开源出来的分布式消息系统,现在是Apache旗下的一个子项目,并且已经成为开源领域应用最广泛的消息系统之一。0.10版本之后,Kafka提供了连接器与流处理的能力,它也从分布式的消息系统逐渐成为一个流式的数据平台。
特性
- 通过O(1)的磁盘数据结构提供消息的持久化,这种结构对于即使数以TB的消息存储也能够保持长时间的稳定性能。
- 高吞吐量:即使是非常普通的硬件Kafka也可以支持每秒数百万的消息。
- 支持Kafka Server间的消息分区,及分布式消费,同时保证每个Partition内的消息顺序传输。
- 同时支持离线数据处理和实时数据处理.
- Scale out:支持在线水平扩展
作为一个流式数据平台的Kafka
作为一个流式数据平台,最重要的是要具备下面 3 个特点:
- 类似消息系统,提供事件流的发布和订阅,即具备数据注入功能
- 存储事件流数据的节点具有故障容错的特点,即具备数据存储功能
- 能够对实时的事件流进行流式地处理和分析,即具备流处理功能
消息系统
- 队列模式(也叫作点对点模式)。多个消费者读取消息队列,每条消息只发送给一个消费者。
- 发布订阅模式(pub/sub)。多个消费者订阅主题,主题的每条记录会发布给所有的消费者。
- Kafka 使用消费组(consumer group)统一了上面两种消息模型。Kafka 使用队列模型时,它可以将处理工作平均分配给消费组中的消费者成员;使用发布订阅模式时,它可以将消息广播给多个消费组。采用多个消费组结合多个消费者,既可以线性扩展消息的处理能力,也允许消息被多个消费组订阅。
存储系统
数据写入到 Kafka 集群的服务器节点时,还会复制多份来保证出现故障时仍能可用。为了保证消息的可靠存储,Kafka 还允许生产者的生产请求在收到应答结果之前,阻塞式地等待一条消息,直到它完全地复制到多个节点上,才认为这条消息写入成功。
流处理系统
Kafka 流处理(Kafka Streams)为开发者提供了完整的流处理API,比如流的聚合、连接、各种转换操作。同时,Kafka 流处理框架内部解决很多流处理应用程序都会面临的问题:处理乱序或迟来的数据、重新处理输入数据、窗口和状态操作等。
优势
传统消息系统的流处理通常只会处理订阅动作发生之后才到达的新消息,无法处理订阅之前的历史数据。分布式文件存储系统一般存储静态的历史数据,对历史数据的处理一般采用批处理的方式。现有的开源系统很难将这些系统无缝地整合起来,Kafka 则将消息系统、存储系统、流处理系统都组合在一起,构成了以 Kafka 为中心的流式数据处理平台。它既能处理最新的实时数据,也能处理过去的历史数据。
核心API
Kafka的基本概念
分区模型
Kafka 集群为每个主题维护了分布式的分区(partition)日志文件,物理意义上可以把主题看作分区的日志文件(partitioned log)。每个分区都是一个有序的、不可变的记录序列,新的消息会不断追加到提交日志(commit log)。分区中的每条消息都会按照时间顺序分配到一个单调递增的顺序编号,叫作偏移量(offset),这个偏移量能够唯一地定位当前分区中的每一条消息。
Kafka 的消费者消费消息时,只保证在一个分区内消息的完全有序性,并不保证同一个主题中多个分区的消息顺序。而且,消费者读取一个分区消息的顺序和生产者写入到这个分区的顺序是一致的。
如果业务上需要保证所有消息完全一致,只能通过设置一个分区完成,但这种做法的缺点是最多只能有一个消费者进行消费。一般来说,只需要保证每个分区的有序性,再对消息加上键来保证相同键的所有消息落入同一个分区,就可以满足绝大多数的应用。
消费模型
消息的消费模型有两种:推送模型(push)和拉取模型(pull)。基于推送模型的消息系统,由消息代理记录消费者的消费状态。消息代理在将消息推送到消费者后,标记这条消息为已消费,但这种方式无法很好地保证消息的处理语义。
Kafka 采用拉取模型,由消费者自己记录消费状态,每个消费者互相独立地顺序读取每个分区的消息。优点是:消费者可以按照任意的顺序消费消息。
分布式模型
Kafka 每个主题的多个分区日志分布式地存储在 Kafka 集群上,同时为了故障容错,每个分区都会以副本的方式复制到多个消息代理节点上。其中一个节点会作为主副本(Leader),其他节点作为备份副本(Follower,也叫作从副本)。主副本会负责所有的客户端读写操作,备份副本仅仅从主副本同步数据。当主副本出现故障时,备份副本中的一个副本会被选择为新的主副本。