技术10期:什么是Kafka?【全解析】

Kafka是最初由Linkedin公司开发,是一个分布式、支持分区的、多副本的,基于zookeeper协调的分布式消息系统。

 

它最大的特性就是可以实时处理大量数据以满足各种需求场景:比如基于hadoop的批处理系统、低延迟的实时系统、storm/Spark流式处理引擎,web/nginx日志、访问日志、消息服务等等。


Linkedin于2010年贡献给了Apache基金会并成为顶级开源项目

 

 

01 kafka的定义和特征

 

Kafka是一个分布式的基于发布/订阅模式的消息队列,主要用来解决应用解耦、异步消息、流量削峰等问题。

 

3个特点

 

  • 类似消息系统,提供事件流的发布和订阅,即具备数据注入功能

  • 存储事件流数据的节点具有故障容错的特点,即具备数据存储功能

  • 能够对实时的事件流进行流式地处理和分析,即具备流处理功能

 

 

02 Kafka的架构

 

 

  • Producer:消息生产者,就是向 kafka broker 发消息的客户端

 

  • Consumer:消息消费者,就是向 kafka broker 取消息的客户端

 

  • Broker :一台 kafka 服务器就是一个 broker。一个集群由多个 broke 组成。一个 broker 可以容纳多个 topic

 

  • Consumer Group (CG):消费者组,由多个 consumer 组成。消费者组内每个消费者负责消费不同分区的数据,一个分区只能由一个组内消费者消费;消费者组之间互不影响

 

  • Topic :可以理解为一个队列,生产者和消费者面向的都是一个 topic  

 

  • Partition:为了实现扩展性,一个非常大的 topic 可以分布到多个 broker(即服务 器)上,一个 topic 可以分为多个 partition,每个 partition 是一个有序的队列

 

  • Replica:副本,为保证集群中的某个节点发生故障时,该节点上的 partition 数据 不丢失,且 kafka 仍然能够继续工作,kafka 提供了副本机制,一个 topic 的每个分区都有若干个副本, 一个 leader 和若干个 follower

 

  • leader:每个分区多个副本的“主”,生产者发送数据的对象,以及消费者消费数 据的对象都是 leader

     

  • follower:每个分区多个副本中的“从”,实时从 leader 中同步数据,保持和 leader数据 的同步。leader 发生故障时,某个 follower 会成为新的 follower

 

 

03 生产者

 

(1)  数据可靠性保证

 

 

为保证 producer 发送的数据,能可靠的发送到指定的 topic,topic 的每个 partition 收到 producer 发送的数据后,都需要向 producer 发送ack(acknowledgement 确认收到),如果 producer 收到 ack,就会进行下一轮的发送,否则重新发送数据。

 

(2)  Ack应答机制

 

  • Ack=0:producer 不等待 broker 的 ack,这一操作提供了一个最低的延迟,broker 一接收到还没有写入磁盘就已经返回,当 broker 故障时有可能丢失数据

 

  • Ack=1:producer 等待 broker 的 ack,partition 的 leader 落盘成功后返回 ack,如果在 follower 同步成功之前 leader 故障,那么将会丢失数据

 

  • Ack=-1:producer 等待 broker 的 ack,partition 的 leader 和 follower 全部落 盘成功后才 返回 ack。但是如果在 follower 同步完成后,broker 发送 ack 之前,leader 发生故障,那么会造成数据重复

 

(3) 故障处理

 

 

  • follower 故障

 

follower发生故障后会被临时踢出ISR,待该follower 恢复后,follower会读取本地磁盘 记录的上次的HW,并将log文件高于HW的部分截取掉,从HW开始向leader进行同步。

 

等该follower的LEO大于等于该Partition的HW,即 follower 追上 leader 之后,就可以重新加入ISR 了。

 

  • leader 故障

 

leader 发生故障之后,会从 ISR 中选出一个新的 leader,之后,为保证多个副本之间的数据一致性,其余的follower 会先将各自的log文件高于 HW 的部分截掉,然后从新的 leader同步数据。

 

 

04 消费者

 

(1) 消费方式

 

consumer 采用 pull(拉) 模式从 broker 中读取数据。push(推)模式很难适应消费速率不同的消费者,因为消息发送速率是由 broker 决定的。

 

它的目标是尽可能以最快速度传递消息,但是这样很容易造成 consumer 来不及处理消息,典型的表现就是拒绝服务以及网络拥塞。

 

而 pull 模式则可以根据 consumer 的消费能力以适当的速率消费消息。pull 模式不足之处是,如果 kafka 没有数据,消费者可能会陷入循环中,一直返回空数据。

 

针对这一点,Kafka的消费者在消费数据时会传入一个时长参数timeout,如果当前没有数据可供消费,consumer 会等待一段时间之后再返回,这段时长即为 timeout。

 

(2) Offset的维护

 

 

 

由于 consumer 在消费过程中可能会出现断电宕机等故障,consumer 恢复后,需要从故障前的位置的继续消费,所以 consumer 需要实时记录自己消费到了哪个 offset,以便故障恢复后继续消费。

 

Kafka 0.9 版本之前,consumer 默认将 offset 保存在 Zookeeper 中,从 0.9 版本开始,consumer 默认将 offset 保存在 Kafka 一个内置的 topic 中,该 topic为__consumer_offsets。

 

总结:

 

Kafka是一个分布式、支持分区的、多副本的,基于zookeeper协调的分布式消息系统,是当前大数据解决方案的标配,广泛用于大数据框架间的数据发布和订阅,所以深入理解Kafka内部机制就非常必要。

 - 完 -

想了解更多关于人工智能的资讯

欢迎关注普适极客