Kafka介绍
最初由LInkedin开发,分布式,分区,多副本,多生产者,多订阅者,基于zookeeper协调的分布式日志系统
kafka消息传递模式:发布订阅模式。主要的消息传递模式:点对点传递模式、发布-订阅模式
消息分推、拉两种模式。Kafka只有消息的拉取,没有推送,可以通过轮询实现消息的推送。
- Kafka在⼀个或多个可以跨越多个数据中⼼的服务器上作为集群运⾏。
- Kafka集群中按照主题分类管理,⼀个主题可以有多个分区,⼀个分区可以有多个副本分区。
- 每个记录由⼀个键,⼀个值和⼀个时间戳组成。
优势
- 高吞吐量,每秒处理几十上百万消息
- 高性能,单节点支持上千个客户端
- 持久化数据存储
- 分布式系统
- 可靠性
- 客户端状态维护
应用场景
- 日志收集
- 消息中间件
- 流式处理
- 用户活动跟踪
基本架构
主题分区
主题可以被分为若⼲分区,⼀ 个主题通过分区分布于Kafka集群中,提供了横向扩展的能⼒。
# 创建主题
kafka-topics.sh --zookeeper localhost:2181/myKafka --create --topic
topic_1 --partitions 1 --replication-factor 1
# 查看指定主题的详细信息
kafka-topics.sh --zookeeper localhost:2181/myKafka --describe --topic
topic_1
# 开启⽣产者
kafka-console-producer.sh --topic topic_1 --broker-list localhost:9020
# 开启消费者
kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic
topic_1
副本
- 首领副本,每个分区都有⼀个⾸领副本。为了保证⼀致性,所有⽣产者请求和消费者请求都会经过这个副本。
- 跟随者副本,跟随者副本不处理来⾃客户端的请求,它们唯⼀的任务就是从⾸领那⾥复制消 息,保持与⾸领⼀致的状态。
HW
HW是High Watermak的缩写, 俗称⾼⽔位,它表示了⼀个特定消息的偏移量(offset),消费之只能拉取到这 个offset之前的消息。
高级特性
消息发送
生产端:
- 创建Sender线程
- 生产的消息经过 拦截器,序列化器,分区器,缓存在RecordAccumulator缓冲区
- 批次发送满足 缓冲区数据大小达到 batch.size或者 linger.ms(时间)达到上限
- 发送到broker指定分区,落盘。失败重试
- 落盘成功,返回生产元数据给生产者
分区器
- 如果record提供了分区号,则使⽤record提供的分区号
- 如果record没有提供分区号,则使⽤key的序列化后的值的hash值对分区数量取模
- 如果record没有提供分区号,也没有提供key,则使⽤轮询的⽅式分配分区号。
拦截器
拦截器的顺序 1,2,3 返回的顺序也是 1,2,3 区别于 Servlet的返回顺序
位移提交
Consumer向kafka 记录自己的位移数据,偏移量存储在 __consume_offsets 主题
同步提交
- 阻塞Consumer,直到broker返回结果
异步提交
- 异步提交不会自动重试
重平衡
- 消费者成员变更
- 主题分区的数量变更
- 订阅的主题发生变化,消费者使用正则表达式订阅主题
消费者
Leader 分区负责读写,Follower 分区负责同步 Leader分区的消息
Follower分ISR(与Leader分区数据一致),OSR(落后于Leader分区)。
- Leader分区宕机,ISR集合中随机挑选一个成为Leader
- ISR副本都宕机,
- 等待ISR副本恢复
- 选择OSR复本,会造成数据丢失
分区分配策略
默认采用RangeAssignor分配算法
-
RangeAssignor
7个分区,2个消费者,【1,4】分给消费者1,【5,7】分给消费者2
轮询
-
Sticky
仅对消费者宕机影响的分区,重新分配给其他消费者
Kafka速度快是因为:
- partition顺序读写,充分利⽤磁盘特性,这是基础;
- Producer⽣产的数据持久化到broker,采⽤mmap⽂件映射,实现顺序的快速写⼊;
- Customer从broker读取数据,采⽤sendfile,将磁盘⽂件读到OS内核缓冲区后,直接转到socket buffer进⾏⽹络发送。
控制器
- Kafka使⽤ Zookeeper 的分布式锁选举控制器,并在节点加⼊集群或退出集群时通知控制器
- 控制器负责在节点加⼊或离开集群时进⾏分区Leader选举。
- 控制器使⽤epoch来避免“脑裂”。 “脑裂”是指两个节点同时认为⾃⼰是当前的控制器。