1 . Kafka简介
Kafka定位是一个分布式流处理平台,具备以下3个特性:
- 能够允许发布和订阅数据
- 存储流数据时提供相应的容错机制
- 流数据到达时能够被及时处理
1.1 Kafka基本概念
-
主题 topic
对消息的分类
-
消息 message
kafka通信的基本单位,
-
分区和副本 Partition Replica
每个主题被分为一个或多个分区,每个分区由一系列有序、不可变的消息组成,是一个有序队列。每个分区在物理上对应一个文件夹,命名规则(topic-0,topic-1,topic-2)。
每个分区有一个至多个副本。副本分布在集群的不同代理上,以提高可用性。
分区使得kafka在并发处理上更加容易,分区数越多,吞吐量越高。分区也是保证消息被顺序消费以及对消息进行负载均衡的基础。
-
Leader副本和Follower副本
kafka会选择该分区的一个副本作为leader副本,该分区的其他副本为Follower副本,只有leader副本才处理客户端的读写请求,Follower副本从leader副本同步数据。保证了数据的一致性和有序性。如果leader失效,通过选举算法从其他Follower副本中选出新的leader副本
-
偏移量 offset
发布到分区的消息会被直接追加到日志文件(分区目录下以
.log
后缀的数据文件)的尾部,每条消息在日志文件中的位置都会对应一个按序递增的偏移量。消费者可用过控制偏移量来对消息进行消费。旧版消费者将offset保存在zookeeper中,新版消费者保存在kafka内部的一个主题中,消费者也可以自己在外部系统保存offset。
-
日志段 logsegment
一个日志被划分为多个日志段,日志段是kafka日志对象分片的最小单位。一个日志段对应磁盘上一个具体日志文件和两个索引文件。
日志文件(
.log
)保存消息实际数据。两个索引文件(.index 和.timeindex
),分别表示消息偏移量索引文件和消息时间戳索引文件。 -
代理 Broker
kafka集群由一个或者多个kafka实例构成,每个kafka实例称为代理(Broker)。每个broker有一个唯一id(非负整数,配置中broker.id的值)。
-
生产者
发消息给broker
-
消费者和消费者组 consumer 和 consumer group
以pull方式拉数据。每一个消费者属于一个特定消费组,groupid代表消费组名称,通过group.id配置。如果没有指定消费组,则该消费者属于默认消费组test-consumer-group。
每个消费者通过配置项client.id设置唯一id,如果客户端没有指定clientid,kafka会为client自动生成一个唯一id。
同一个topic的一条消息只能被同一个消费组下某一个消费组消费。
-
ISR (In-sync Replica)
kafka在zookeeper中动态维护一个ISR,即保存同步的副本列表,保存了与leader副本保存消息同步的所有副本对应的代理节点id。如果一个Follower副本宕机或是落后太多,将从ISR中被移除。
-
Zookeeper
kafka
使用zookeeper
保存相应元数据信息。包括代理节点信息、kafka集群信息、旧版消费者信息及其消费偏移量信息、主题信息、分区状态信息、分区副本分配方案信息、动态配置信息等。
1.2 kafka设计
特性:
-
消息持久化
使用文件系统存储数据。顺序追加。
-
高吞吐量
kafka
将数据写到磁盘,充分利用磁盘的顺序读写。同时,kafka
在数据写入及数据同步采用了零拷贝(zero-copy
)技术,采用sendFile()
函数调用,在两个文件描述符之间直接传递数据,完全在内核中操作,从而避免了内核缓冲区与用户缓冲区之间数据的拷贝,操作效率极高。kafka还支持数据压缩以及批量发送,同时将每个主题划分为多个分区,这一系列优化是的kafka具有很高的吞吐量。
-
扩展性
依赖
zookeeper
对集群进行协调管理,更加容易进行水平扩展。在机器扩展期间无需将整个集群停机,集群自动感知,重新进行负载均衡和数据复制。 多客户端支持
-
kafka streams
在0.10之后版本中引入
kafka streams
。是一个用java实现的用于流处理的jar
文件。 -
安全机制
通信时数据加密
-
数据备份
副本
-
轻量级
broker
无状态,不记录消息是否被消费,offset
交给消费者或者组协调器管理 -
消息压缩
提高吞吐量
1.3 kafka应用场景
消息系统
-
应用监控
kafka+ELK
整合构建应用服务监控系统 -
网站用户行为追踪
kafka+hadoop+spark+strom
进行数据分析处理 流处理(
kafka streams
)-
持久性日志
kafka+hdfs+Flume