在对 Kafka 基本体系结构有了 定了解后,本节我们对 Kafka 的基本概念进行详细阐述
l. 主题
Kafka 组消息抽象归纳为 个主题( Topic ),也就是说,一个主题就是对消息的分类。生产者将消息发送到特定主题,消费者订阅主题或主题的某些分区进行消费。
2. 消息
消息是 Kafka 通信的基本单位,由 个固定长度的消息头和 个可变长度的消息体构成,在老版本中,每 条消息称为 Message
3. 分区和副本
Kafka 组消息归纳为 个主题,而每个主题又被分成 个或多个分区( Partition个分区由 系列有序、不可变的消息组成,是一个有序队列。每个分区在物理上对应为 个文件夹,分区的命名规则为主题名称后接“一”连接符,之后再接分区编号,分区编号从 开始,编号最大值为分区的总数减 每个分区又有 至多个副本( Replica ),分区的副本分布在集群的不同代理上,以提高可用性 从存储角度上分析,分区的每个副本在逻辑上抽象为一个日志( Log )对象,即分区的副本与日志对象是一一对应。每个主题对应的分区数可以在 Kafka 启动时所加载的配置文件中配置,也可以在创建主题时指定 。当然,客户端还可以在主题创建后修改主题的分区数。
分区使得 Kafka 在井发处理上变得更加容易,理论上来说,分区数越多吞吐 越高,但这要根据集群实际环境及业务场景而定。同时,分区也是 Kafka 保证消息被顺序消费以及对消息进行负载均衡的基础。
Kafka 只能保证 个分区之内消息的有序性,并不能保证跨分区消息的有序性 每条消息被追加到相应的分区中,是顺序写磁盘,因此效率非常高,这是 Kafka 高吞吐率的 个重要保证。同时与传统消息系统不同的是, Kafka 并不会立即删除已被消费的消息,由于磁盘的限制消息也不会 直被存储(事实上这也是没有必要的),因此 Kafka 提供两种删除老数据的策略,一种是基于消息己存储的时间长度, 第二种是基于分区的大小。这两种策略都能通过配置文件进行配配置。
4. Leader 副本和 Follower 副本
由于 Kafka 副本的存在,就需要保证 个分区的多个副本之间数据的 致性, Kafka 会选择该分区的 个副本作为 Leader 副本,而该分区其他副本即为 Follower 副本,只有 Leader本才负责处理客户端读/写请求, Follower 副本从 Leader 副本同步数据 如果没有 Leader 副本,那就需要所有的副本都同时负责读/写请求处理,同时还得保证这些副本之间数据的 致性,假设有 个副本则需要有 条通路来同步数据,这样数据的一致性和有序性就很难保证引入 Leader 副本后客户端只需与 Leader 副本进行交互,这样数据一致性及顺序性就有了保证 Follower 副本从 Leader 副本同步消息,对于 个副本只需 n-1 条通路即可,这样就使得系统更加简单而高效。副本 Follower Leader 的角色并不是固定不变的,如果 Leader 失效,通过相应的选举算法将从其他 Follower 副本中选出新的 Leader 副本。
5. 偏移量
任何发布到分区的消息会被直接追加到日志文件(分区目录下以" .log ”为文件名后缀的 数据文件〉的尾部,而每条消息在日志文件中的位置都会对应一个按序递增的偏移 。偏移量个分区下严格有序的逻辑值,它并不表示消息在磁盘上的物理位置 由于 Kafka 几乎不允
许对消息进行随机读写,因此 Kafka 并没有提供额外索引机制到存储偏移 ,也就是说并不会给偏移量再提供索引。消费者可以通过控制消息偏移量来对消息进行消费,如消费者可以指定消费的起始偏移量。为了保证消息被顺序消费 消费者己消费的消息对应的偏移量也需要保存需要说明 的是,消费者对消息偏移量的操作并不会影响消息本身的偏移量。 旧版消费者将消费
偏移量保存到 ZooKeeper 当中,而新版消费者是将消费偏移量保存到 Kafka 内部 个主题当中当然,消费者也可以自己在外部系统保存消费偏移 ,而无需保存到 Kafka
6. 日志段
1个日志又被划分为多个日志段( LogSegment ),日志段是 Kafka 日志对象分片的最小单。与 日志对象 样,日志段也是 个逻辑概念, 个日志段对应磁盘上 体日志文件和两个索引文件。日志文件是以 .log ”为文件名后缀的数据文件,用于保存消息实际数据。1个索引文件分别以“ .index ”和“ timeindex ”作为文件名后缀,分别表示消息偏移量索 引文件和消息时间戳索引文件。
7. 代理
Kafka 基本体系结构中我 提到了 Kafka 集群 Kafka 集群就是由一个或多个 Kafka例构成,我们将每一个 Kafka 实例称为代理( Broker ),通常也称代理为 Kafka 服务器( KafkaServer 。在生产环境中 Kafka 集群 般包括一台或多台服务器,我们可以在一台服务器上配置 个或多个代理。每 个代理都有唯 的标识 id ,这个 id 个非负整数。在一 Kafka集群中,每增加 个代理就需要为这个代理配置 个与该集群中其他代理不同的 id, id 值可以选择任意非负整数即可,只要保证它在整个 Kafka 集群中唯 ,这个 id 就是代理的名字,也就是在启动代理时配置的 broker.id 对应的值,因此在本书中有时我们也称为 brokerId 由于给每个代理分配了不同的 brokerId ,这样对代理进行迁移就变得更方便,从而对消费者来说是透明不会影响消费者对消息的消费。
8. 生产者
生产者(Producer )负责将消息发送给代理,也就是向 Kafka 理发送消息的客户端
9. 消费者和消费纽
消费者( omsumer )以拉取( pull )方式拉取数据,它是消费的客户端。在 Kafka 每一个消费者都属于 个特定消费组( ConsumerGroup ),我们可以为每个消费者指定 个消费组,groupld 表消费组名称,通过 group.id 置设置 如果不指定消费组,则该消费者属于默认消费组 test-consumer-group 同时,每个消费者也有 个全局唯 通过配置项 client.id指定,如果客户端没有指定消费者的 id, Kafka 会自动为该消费者生成 个全局唯 id ,格式为$ {groupld }-$ {hostN ame }-$ {times tamp}-$ {UUID 字符}。同一个主题的一条消息只能被同 个消费组下某 个消费者消费,但不同消费组的消费者可同时消费该消息 消费组是 Kafka 用来实现对 题消息进行广播和单播的手段,实现消息广播只需指定各消费者均属于不同的消费组,消息单播则只 让各消费者属于同 个消费组
10. ISR
Kafka ZooKeeper 中动态维护了 IS (In-sync Replica ),即保存同步的副本列表,列表中保存的是与 Leader 副本保持消息同步的所有副本对应的代理节点 id 如果 Follower副本岩机(本书用岩机来特指某个代理失效的情景,包括但不限于代理被关闭,如代理被人为关闭或是发生物理故障、心跳检测过期、网络延迟、进程崩溃等)或是落后太多,则该 Follower副本节点将从 ISR 列表中移除
11. ZooKeeper
Kafka 利用 ZooKeeper 保存相应元数据信息, Kafka 元数据信息包括如代理节点信息、 Kafka集群信息、旧版消费者信息及其消费偏移量信息、主题信息、分区状态信息、分区副本分配方案信息、动态配置信息等。 Kafka 在启动或运行过程当中会在 ZooKeeper 上创建相应节点来保存元数据信息, Kafka 通过监昕机制在这些节点注册相应监听器来监昕节点元数据的变化,从而由 ZooKeeper 负责管理维护 Kafka 集群,同时通过 ZooKeeper 我们能够很方便地对 Kafka群进行水平扩展及数据迁移。
好了,kafka基本概念已经讲完