1.Kafka基础架构
(1)Producer:消息生产者,就是向Kafka broker发消息的客户端。
(2)Consumer:消息消费者,向Kafka broker取消息的客户端。
(3)Consumer Group(CG):消费者组,由多个consumer组成。消费者组内每个消费者负责消费不同分区的数据,一个分区只能由一个组内消费者消费;消费者组之间互不影响。所有的消费者都属于某个消费者组,即消费者组是逻辑上的一个订阅者。
(4)Broker:一台Kafka服务器就是一个broker。一个集群由多个broker组成。一个broker可以容纳多个topic。
(5)Topic:可以理解为一个队列,生产者和消费者面向的都是一个topic。
(6)Partition:为了实现扩展性,一个非常大的topic可以分布到多个broker(即服务器)上,一个topic可以分为多个partition,每个partition是一个有序的队列。
(7)Replica:副本。一个topic的每个分区都有若干个副本,一个Leader和若干个Follower。
(8)Leader:每个分区多个副本的“主”,生产者发送数据的对象,以及消费者消费数据的对象都是Leader。
(9)Follower:每个分区多个副本中的“从”,实时从Leader中同步数据,保持和Leader数据的同步。Leader发生故障时,某个Follower会成为新的Leader。
2.Kafka配额限度机制
限制producer端速率
限制consumer端速率
3.数据的清理
Log Deletion 定期或者满足一定的条件会自动清理, 或者 7天清理一次。
Log Compaction 按照相同key进行压缩存储,保存最新版本的数据。
4.数据组成结构
topic-partition-segment-(log、index、timeindex
topic是一个逻辑概念,用于生产者发布数据,消费者拉取数据。
partition是topic被分为多个分区
segment是Kafka将一个分区的文件按片段来存储,一个片段的默认大小是1GB,可以在service.properties配置文件中修改
5.Kafka读写流程
写:1.通过zk找到对应的partition的leader。2.开始写数据,同时为了保证数据不丢失,follow也会拉取数据,返回给leader ACK;3.如果所有的副本都写入成功再返回producerACK。
读:1.通过zk,找到对应的partition的leader;2.通过zk,找到consumer消费者组对应的offset;3.根据offset从leader拉取数据,消费者将offset提交到zk中。
6.监控工具
Kafka Eagle、Java web程序、JMX
7.消息队列的两种模式
点对点模式、发布订阅模式kafka
8.消息队列的应用场景
异步处理、系统解耦、消峰
9.消息不丢失机制
broker数据不丢失:生产者通过分区的leader写入数据后,所有在ISR中follower都会从leader中复制数据,保证数据不丢失。
生产者数据不丢失:通过ACK机制确保数据写入成功;生产者可以采用同步和异步的方式发送数据(同步:发送一批数据给Kafka后,等待Kafka返回结果;异步:发送一批数据给Kafka后,只提供一个回调函数)。
消费者数据不丢失:At-least once 一种数据可能会重复消费;Exactly-once 仅被一次消费,将offset和数据都保存在一个关系型数据库中,底层是通过关系型的事务来保证有且仅有一次消费。
10.副本机制
acks=0:不等待broker确认,直接发送下一条数据,性能最高,可能会丢数据;
acks=1:等待leader副本确认接收后,才会发送下一条数据,性能中等;
acks=-1:等待所有副本将数据同步后,才会发送下一条数据,性能最慢;
11.分区机制
生产者分区写入策略:轮询是默认的策略,最大保证消息平均分配到一个分区,生产消息时,key为null,则使用轮询算法均衡分配;随机分区策略基本不用;按key分区策略可能会导致数据倾斜;自定义分区策略;
消费者组rebalance机制:当消费者组中的消费者个数发生变化、订阅的topic个数发生变化、topic分区数发生变化时会触发,rebalance不良影响:过程中所有的消费者组都将停止工作,直到rebalance完成。
消费者分区分配策略:range范围分配策略是Kafka默认的,确保每个消费者消费的分区数量均衡,range范围分配策略针对每个topic,roundRobin轮询策略将消费者组内所有消费者以及消费者所订阅的所有topic的partition按照字典排序,Stricky粘性分配策略指分区分配尽可能均匀,在发生rebalance时,Striky粘性分配策略和roundRobin轮询策略类似。
12.Kafka事务
Kafka支持事务;
生产者生产消息以及消费者提交offset的操作可以在一个原子操作中,要么都成功,要么都失败;事务操作的API:初始化事务:要使用Kafka事务,必须先进行初始化操作;开始事务,启动一个Kafka事务,提交偏移量,批量的将分区对应的offset发送到事务中,方便后续一块提交,提交事务,取消事务。
13.生产者幂等性
防止生产重复数据
幂等性原理:PID,Sequence Number
14.分区的leader和follower
leader负责读写数据,follower负责同步数据,参与选举。leader和follower是针对分区的,不是针对broker。分配分区的leader在不同的broker中负载均衡。
AR表示分区所有的副本,ISR指正在同步的副本,OSR是指不在同步的副本。
所有的partition的leader由controller完成,根据ISR来选择一个新的leader,如果该partition所有副本宕机,则新的leader为-1。
Kafka启动时会在所有的broker中选择一个controller,controller是针对broker的,创建topic或者添加分区、修改副本刷等管理任务都是由controller完成,Kafka分区的leader选举也是由controller决定。
Controller是用zk来进行选举,高可用的,一旦某个broker崩了,其他的broker会重新注册为新的controller
leader负载均衡:Kafka引入了preferred replica的概念,在ISR列表中,第一个replica就是preferred replica,存放在broker的第一个分区就是preferred replica,可以手动均匀分配每个分区的leader
为什么不能通过zk的方式来选举partition的leader?
Kafka集群会有很多partition,假如某个broker宕机,就会出现很多partition都需要重新选择leader,如果使用zookeeper选举leader,会在zk带来巨大压力,所以Kafka中的leader选举不能用zk实现。
Kafka中的leader和follower与zookeeper中的区分?
zk的leader负责读写,follower可以读取。Kafka的leader负责读写,follower不能读写数据(确保消费者消费的数据是一致的),follower负责同步数据,参与选举。
版权归原作者 艾卡西亚暴雨o 所有, 如有侵权,请联系我们删除。