跳转至

Kafka基础

Kafka 简介

Kafka 是一个基于发布订阅模式的消息队列中间件。它由 Producer, Consumer, Broker 和 Partition 几个组成。

Kafka 是最初由 Linkedin 公司开发,是一个分布式、支持分区的(partition)、多副本的(replica),基于 zookeeper 协调的分布式消息系统,它的最大的特性就是可以实时的处理大量数据以满足各种需求场景:比如基于 hadoop 的批处理系统、低延迟的实时系统、Storm/Spark 流式处理引擎,web/nginx 日志、访问日志,消息服务等等,用 scala 语言编写,Linkedin 于 2010 年贡献给了 Apache 基金会并成为顶级开源项目。

Kafka 的使用场景

  • 日志聚合:可收集各种服务的日志写入 kafka 的消息队列进行存储
  • 消息系统:广泛用于消息中间件
  • 系统解耦:在重要操作完成后,发送消息,由别的服务系统来完成其他操作
  • 流量削峰:一般用于秒杀或抢购活动中,来缓冲网站短时间内高流量带来的压力
  • 异步处理:通过异步处理机制,可以把一个消息放入队列中,但不立即处理它,在需要的时候再进行处理

Kafka 基本概念

kafka 是一个分布式的,分区的消息(官方称之为 commit log)服务。它提供一个消息系统应该具备的功能,但是确有着独特的设计。可以这样来说,Kafka 借鉴了 JMS 规范的思想,但是确并没有完全遵循 JMS 规范

名称 解释
Broker 消息中间件处理节点,一个 Kafka 节点就是一个 broker,一个或者多个 Broker 可以组成一个 Kafka 集群(Kafka Cluster)
Topic Kafka 根据 topic 对消息进行归类,发布到 Kafka 集群的每条消息都需要指定一个 topic
Producer 消息生产者,向 Broker 发送消息的客户端
Consumer 消息消费者,从 Broker 读取消息的客户端
ConsumerGroup 每个 Consumer 属于一个特定的 Consumer Group,一条消息可以被多个不同的 Consumer Group 消费,但是一个 Consumer Group 中只能有一个 Consumer 能够消费该消息
Partition 物理上的概念,一个 topic 可以分为多个 partition,每个 partition 内部消息是有序的
Replica(副本) 一个 topic 的每个分区都有若干个副本,一个 Leader 和若干个 Follower
Leader 每个分区多个副本的“主”,生产者发送数据的对象,以及消费者消费数 据的对象都是 Leader
Follower 每个分区多个副本中的“从”,实时从 Leader 中同步数据,保持和 Leader 数据的同步。Leader 发生故障时,某个 Follower 会成为新的 Leader。
  • Producer 将消息发送到特定的主题,Consumer 通过订阅特定的 Topic(主题) 来消费消息。
  • Partition 属于 Topic 的一部分。一个 Topic 可以有多个 Partition ,并且同一 Topic 下的 Partition 可以分布在不同的 Broker 上,这也就表明一个 Topic 可以横跨多个 Broker 。
  • 服务端(brokers)和客户端(producer、consumer)之间通信通过 TCP 协议来完成。

Kafka 的多副本机制

Kafka 消息的消费模式

采用 Pull 模式。

Consumer 可以自主决定是否批量的从 Broker 拉取数据。Pull 模式有个缺点是,如果 Broker 没有可供消费的消息,将导致 Consumer 不断在循环中轮询,直到新消息到达。为了避免这点,Kafka 有个参数可以让 Consumer 阻塞直到新消息到达。

Kafka 如何实现负载均衡与故障转移

负载均衡

  • Kakfa 的负载均衡就是每个 Broker 都有均等的机会为 Kafka 的客户端(生产者与消费者)提供服务,可以负载分散到所有集群中的机器上。Kafka 通过智能化的分区领导者选举来实现负载均衡,提供智能化的 Leader 选举算法,可在集群的所有机器上均匀分散各个 Partition 的 Leader,从而整体上实现负载均衡。

故障转移

  • Kafka 的故障转移是通过使用会话机制实现的,每台 Kafka 服务器启动后会以会话的形式把自己注册到 Zookeeper 服务器上。一旦服务器运转出现问题,就会导致与 Zookeeper 的会话不能维持从而超时断连,此时 Kafka 集群会选举出另一台服务器来完全替代这台服务器继续提供服务。

Kafka 中 Zookeeper 的作用

ZooKeeper 主要为 Kafka 提供元数据的管理的功能。

  • Kafka 是一个使用 Zookeeper 构建的分布式系统。Kafka 的各 Broker 在启动时都要在 Zookeeper 上注册,由 Zookeeper 统一协调管理。
  • 如果任何节点失败,可通过 Zookeeper 从先前提交的偏移量中恢复,因为它会做周期性提交偏移量工作
  • 同一个 Topic 的消息会被分成多个分区并将其分布在多个 Broker 上,这些分区信息及与 Broker 的对应关系也是 Zookeeper 在维护。

还执行其他活动,如: eader 检测、分布式同步、配置管理、识别新节点何时离开或连接、集群、节点实时状态等。

Kafka 的 ACK 机制

ACK 说明 优缺点
0 相当于异步操作,Producer 不需要 Leader 给予回复,发送完就认为成功,继续发送下一条(批)Message 此机制具有最低延迟,但是持久性可靠性也最差,当服务器发生故障时,很可能发生数据丢失
1 Kafka 默认的设置。表示 Producer 要 Leader 确认已成功接收数据才发送下一条(批)Message。不过 Leader 宕机,Follower 尚未复制的情况下,数据就会丢失。 此机制提供了较好的持久性和较低的延迟性
-1 Leader 接收到消息之后,还必须要求 ISR 列表里跟 Leader 保持同步的那些 Follower 都确认消息已同步,Producer 才发送下一条(批)Message。 此机制持久性可靠性最好,但延时性最差