2、kafka中的概念和角色



Kafka broker 和 集群

kafka架构图:

  • 生产者发送消息给kafka服务器;
  • 消费者从kafka服务器读取消息;
  • kafka服务器依托zookeeper集群进行服务的协调管理;

broker —— kafka服务器的官方名字

一个独立的kafka服务器被称为broker;broker用来接收来自生产者的消息,为消息设置偏移量,并把消息保存到磁盘;

换句话说,多个kafka实例组成kafka集群;

kafka集群、broker、主题及分区、生产者、消费者 关系示意图:

broker中央控制器:kafka集群中由多个broker,在kafka启动时,只有一个会被选举为broker中央控制器(controller leader);

broker中央控制器选举过程:当broker启动的时候,都会创建KafkaController对象,但集群中只能由一个leader对外服务,这些每个节点上的KafkaController会在指定的zookeeper路径下创建临时节点,只有第一个成功创建的节点的KafkaController才可以称为leader,其余的都是follower。当leader故障后,所有的follower都会收到通知,再次竞争在该路径下创建节点从而选举新的leader;

中央控制器的工作

  • 管理整个集群中的分区;
  • 监控副本的状态;

这些工作如:

  • leader副本故障后,由中央控制器 负责为该partition重新选举新的leader副本
  • 当检测到同步列表发生变化后,由中央控制器 通知集群中所有leader更新其元数据缓存信息
  • 当增加某个topic分区的时候也会由中央控制器管理 分区的重新分配工作

Kafka 主题 和 分区

消息、主题(topic)、分区(partition)、副本(replica)


消息

kafka的消息个是经过3次版本变迁,分别被称为 V0,V1,V2;

3个主要字段的含义:

  • Key:消息键,对消息做 partition 时使用,即决定消息被保存在某个 topic 下那个 partition;
  • Value:消息体,保存实际的消息数据;
  • Timestamp:消息发送时间戳,用于流式处理 及 其他依赖时间的处理语义。如果不指定则取当前时间;
  • 属性:一共1Byte,目前只用了最低的3bit来做压缩类型的存储;
  • CRC32校验码

Kafka消息设计的好处:

1、使用 紧凑的二进制数组 Bytebuffer 而不是独立的对象,因此我们至少能够访问多一倍的可用内存;

2、而且不在堆上分配内存,避免了GC的糟糕性能;

3、大量使用页缓存,当broker进程崩溃时,堆内存上的数据也一并消失,但页缓存的数据依然存在;下次broker重启后可以继续提供服务,不用单独在热缓存;


主题(topic)和 分区(partition)

topic :只是一个逻辑概念,代表了一类消息。通常 topic 用来区分实际业务;

partition:每个topic都由若干个 partition 组成;

  • partition 是不可修改的有序消息序列,也可以说是有序的消息日志;
  • 每个partition 都有自己专属的 partition号,通常是从0开始的;
  • 用户堆 partition 唯一能做的操作就是 在 消息序列的尾部 追加写入消息
  • partition 上的每条消息都会被分配一个唯一的序列号,该序列号被称为位移(offset)

partition 实际上并没有太多的业务含义,partition的引入 只是为了提升系统的吞吐量;可以根据集群的实际配置设置具体的partition数,实现整体性能最大化;


位移(offset)

topic partition 下的每条消息都被分配一个位移值;kafka 消费端也有 位移(offset)的概念;

要注意区分这两offset 的不同含义:

由此我们可以断言, 一条消息就是一个三元组<topic,partition,offset>


副本(replica)

分布式系统为了实现高可靠性,目前主要实现方式还是 冗余机制;即备份多份日志;这些备份日志在 kafka 中被称为 副本(replica)

副本存在的唯一目的:防止数据丢失;

副本分两类:领导者副本(leader replica) 和 追随者副本(follower replica);

follower replica 不能给客户端提供服务,只是被动的 向 leader replica 获取数据;

一旦 leader replica 所在的 broker 宕机,kafka 会从 剩余的replica中选举出新的 leader 继续提供服务;


ISR(in-sync replica)

ISR 全称 in-sync replica,翻译过来就是 与 leader replica 保持同步的 replica集合

注意:不是所有的 replica 都能与 leader replica 保持同步;

kafka 为 partition 动态维护一个 replica 集合 —— 该集合中所有的replica保存的消息日志都与leader replica保持同步状态;正常情况下,所有的 replica 都应该和 leader replica 保持同步状态,但由于各种各样的原因如果滞后到一定程度后,kafka 会把这些 replica 踢出 ISR,如果这些 replica 慢慢的追上了 leader replica,kafka会把他们重新加入 ISR;

只有 ISR 集合中的 replica 才能被选举为 leader

kafka承诺,只要 ISR 中 至少存在一个 replica,那些”已提交“的消息就不会丢失;


kafka 生产者 和 消费者


生产者(producer)

功能:将 消息 发布到相应的 topic 中;

生产者发送模式:

  • 同步方式(synchronized):调用send方法发送,它会返回一个Future对象,调用future对象就知道消息是否发送成功。(kafka 默认为同步,即producer.type = sync);
  • 异步方式(asynchronized):调用send方法并指定一个回调函数,服务器在返回响应时调用该函数;
  • 发送了不管(oneway):把消息发送给服务器,但并不关心是否正常到达。多数情况下,消息会正常到达,但有时也会丢失一些消息;

消费者(consumer)

功能:主题 topic 中的数据被 消费者 使用;