一、生产者
生产者即消息数据产生的来源头,通常情况下,将原始数据(如数据库、审计日志、系统日志)写入到Kafka系统的应用程序称之为生产者实例。
二、消费者
消费者即消息数据流出的出口,通常情况下,读取Kafka系统中业务数据的应用程序被称为消费者实例
三、Topic(主题)
Topic(主题)即业务数据在Kafka系统中的分类集合,通常情况下,相同类型的业务数据会存储在同一个Topic(主题)下。 Topic(主题)的主要作用是将不同的业务数据分类存储,便于Kafka系统统一维护和管理业务数据。
一个Topic会被归类为一则消息,每个Topic可以被分割为多个Partition,在每条消息中,它在文件中的位置称为Offset,用于标记唯一一条消息。在Kafka中,消息被消费后,消息仍然会被保留一定时间后在删除,比如在配置信息中,文件信息保留7天,那么7天后,不管Kafka中的消息是否被消费,都会被删除;以此来释放磁盘空间,减少磁盘的IO消耗。
在Kafka中,一个Topic的多个分区,被分布在Kafka集群的多个Server上,每个Server负责分区中消息的读写操作。另外,Kafka还可以配置分区需要备份的个数,以便提高可用行。由于用到来ZK来协调,每个分区都有一个Server为Leader状态,服务对外响应(如读写操作),若该Leader宕机,会由其他的Follower来选举出新的Leader来保证集群的高可用性。
四、Broker(代理节点)
代理节点即Kafka系统中服务节点,通常情况下,Kafka系统中一台服务器主机被称为Kafka系统的一个代理节点。
代理节点的主要作用是负责消息数据的存储、为客户端提供服务、保证Kafka系统的正常运行等。代理节点是Kafka系统组建集群的最小单位,一个Kafka集群由一个代理节点或者多个代理节点组成。
五、Zookeeper
Zookeeper即Kafka集群元数据管理系统,由于Kafka系统是一个分布式消息系统,由于分布式的原因,Kafka系统需要Zookeeper来协调管理服务。
Zookeeper在Kafka系统中主要作用是选举主题分区Leader、协调各个代理节点服务、存储Kafka元数据信息等。
在新版本Kafka系统中,Kafka系统对于新的消费者实例使用了Kafka内部的消费者组协调协议,减少了对Zookeeper的依赖。这时的Zookeeper对于Kafka系统来说,更像是一个小型的分布式元数据存储系统。
六、核心组件元数据分布
Kafka系统中,核心组件的元数据信息均存储在Zookeeper系统。这些元数据信息具体包含控制器选举次数、代理节点和主题、配置、管理员操作、控制器、以及老版本消费者实例。这些元数据信息在Zookeeper系统中的分布
6.1、控制器选举次数
Kafka系统中的控制器每进行一次选举次数,都会在Zookeeper的/controller_epoch节点下进行记录。该值为一个数字,Kafka集群中第一个代理节点(Broker)启动时该值为1。
Kafka集群中,如果遇到代理节点宕机或者变更,那么Kafka集群会重新选举新的控制器。每次控制器发生变化时,在Zookeeper的/controller_epoch节点中的值就会加1。
6.2、Broker和Topic
在Zookeeper的/brokers节点中存储着Kafka代理节点和主题的元数据信息。
其中,Zookeeper的/brokers/ids节点中存储着代理节点的ID值。Zookeeper的/brokers/topics节点中存储着主题和分区的元数据信息。
6.3、配置
Kafka系统中修改主题属性这类操作,会被存储到Zookeeper的/config节点,/config节点主要包含三个子节点,分别是:
- topic:存储Kafka集群主题的额外属性,比如修改过主题的属性操作;
- client:客户端和主题配置被重写,包含消费者应用和生产者应用;
- changes:配置修改通知。
6.4、管理员操作
在执行管理员操作时,比如删除、分配等。在Zookeeper的/admin节点会生成相应的子节点,内容如下:
- delete_topics:标记待删除的主题名;
- reassign_partitions:重新分配分区操作;
- preferred_replica_election:恢复Leader分区平衡操作。
6.5、控制器
Kafka系统正常运行时,在Zookeeper的/controller节点下会存储一个Kafka代理节点的ID值,该ID值与Kafka代理节点ID相同,表示代理节点上存在控制器功能。
6.6、老版本消费者实例
在消费者实例中,如果使用kafka.tools.ConsoleConsumer接口去读取Kafka主题数据,则会产生Zookeeper系统/consumers节点。
在Zookeeper系统的/consumers节点中,存在若干个消费者组子节点,每个消费者组子节点下又会存在三个子子节点:
- 消费者线程ID(Zookeeper系统/consumers/ids);
- 消费者产生的偏移量(Zookeeper系统/consumers/offsets);
- 消费者线程和分区的对应关系(Zookeeper系统/consumers/owners)。
如果使用的是Kafka新版本消费者接口,则消费者实例产生的元数据信息不会存储在Zookeeper的/consumers节点中,而是存储在Kafka系统的内部主题中。