Kafka的其他一些知识(高效数据读写、Zookeeper作用、事务)

什么是Kafka

Kafka 是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域。

 

消息队列的优点和缺点

优点:异步、解耦、削峰

缺点:复杂度增加、消息队列如果崩了,那系统就没法用了、异步数据一致性问题

 

消息队列的两种模式

点对点模式(一对一,消费者主动拉取数据,消息收到后消息清除)

  • 消息生产者生产消息发送到Queue中,然后消息消费者从Queue中取出并且消费消息。

  • 消息被消费以后,queue 中不再有存储,所以消息消费者不可能消费到已经被消费的消息。

  • Queue 支持存在多个消费者,但是对一个消息而言,只会有一个消费者可以消费。

Kafka的其他一些知识(高效数据读写、Zookeeper作用、事务)

发布订阅模式(一对多,消费者消费数据之后不会清除消息)

  • 消息生产者(发布)将消息发布到 topic 中,同时有多个消息消费者(订阅)消费该消息。

  • 和点对点方式不同,发布到 topic 的消息会被所有订阅者消费。

Kafka的其他一些知识(高效数据读写、Zookeeper作用、事务)

 

Kafka 高效读写数据

kafka是如何做到高效进行数据读写的?

顺序写磁盘

  • Kafka 的 producer 生产数据,要写入到 log 文件中,写的过程是一直追加到文件末端,为顺序写。
  • 官网有数据表明,同样的磁盘,顺序写能到 600M/s,而随机写只有 100K/s。这与磁盘的机械机构有关,顺序写之所以快,是因为其省去了大量磁头寻址的时间。 

零复制技术

零复制技术之前写过,就是避免一些用户态、内核态、操作系统之间的copy过程。

Kafka的其他一些知识(高效数据读写、Zookeeper作用、事务)

 Zookeeper在Kafka中的作用

Kafka 集群中有一个 broker 会被选举为 Controller,负责管理集群 broker 的上下线,所有 topic 的分区副本分配和 leader 选举等工作。

Controller 的管理工作都是依赖于 Zookeeper 的。

以下为 partition 的 leader 选举过程:

Kafka的其他一些知识(高效数据读写、Zookeeper作用、事务)

 

Kafka 事务

Kafka 从 0.11 版本开始引入了事务支持。事务可以保证 Kafka 在 Exactly Once 语义的基础上,生产和消费可以跨分区和会话,要么全部成功,要么全部失败。

Producer 事务

为了实现跨分区跨会话的事务,需要引入一个全局唯一的 Transaction ID,并将 Producer获得的PID 和Transaction ID 绑定。这样当Producer 重启后就可以通过正在进行的 TransactionID 获得原来的 PID。

为了管理 Transaction,Kafka 引入了一个新的组件 Transaction Coordinator。Producer 就是通过和 Transaction Coordinator 交互获得 Transaction ID 对应的任务状态。TransactionCoordinator 还负责将事务所有写入 Kafka 的一个内部 Topic,这样即使整个服务重启,由于事务状态得到保存,进行中的事务状态可以得到恢复,从而继续进行。

Consumer 事务

上述事务机制主要是从 Producer 方面考虑,对于 Consumer 而言,事务的保证就会相对较弱,尤其时无法保证 Commit 的信息被精确消费。这是由于 Consumer 可以通过 offset 访问任意信息,而且不同的 Segment File 生命周期不同,同一事务的消息可能会出现重启后被删除的情况。