Kafka的前身是由LinkedIn开源的一款产品,2011年初开始开源,加入了 Apache 基金会,2012年从 Apache Incubator 毕业变成了 Apache 顶级开源项目。同时LinkedIn还有许多著名的开源产品。如:
分布式数据同步系统Databus
高性能计算引擎Cubert
Java异步处理框架ParSeq
Kafka流处理平台
Kafka 用于构建实时数据管道和流应用程序。它具有水平可扩展性,容错性,快速性,并在数千家公司的生产环境中运行。
从官方我们可以知道ApacheKafka是一个分布式流媒体平台。这到底是什么意思呢?
流媒体平台有三个关键功能:
发布和订阅记录数据流,类似于消息队列或企业消息传递系统。
有容错能力的可以持久化的存储数据流。
记录发生时可以进行流处理。
Kafka 通常用于两大类应用:
构建可在系统或应用程序之间可靠获取数据的实时流数据管道
构建转换或响应数据流的实时流处理
Kafka 基本概念Producer - 消息和数据的生产者,向 Kafka 的一个 Topic 发布消息的进程/代码/服务。
Consumer - 消息和数据的消费者,订阅数据(Topic)并且处理其发布的消息的进程/代码/服务。
Consumer Group - 逻辑概念,对于同一个 Topic,会广播不同的 Group,一个Group中,只有一个consumer 可以消费该消息。
Broker - 物理概念,Kafka 集群中的每个 Kafka 节点。
Topic - 逻辑概念,Kafka消息的类别,对数据进行区分,隔离。
Partition - 物理概念,分片,Kafka 下数据存储的基本单元,一个 Topic 数据,会被分散存储到多个Partition,每一个Partition是有序的。
Replication - 副本,同一个 Partition 可能会有多个 Replica ,多个 Replica 之间数据是一样的。
Replication Leader - 一个 Partition 的多个 Replica 上,需要一个 Leade r负责该 Partition 上与 Produce 和 Consumer 交互
ReplicaManager - 负责管理当前的 broker 所有分区和副本的信息,处理 KafkaController 发起的一些请求,副本状态的切换,添加/读取消息等。
概念的延伸Partition
每一个Topic被切分为多个Partitions
消费者数据要小于等于Partition的数量
Broker Group中的每一个Broker保存Topic的一个或多个Partitions
Consumer Group中的仅有一个Consumer读取Topic的一个或多个Partions,并且是唯一的Consumer。
Replication
当集群中有Broker挂掉的时候,系统可以主动的使用Replicas提供服务。
系统默认设置每一个Topic的Replication的系数为1,可以在创建Topic的时候单独设置。
Replication特点
Replication的基本单位是Topic的Partition。
所有的读和写都从Leader进,Followers只是作为备份。
Follower必须能够及时的复制Leader的数据
增加容错性与可扩展性。
Kafka 消息结构在 Kafka2.0 中的消息结构如下(整理自官网)。
baseOffset: int64 - 用于记录Kafka这个消息所处的偏移位置
batchLength: int32 - 用于记录整个消息的长度
partitionLeaderEpoch: int32
magic: int8 (current magic value is 2) - 一个固定值,用于快速判断是否是Kafka消息
crc: int32 - 用于校验信息的完整性
attributes: int16 - 当前消息的一些属性
bit 0~2:
0: no compression
1: gzip
2: snappy
3: lz4
bit 3: timestampType
bit 4: isTransactional (0 means not transactional)
bit 5: isControlBatch (0 means not a control batch)
bit 6~15: unused
lastOffsetDelta: int32
firstTimestamp : int64
maxTimestamp: int64
producerId: int64
producerEpoch: int16
baseSequence: int32
records:
length: varint
attributes: int8
bit 0~7: unused
timestampDelta: varint
offsetDelta: varint
keyLength: varint
key: byte[]
valueLen: varint
value: byte[]
Headers => [Header]
headerKeyLength: varint
headerKey: String
headerValueLength: varint
Value: byte[]
关于消息结构的一些释义。
Offset -用于记录Kafka这个消息所处的偏移位置
Length - 用于记录整个消息的长度
CRC32 - 用于校验信息的完整性
Magic - 一个固定值,用于快速判断是否是Kafka消息
Attributes - 当前消息的一些属性
Timestamp - 消息的时间戳
Key Length - key的长度
Key - Key的具体值
Value Length - 值的长度
Value - 具体的消息值
Kafka 优点分布式 - Kafka是分布式的,多分区,多副本的和多订阅者的,基于Zookeeper调度。