一、Kafka体系结构
kafka被定位为一个分布式流式处理平台,以高吞吐、可持久化、可水平扩展、支持流数据处理等多种特性而被广泛使用。
其所扮演的三大角色:
-
消息系统
与传统的消息中间件都具备系统解耦、冗余存储、流量削峰、异步通信、扩展性、可恢复性等功能。与此同时,kafka还提供了大多数消息系统难以实现的消息顺序性保障和回溯消费的功能。 -
存储系统
kafka把消息持久化到磁盘,相比于其他内存存储的系统而言,有效地降低了数据丢失的风险。 -
流式处理平台
不仅为每个流式处理框架提供了可靠的数据来源,还提供了一个完整的流式处理类库,如窗口、连接、聚合等各类操作。
基本概念
1. Producer生产者:将消息发送到Broker
2. Broker服务代理节点:将收到的消息存储到磁盘。broker可以简单地看做一个独立的kafka服务节点或kafka服务实例,一个或多个broker组成了kafka集群。
3. Consumer:消费者:从Broker订阅并消费消息
4. Zookeeper集群:负责集群元数据的管理、控制器的选举
kafka中还有两个重要的概念:主题(Topic)和分区(Partition)
- 主题
消息以主题为单位进行分类,生产者负责将消息发送到特定的主题,而消费者负责订阅主题并消费 - 分区(主题分区)
主题可以细分为多个分区,同一主题下不同分区所包含的消息是不同的。在存储层,可以将分区看作一个可追加的日志文件,消息被追加到分区日志文件时会分配一个偏移量offset。kafka通过offset来保证消息在分区内的顺序性,但是offset并不跨越分区。也就是说,kafka保证的是分区有序而不是主题有序。- 分区多副本机制:提升容灾能力。leader负责处理读写请求,follower负责与leader的消息同步。副本处于不同的broker中,当leader出现故障时,从follower中重新选举新的leader对外提供服务。kafka通过多副本机制实现了故障的自动转移,当集群中某个broker失效时仍然能保证服务可用。
分区与Broker的关系:不同的分区可以分布在不同的broker上,也就是说,一个主题可以跨越多个broker,以此来提供比单个broker更强大的性能。
如图,kafka集群有4个broker,某个主题有3个分区,且副本数也是3(有一个leader和两个follower)
主题与分区
生产者和消费者的设计理念所针对的都是主题和分区层面的操作。主题作为消息的归类,可以再细分为一个或多个分区。分区的划分不仅为kafka提供了可伸缩性、水平扩展的功能,还通过多副本机制来为kafka提供数据冗余以提高数据可靠性。
-
逻辑概念:主题和分区都是逻辑上的概念
-
物理概念:分区可以有一至多个副本,每个副本对应一个日志文件。同一个分区中的多个副本必须分布在不同的broker中,才能提供有效的数据冗余。
分区管理
1. 优先副本
避免leader在某个broker中过于集中。
-
场景:leader节点失效,重新选举leader后,可能造成broker之间的负载均衡不均匀。比如broker_1中有两个leader,broker_2中没有leader节点。
-
实现:通过一定的方式促使优先副本选举为leader,优先副本指在每个topic-partition中保存的一个broker列表。
2. 分区重分配
集群扩容、broker失效场景下对分区进行迁移。
-
场景:集群中的broker节点下线时,位于此broker上的leader副本将被转移到其他的节点,follower副本将直接失效,而不会被自动转移到其他的可用节点上;
集群中新增broker节点时,只有新创建的主题分区才有可能被分配到此节点上,之前的主题并不会自动分配到新节点中。 -
实现:先为每个分区添加新副本(新副本从分区的leader副本那里复制所有数据),复制完成后,将旧副本从副本单里移除。