LinkedIn开源项目
分布式数据同步系统Databus
高性能计算引擎Cubert
Java异步处理框架ParSeq
Kafka流处理平台
Kafka流处理平台
LinkedIn开发
2011年初开源,加入Apache基金会
2012年从Apache Incubator毕业
Apache顶级开源项目
Streaming platform has three key capabilities:
◆ Publish and subscribe to streams of records, similar to a message queue or enterprise messaging system.
◆ Store streams of records in a fault-tolerant durable way.
◆ Process streams of records as they occur.
Kafka is generally used for two broad classes of applications:
◆ Building real-time streaming data pipelines that reliablyget data between systems or applications
◆ Building real-time streaming applications that transformor react to the streams of data
用在数据的处理上;用在数据的传输上
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上,需要一个Leader负责该Partition上与Producer与Consumer交互
ReplicaManager:负责管理当前broker所有Partition和Replica的信息,处理KafkaController发起的一些请求,副本状态的切换、添加、读取信息等
Kafka概念沿伸
Partition:
(1)每一个Topic被切分为多个Partitions
(2)消费者数目少于或等于(<=)Partition的数目
(3)Broker Group中的每一个Broker保存Topic的一个或多个Partitions
(4)Consumer Group中仅有一个Consumer读取Topic的一个或多个Partitions,并且是唯一的Consumer
Replication:
(1)当集群中有Broker挂掉的情况,系统可以主动地使用Replicas提供服务
(2)系统默认设置每一个Topic的replication系数为1,可以在创建Topic时单独设置
Replication特点:
(1)Replication的基本单位是Topic的Partition
(2)所有的读和写都从Leader进,Followers只是作为备份
(3)Follower必须能够及时复制Leader的数据
(4)增加容错性与可扩展性
Kafka基本结构
Producer API
Consumer API
Streams API
Connectors API
Kafka消息结构
Offset:当时消息在队列中所处的偏移位置
Length:记录消息的长度
CRC32:校验信息的完整性
Magic:固定的数据,判断是否为Kafka的消息数据
Attributes:可选
Timestamp:时间戳
Kafka的特点
分布式
多分区、多副本、多订阅者、基于ZooKeeper调度
高性能
高吞吐量、低延迟、高并发、时间复杂度为O(1)
持久性与扩展性
数据可持久化、容错性、支持在线水平扩展、消息自动平衡
消息自动平衡:服务端消息消费的平衡(避免出现热点问题),在消费者订阅时进行一个连接的平衡
Kafka应用场景
消息队列(可重复消费)
行为跟踪(实时)
元信息监控
日志处理
流处理
事件源(回溯)
持久性日志(commit log)
Kafka简单案例
主要包括:环境启动、简单生产者、简单消费者
下载与安装
Zookeeper下载:
http://zookeeper.apache.org/releases.html#download
Kafka下载:http://kafka.apache.org/downloads
安装:解压,配置环境变量
Mac便捷安装:brew install kafka
Kafka代码案例
基础代码
https://github.com/AnAngryMan/KafkaSimpleExample
Kafka高级特性之消息事务
为什么要支持事务
满足“读取-处理-写入”模式
流处理需求的不断增强
不准确的数据处理的容忍度降低(对数据处理的准确性要求提高)
数据传输的事务定义
最多一次:消息不会被重复发送,最多被传输一次,但也有可能一次不传输。
最少一次:消息不会被漏发送,最少被传输一次,但也有可能被重复传输
精确的一次(Exactly once):不会漏传输也不会重复传输,每个消息都传输被一次而且仅仅被传输一次,这是大家所期望的。
事务保证
内部重试问题:Procedure幂等处理
多分区原子写入
事务保证一避免僵尸实例
(1)每个事务Producer分配一个transactional.id,在进程重新启动时能够识别相同的Producer实例
(2)Kafka增加了一个与transactional.id相关的epoch,存储每个transactional.id内部元数据
(3)一旦epoch被触发,任何具有相同的transactional.id和更旧的epoch的Producer被视为僵尸,Kafka会拒绝来自这些Procedure的后续事务性写入
Kafka高级特性之零拷贝
零拷贝简介
网络传输持久性日志块
Java Nio channel.transforTo()方法
Linux sendfile系统调用
文件传输到网络的公共数据路径
(1)操作系统将数据从磁盘读入到内核空间的页缓存(第一次拷贝)
(2)应用程序将数据从内核空间读入到用户空降缓存中(第二次拷贝)
(3)应用程序将数据写回到内核空间的socket缓存中(第三次拷贝)
(4)操作系统将数据从socket缓冲区复制到网卡缓冲区,以便将数据经网络发出(第四次拷贝)
零拷贝过程
【零拷贝:内核空间与用户空间的交互拷贝为0次】
(1)操作系统将数据从磁盘读入到内核空间的页缓存(第一次拷贝)
(2)将数据的位置和长度的信息的描述符增加至内核空间(socket缓冲区)
(3)操作系统将数据从内核拷贝到网卡缓冲区,以便将数据经网络发出(第二次拷贝)