Kafka是基于发布/订阅模式的分布式消息系统。
在Kafka,消息流程如下:
(1)生产者生成消息,并发布到消息系统中。
(2)消息系统负责存储消息,并保证数据安全。
(3)消费者订阅消息,最终消息系统将消息投递给消费者,并删除已消费成功的消息。
ZooKeeper的作用主要包括以下几个方面:
(1)存储元数据。
由于ZooKeeper可以保证集群内数据的强一致性,所以使用ZooKeeper存储元数据是非常方便的。这些元数据包括主题、Kafka中的分区、命名空间、BookKeeper的Ledger等,以及配置信息,如Kafka的动态配置、用户权限等。
(2)节点监控、节点发现。
主要利用了ZooKeeper两个特性:
- ZooKeeper客户端可以在ZooKeeper中建立临时ZK节点,当该ZooKeeper客户端连接断开后,ZooKeeper将删除该客户端所有的临时节点。
- ZooKeeper提供了Watch机制,ZooKeeper客户端可以监控某个ZK节点的变化(如ZK节点被写入了新的内容或者创建了子节点等),当ZK节点发生变化时,ZooKeeper将发送事件通知监控该节点的ZooKeeper客户端。下面将ZooKeeper中的事件称为ZK事件。
(3)选举中心节点。
由于在ZooKeeper中不能重复创建同一个ZK节点,所以Kafka利用该特性选举中心节点:在Kafka选举中心节点时,会创建某一个特定路径的临时ZK节点。这样,即使多个服务同时尝试成为中心节点,也只有一个服务能成功创建该ZK节点,并成为中心节点,而其他服务可以监控该临时ZK节点,当该临时ZK节点被删除后(由于旧的中心节点因故障下线),再尝试成为新的中心节点。
Kafka中的中心节点就是KafkaController节点,该KafkaController节点负责完成一些分布式协同工作,如故障转移等。可以被认为是“去中心化架构”。
说明一下分布式中的中心化架构与去中心化架构:
- 中心化架构:集群选举一个中心节点,负责协调集群的正常运行,如监控其他节点的运行状态、执行故障转移等。
- 去中心化架构:集群不需要选举中心节点,所有节点都是对等的。