Kafka

Kafka介绍

最初由LInkedin开发,分布式,分区,多副本,多生产者,多订阅者,基于zookeeper协调的分布式日志系统

kafka消息传递模式:发布订阅模式。主要的消息传递模式:点对点传递模式、发布-订阅模式

消息分推、拉两种模式。Kafka只有消息的拉取,没有推送,可以通过轮询实现消息的推送。

  1. Kafka在⼀个或多个可以跨越多个数据中⼼的服务器上作为集群运⾏。
  2. Kafka集群中按照主题分类管理,⼀个主题可以有多个分区,⼀个分区可以有多个副本分区。
  3. 每个记录由⼀个键,⼀个值和⼀个时间戳组成。

优势

  1. 高吞吐量,每秒处理几十上百万消息
  2. 高性能,单节点支持上千个客户端
  3. 持久化数据存储
  4. 分布式系统
  5. 可靠性
  6. 客户端状态维护

应用场景

  • 日志收集
  • 消息中间件
  • 流式处理
  • 用户活动跟踪

基本架构

主题分区

主题可以被分为若⼲分区,⼀ 个主题通过分区分布于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之前的消息。

高级特性

消息发送

生产端:

  1. 创建Sender线程
  2. 生产的消息经过 拦截器,序列化器,分区器,缓存在RecordAccumulator缓冲区
  3. 批次发送满足 缓冲区数据大小达到 batch.size或者 linger.ms(时间)达到上限
  4. 发送到broker指定分区,落盘。失败重试
  5. 落盘成功,返回生产元数据给生产者

分区器

  1. 如果record提供了分区号,则使⽤record提供的分区号
  2. 如果record没有提供分区号,则使⽤key的序列化后的值的hash值对分区数量取模
  3. 如果record没有提供分区号,也没有提供key,则使⽤轮询的⽅式分配分区号。

拦截器

拦截器的顺序 1,2,3 返回的顺序也是 1,2,3 区别于 Servlet的返回顺序

位移提交

Consumer向kafka 记录自己的位移数据,偏移量存储在 __consume_offsets 主题

同步提交

  • 阻塞Consumer,直到broker返回结果

异步提交

  • 异步提交不会自动重试

重平衡

  1. 消费者成员变更
  2. 主题分区的数量变更
  3. 订阅的主题发生变化,消费者使用正则表达式订阅主题

消费者

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速度快是因为:

  1. partition顺序读写,充分利⽤磁盘特性,这是基础;
  2. Producer⽣产的数据持久化到broker,采⽤mmap⽂件映射,实现顺序的快速写⼊;
  3. Customer从broker读取数据,采⽤sendfile,将磁盘⽂件读到OS内核缓冲区后,直接转到socket buffer进⾏⽹络发送。

控制器

  1. Kafka使⽤ Zookeeper 的分布式锁选举控制器,并在节点加⼊集群或退出集群时通知控制器
  2. 控制器负责在节点加⼊或离开集群时进⾏分区Leader选举。
  3. 控制器使⽤epoch来避免“脑裂”。 “脑裂”是指两个节点同时认为⾃⼰是当前的控制器。

你可能感兴趣的:(Kafka)