一、简介
Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因素。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。 对于像Hadoop一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。Kafka的目的是通过Hadoop的并行加载机制来统一线上和离线的消息处理,也是为了通过集群来提供实时的消息。
二、名词解释
- Producer:消息和数据的生产者,向Kafka的一个topic发布消息的进程/代码/服务
- Consumer:消息和数据的消费者,订阅数据(Topic)并且处理其发布的消息的进程/代码/服务
- Consumer Group:逻辑概念,对于同一个topic,会广播给不同的group,一个group中,只有一个consumer可以消费该消息
- Broker:物理概念,Kafka集群中的每个Kafka节点
- Topic:逻辑概念,Kafka消息的类别,对数据进行区分、隔离
- Partition:物理概念,Kafka下数据存储的基本单元。一个Topic数据会被分散存储到多个Partition,每一个Partition是有序的
1)每一个Topic被切分为多个Partitions
2)消费者数目少于或等于Partition的数目
3)Broker Group中的每一个Broker保存Topic的一个或多个Partitions
4)Consumer Group中的仅有一个Consumer读取Topic的一个或多个Partitions,并且是唯一的Consumer
- Replication:同一个Partition可能会有多个Replication,多个Replication之间数据是一样的
1)当集群中有Broker挂掉的情况,系统可以主动地使Replication提供服务
2)系统默认设置每一个Topic的replication系数为1,可以在创建Topic时单独设置
3)Replication的基本单位时Topic的Partition
4)所有的读和写都从Leader进,Followers只是作为备份
5)Follower必须能够及时复制Leader的数据
- Replication Leader:一个Partition的多个Replication上,需要一个Leader负责该Partition上与Producer和Consumer交互
- ReplicationManager:负责管理当前broker所有分区和副本的信息,处理KafkaController发起的一些请求,副本状态的切换、添加/读取消息等
三、基本结构
一个典型的Kafka集群中包含若干Producer(可以是web前端FET,或者是服务器日志等),若干broker(Kafka支持水平扩展,一般broker数量越多,集群吞吐率越高),若干ConsumerGroup,以及一个Zookeeper集群。Kafka通过Zookeeper管理Kafka集群配置:选举Kafka broker的leader,以及在Consumer Group发生变化时进行rebalance,因为consumer消费kafka topic的partition的offsite信息是存在Zookeeper的。Producer使用push模式将消息发布到broker,Consumer使用pull模式从broker订阅并消费消息。
四、Kafka消息事务
数据传输的事务定义
- 最多一次:消息不会被重复发送,最多被传输一次,但也有可能一次不传输
- 最少一次:消息不会被漏发送,最少被传输一次,但也有可能被重复传输
- 精确的一次(Exactly once):不会漏传输也不会重复传输,每个消息都被传输一次而且仅仅被传输一次,这是大家所期望的
事务保证
- 内部重试问题:Procedure幂等处理
- 多分区原子写入
保证-避免僵尸实例
- 每个事务Producer分配一个transactional.id,在进程重新启动时能够识别相同的Producer实例
- Kafka增加了一个与transactional.id相关的epoch,存储每个transactional.id内部元数据
- 一旦epoch被触发,任何具有相同的transactional.id和更旧的epoch的Producer被视为僵尸,Kafka会拒绝来自这些Procedure的后续事务性写入