1、kafka是什么? 可以用来做什么?
Kafka 是一个分布式的、高吞吐量的、可持久性的、自动负载均衡的消息队列。
它不仅可以实现传统意义上MQ功能,异步、解耦、削峰。
还可以作为大数据的流处理平台。
2、为什么kafka安装需要依赖Zookeeper?
- 配置中心,管理Broker、Topic、Partition、Consumer的信息,包括数据的变动。
- 负载均衡,Broker在ZK注册watch,从而感知Broker的上下线。
- 集群管理和选举,选举产生Controller。
3、pull和push,kafka支持哪种消费模型?为什么这么设计?
kafka支持的pull,因为在push模式下,如果消息产生速度远远大于消费者消费消息的速率,那消费者就会不堪重负(你已经吃不下了,但是还要不
断地往你嘴里塞),直到挂掉。而且消费者可以自己控制一次到底获取多少条消息,通过max.poll.record
来控制。
4、Topic的用途是什么?为什么Kafka没有队列?
Topic 将消息分类,生产者和消费者面向的是同一个 Topic。生产者和Topic、Topic和消费者的关系都是多对多。一个生产者可以发送消息到多个Topic,一个消费者也可以从多个Topic获取消息。
5、分区Patition的作用是什么?
为了实现扩展性,提高并发能力。类似于分库分表,实现的也是横向扩展和负载的目的。
6、分区数和副本数怎么设置?
分区数目,需要根据具体项目情况通过使用官方提供的测试工具kafka-producer-perf-test.sh
和kafka-producer-perf-test.sh
来测试。
副本数量也可以通过测试脚本得到最优解,不过副本数量一定小于Broker数量,否则会报错。
7、分区的副本在Broker上是怎么分布的?
假设有3个Broker,一个Topic有两个分区,每个分区两个副本,可能的分布情况是什么样的?
- 第一个分区的第一个副本放置位置是随机从 broker集合选择的;
- 其他分区的第一个副本放置位置相对于第一个分区依次往后移;
- 每个分区剩余的副本相对于第1个副本放置位置其实是由nextReplicaShift决定的,而这个数也是随机产生的。
8、Segment的作用是什么?
将一个Partition分成多个Segment,不至于一个Partition过大,导致消息查询读取的速度变慢。提高查询读取消息的效率。
9、Consumer Group的含义是什么?
Consumer Group是消费者组的意思,多个Consumer通过设置相同的group id来组成一个Consumer Group。同一个Consumer Group的Consumer消费同一个Topic是互斥的,而且一个partition只能由组内的一个Consumer来消费。多个Consumer消费一个Topic提高了消费消息的吞吐量。
10、Consumer Group上次消费的偏移量记录在哪里?怎么更新?
Consumer Group上次消费的偏移量记录在_consumer_offset
的Topic中,主要以GroupMetadata和OffsetAndMetadata两个对象存储。这里OffsetAndMetadata保存了消费者组和partition和offset位移信息的元数据。
Consumer Group的偏移量,只有在消费者消费完消息,提交以后,才会更新。
11、生产者送消息如何选择分区?
- 如果消息创建的时候指定了分区,就去指定的分区。
- 没有制定分区,使用了自定义的分区器,根据分区器计算出去哪个分区。
- 没有指定partition值但有key的情况下,使用默认分区器DefaultPartitioner,将key的hash 值与topic的 partition 数进行取余得到partition值;
- 既没有partition值又没有key值的情况下,第一次调用时随机生成一个整数(后面每次调用在这个整数上自增),将这个值与topic可用的partition总数取余得到partition值,也就是常说的round-robin算法。
12、生产者acks 1 0 -1的含义是什么?
- acks=0,Broker接收到消息就返回(还未写入磁盘)。延迟最低,若Broker故障,丢数据的风险大。
- acks=1,等到Partition的leader落盘成功后返回ack,若follower同步成功之前,leader故障,会丢失数据。
- acks=-1,Partition的leader和follower全部落盘以后才返回ack。
13、消息主要的物理存储文件有哪些?
14、Kafka中有哪些索引类型?消息怎么通过索引检索?
偏移量索引和时间戳索引。
比如我要检索偏移量是10002673的消息。
- 消费的时候是能够确定分区的,所以第一步是找到在哪个segment 中。Segment文件是用base offset命名的,所以可以用二分法很快确定(找到名字不小于10002673的segment)。
- 这个segment有对应的索引文件,它们是成套出现的。所以现在要在索引文件中根据offset找position。
- 得到position之后,到对应的log文件开始查找offset,和消息的 offset进行比较,直到找到消息。
15、kafka的稀疏索引,间隔由什么决定?为什么不用B+Tree?
间隔有消息的大小决定,只要写入消息超过4K,则偏移量索引增加一条记录。
16、Kafka的日志文件不可能无限扩大,那么可以通过哪些方式释放磁盘空间?
可以有两种方式释放,一种是delete删除,一种是compact压缩。
delete方式,是通过定时任务来执行的,执行间隔默认是5分钟,可以设置。也可以通过配置,确定哪些消息需要删除。
compact方式,是通过保存key相同的最后一个value,来进行压缩的。
17、Kafka副本Leader是怎么选举的?谁来选举?选谁为Leader?什么是AR?什么是ISR?什么是OSR?
副本的leader是通过Controller来选举的 ,使用微软的PacificA算法。在这种算法中,默认是让ISR中第一个replica变成leader。比如ISR是1、5、9,优先让1成为leader。
AR是Assigned-Replicas,一个分区所有的副本。
ISR是In-Sync Replicas,是这些所有的副本中,跟leader 数据保持一定程度同步的。
OSR是Out-Sync Replicas,是跟leader同步滞后过多的副本。
18、Kafka副本follower怎么向Leader同步?什么是HW?什么是LEO?
-
HW(Hight Watermark)是副本水位值,表示分区中最新一条已提交(Committed)的消息的Offset。
-
LEO:Log End Offset,Leader中最新消息的Offset。
- follower节点会向Leader发送一个fetch请求,leader向follower’发送数据。
- follower接收到数据响应后,依次写入消息并且更新LEO。
- leader更新HW (ISR最小的LEO)。
19、kafka的offset怎么维护?存在哪里?什么时候更新?
同10
20、一个消费组中的消费者与分区的关系是什么样的?例如topic有3个分区,假如有2个消费者,怎么分配?假如有4个消费者,怎么分配?
假如Topic有3个分区,2个消费者;
这里涉及到,消费者配置是消费策略,如果是RangeAssignor(范围分配),则可能的结果是,{(1,2)(3)}或者{(1){2,3}}
如果是RoundRobinAssginor(轮询),则可能是{(1,3)(2)}
如果是StickyAssignor(粘滞),可能是{(1,2)(3)};{(1){2,3}};{(2){1,3}}
假如是3分区,4个消费者的话,前3个消费者一个人一个,第四不消费。