kafka入门

1. kafka介绍

  • kafka是一个分布式流式处理平台,它以高吞吐、可持久化、可水平扩展、支持流数据处理等多种特性而被广泛使用
  • kafka具有三大重要“角色”:消息系统、存储系统、流式处理平台

1.1 消息系统

  • kafka是一种基于发布与订阅的分布式消息系统
  • kafka和传统的消息系统(也称消息中间件)都具有系统解耦、冗余存储。流量削峰、缓冲、异步通信、扩展性、可恢复性等功能
  • 此外,kafka还提供了大多数消息系统都难以实现的消息顺序性保障即回溯消费的功能

1.2 存储系统

  • kafka支持将消息持久化存储到磁盘,同时使用多副本机制,有效降低了数据丢失的风险
  • kafka的数据是按照一定顺序进行持久化保存的,用户可以按需进行读取

1.3 流式处理平台

  • kafka提供了一个完整的流式处理类库,比如窗口、连接、变换和聚合等各类操作

2. kafka基本架构

kafka的基本架构一般包括以下几个概念:

  • ZooKeeper:负责集群元数据的管理、控制器的选举等操作
  • Broker:一个独立的服务代理节点,负责将收到的消息存储到磁盘中,一个或者多个Broker组成了一个kafka集群
  • Producer:生产者,负责创建消息,然后将消息发送给broker
  • Consumer:消费者,负责从broker订阅并消费消息
  • Topic:主题,kafka的消息通过主题来分类
  • Partition:分区,一个主题可以被分为若干个分区,一个分区就是一个提交日志
kafka架构
图1. kafka基本架构

3. kafka基本概念

3.1 主题和分区

  • kafka的消息一主题为单位进行归类,生产者将消息发送到特定的主题,消费者负责订阅主题并进行消费
  • 一个主题可以划分为多个分区,而一个分区只属于单个主题,即同一个主题下的不同分区包含的消息是不同的
  • 分区在存储层面可以看作是一个可追加的日志文件,消息被追加到分区的尾部,通过偏移量(offset)来标识
  • kafka通过offset来保证消息在每个分区上是顺序的,但不能保证消息在主题内的不同分区之间的有序性
  • 分区可以分布在不同的broker上,即一个主题可以横跨多个broker,每条消息发到到broker之前,会根据分区规则选择存储到哪个具体的分区
消息追加
图2. 消息通过尾部追加的方式写入到分区中
  • kafka为分区引入了多副本(Replica)机制,通过增加副本数量提高容灾能力
  • 多个副本中,有唯一一个leader副本,其余的为follower副本。leader副本负责处理读写请求,而follower副本只负责与leader副本同步消息,不进行其他操作
  • 当leader副本出现故障时,会从follower副本中选举出新的leader副本继续对外提供服务
多副本架构
图3. 多副本架构。
  • 如上图,集群中有4个broker,某个主题有3个分区(图中的P1,P2,P3),副本因子(即副本个数)为3
  • 一般而言,同一分区的不同副本会分别存储在不同的broker中

3.2 生产者

  • 生产者负责创建消息并将消息发到到kafka上
  • 一般情况下,一个消息会被发布到特定的主题上,生产者默认把消息均衡地分布到主题的所有分区上
  • 生产者也可以通过分区器和消息键将消息写到指定的分区,分区器负责为键生成散列值,并将其映射到指定的分区上,这可以保证包含同一个键的消息会被写到同一个分区上

3.3 消费者

  • 消费者负责订阅和消费消息
  • 消费者可以订阅一个或多个主题,并按照消息的生成顺序读取它们
  • 消费者通过检查消息的偏移量(offset)来区分已经读过的消息,并把最后读取的下一个消息偏移量保存在Zookeeper或kafka上,当消费者关闭或重启时,它读取状态不会丢失
  • 每个消费者都有一个消费组(Consumer Group),当消息发布到主题后,只会被投递给订阅它的每个消费组中的一个消费者
消费者与消费组
图4. 消费者与消费组
  • 如上图,某个主题包含4个分区:P0P1P2P3,两个消费组A和B订阅了该主题,A中有4个消费者C0C1C2C3,B中有2个消费者C4C5
  • 按照kafka的默认规则,即每个消息只能投递到一个消费组中的一个消费者(例如P0不可能同时被C0C1订阅),因此A组中的每个消费者分配到1个分区,B组中的每个消费者分配到2个分区

3.3.1 分区演变

消费组12个消费者
图5. 消费组内只有1个消费者图6. 消费组内有2个消费者
  • 如图5,当消费组内只有1个消费者时,该消费者订阅了7个分区的消息
  • 如图6,当新加入1个消费者时,同一个分区不能同时分配到一个消费组内的不同分区中,因此会将部分分区分配C1
  • 继续新增消费者,同理进行分配,不过,当消费者个数大于分区数目时,会有部分消费者分配不到任何分区而无法消费任何消息

参考资料

《Kafka权威指南》

《深入理解Kafka–核心设计与实践原理》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值