Kafka 完整介绍
# 一、简单介绍
# 1,功能角色
消息系统:Kafka 备系统解耦、冗余存储、流量削峰、缓冲、异步通信、扩展性、可恢复性等功能。Kafka 还提供了大多数消息系统难以实现的消息顺序性保障及回溯消费的功能。
存储系统:Kafka 把消息持久化到磁盘,相比于其他基于内存存储的系统而言,有效地降低了数据丢失的风险。得益于 Kafka 的消息持久化功能和多副本机制,可以把Kafka作为长期的数据存储系统来使用,只需要把对应的数据保留策略设置为“永久”或启用主题的日志压缩功能即可。
流式处理平台:Kafka 不仅为每个流行的流式处理框架提供了可靠的数据来源,还提供了一个完整的流式处理类库,比如窗口、连接、变换和聚合等各类操作。
# 2,基本结构
如下图所示,Kafka 通过 zookeeper 管理元数据,生产者向 Kafka 节点发送消息,消费者通过 pull 模式从节点拉取消息。Kafka 节点可以部署在不同的服务器上,实现分布式部署。
1.1 kafka 体系结构
# 3,基本概念
- ZooKeeper:一个开源的分布式协调服务,Kafka通过ZooKeeper来实施对元数据信息的管理,包括集群、broker、主题、分区等内容。
- Producer:生产者,也就是发送消息的一方,生产者负责创建消息,然后将其投递到Kafka中。
- Consumer:消费者,也就是接收消息的一方,消费者连接到Kafka上并接收消息,进而进行相应的业务逻辑处理。
- Broker:服务节点,可以简单地看作一个独立的Kafka服务节点或Kafka服务实例,一个或多个Broker组成了一个Kafka集群。
- Topic:主题,逻辑上的概念,用于将Kafka中的消息以主题为单位进行归类,生产者负责将消息发送到特定的主题,而消费者负责订阅主题并进行消费。
- Partition:分区,逻辑上的概念,主题可以包含一个或多个分区,一个分区只属于单个主题,一个分区对应一个日志文件,这些日志文件才是消息真正写入的地方。
- Leader:主副本,每个分区多个副本的主副本,生产者发送数据的对象,以及消费者消费数据的对象,都是Leader。* Follower:从副本,每个分区多个副本的从副本,会实时从Leader副本中同步数据,并保持和Leader数据的同步。Leader发生故障时,某个Follower还会被选举并成为新的Leader,且不能跟Leader在同一个Broker上,防止崩溃数据可恢复。
- Offset:偏移量,消息在分区中的唯一标识,Kafka通过它来保证消息在分区内的顺序性,不过offset并不跨越分区,Kafka保证的是分区有序而不是主题有序。
- Replica:多副本,一个分区对应一个或多个副本,其中leader副本负责处理读写请求,follower副本只负责与leader副本的消息同步,副本分别位于不同的 broker,出现故障时实现自动转移。
- Rebalance:再均衡,是指分区的所属权从一个消费者转移到另一消费者的行为,为消费组具备高可用性和伸缩性提供保障,可以根据流量情况动态的增加分区或是增减消费者而不影响消费。不过在再均衡发生期间,消费组内的消费者是无法读取消息的。
1.2 多副本架构
- 如上图所示,创建了 4 Kafka 个节点,3 个分区,每个分区又存在 3 个副本(1 个 leader 副本,2 个 follower 副本)。每个分区的不同副本分别位于不同的节点上,当某个节点故障时,该节点上的 leader 副本对应分区的 follower 副本会重新竞选为 leader 副本,实现故障自动转移。
# 二、主题与分区
- 从Kafka的底层实现来说,主题和分区都是逻辑上的概念,一个主题可以有一至多个分区,一个分区可以有一至多个副本,每个副本对应一个日志文件,每个日志文件对应一至多个日志分段(LogSegment),每个日志分段还可以细分为索引文件、日志存储文件和快照文件等。
- 同一主题下的不同分区包含的消息是不同的,分区在存储层面可以看作一个可追加的日志(Log)文件,消息在被追加到分区日志文件的时候都会分配一个特定的偏移量(offset)。offset是消息在分区中的唯一标识,Kafka通过它来保证消息在分区内的顺序性,不过offset并不跨越分区,也就是说,Kafka保证的是分区有序而不是主题有序。
- Replica:多副本,分区的备份,Kafka 通过增加副本数量可以提升容灾能力。同一分区的不同副本中保存的是相同的消息(在同一时刻,副本之间并非完全一样),副本之间是“一主多从”的关系,其中leader副本负责处理读写请求,follower副本只负责与leader副本的消息同步。副本处于不同的broker中,当leader副本出现故障时,从follower副本中重新选举新的leader副本对外提供服务。Kafka通过多副本机制实现了故障的自动转移,当Kafka集群中某个broker失效时仍然能保证服务可用。
2.1 主题的分区写入
分区使用多副本机制来提升可靠性,但只有leader副本对外提供读写服务,而follower副本只负责在内部进行消息的同步。如果一个分区的leader副本不可用,那么就意味着整个分区变得不可用,此时就需要Kafka从剩余的follower副本中挑选一个新的leader副本来继续对外提供服务。虽然不够严谨,但从某种程度上说,broker 节点中 leader 副本个数的多少决定了这个节点负载的高低。
# 三、生产者
# 四、消费者
# 五、日志存储
# 六、可靠性
# 七、客户端命令
编辑 (opens new window)
上次更新: 2024/10/17, 10:42:19