Kafka系列之高频面试题

基础

简介

特点:

  • 高吞吐、低延迟:kafka每秒可以处理几十万条消息,延迟最低只有几毫秒,每个Topic可以分多个Partition,Consumer Group对Partition进行Consumer操作
  • 可扩展性:Kafka集群支持热扩展
  • 持久性、可靠性:消息被持久化到本地磁盘,并且支持数据备份防止数据丢失
  • 容错性:允许集群中节点失败(若副本数量为n,则允许n-1个节点失败)
  • 高并发:支持数千个客户端同时读写

应用场景

包括:

  • 日志收集:一个公司可以用Kafka可以收集各种服务的log,通过kafka以统一接口服务的方式开放给各种Consumer,如Hadoop、HBase等
  • 消息系统:解耦和生产者和消费者、缓存消息等
  • 用户活动跟踪:记录web或app用户的各种活动,如浏览网页、搜索等,这些活动信息被各个服务器发布到Kafka的Topic中,然后订阅者通过订阅这些Topic来做实时的监控分析,或存储到Hadoop、数据仓库中做离线分析和挖掘
  • 运营指标:记录运营监控数据。包括收集各种分布式应用的数据,生产各种操作的集中反馈,比如报警和报告
  • 流式处理:如Spark Streaming和Flink

概念

ISR:In-Sync Replicas,副本同步队列
OSR:Out-of-Sync Replicas,非副本同步队列
AR:Assigned Replicas所有副本

ISR是由Leader维护,Follower从Leader同步数据有一些延迟,超过配置的阈值会把Follower剔除出ISR,存入OSR列表,新加入的Follower也会先存放在OSR中。AR=ISR+OSR。

Offset:偏移量
LEO:Log End Offset,当前日志文件中下一条,每个副本最大的Offset
HW:High Watermark,高水位,通常被用在流式处理领域,以表征元素或事件在基于时间层面上的进度。是ISR队列中最小的LEO。消费者最多只能消费到HW所在的位置上一条信息。
Kafka系列之高频面试题_第1张图片

LSO:Last Stable Offset,对未完成的事务而言,LSO的值等于事务中第一条消息的位置(First Unstable Offset),对已完成的事务而言,它的值同HW相同
LW:Low Watermark,低水位,代表AR集合中最小的LSO值。

负载均衡

Kafka的负载均衡就是每个Broker都有均等的机会为Kafka的客户端(生产者与消费者)提供服务,可以将负载分散到集群中的所有机器上。通过智能化的分区领导者选举来实现负载均衡,可在集群的所有机器上均匀分散各个Partition的Leader,从而整体上实现负载均衡。

故障处理与转移

故障分Follower故障和Leader故障:

  • Follower故障

Follower发生故障后会被临时踢出ISR,待该Follower恢复后,Follower会读取本地磁盘记录的上次的HW,并将log文件高于HW的部分截取掉,从HW开始与Leader进行同步。等该Follower的LEO大于等于该Partition的HW,即Follower追上Leader后,可重新加入ISR。

  • Leader故障

Leader发生故障后,会从ISR中选出一个新的Leader,为保证多个副本之间的数据一致性,其余的Follower会先将各自的log文件高于HW的部分截掉,然后从新的Leader同步数据。

注意:这只能保证副本之间的数据一致性,并不能保证数据不丢失或者不重复

Kafka的故障转移是通过使用会话机制实现的,每台Kafka服务器启动后会以会话的形式把自己注册到ZK服务器上。一旦服务器运转出现问题,就会导致与ZK的会话不能维持从而超时断连,此时Kafka集群会选举出另一台服务器来完全替代这台服务器继续提供服务。

分区

Q:分区的作用?
A:实现Broker负载均衡。对于消费者来说,提高并发度。

Q:一个Topic对应几个Partition?

Q:分区取值原则?
A:按照如下顺序判断:

  • 指明Partition的情况下,直接将指明的值作为Partition值
  • 没有指明Partition值但有Key的情况下,将Key的Hash值与Topic的Partition值进行取余得到Partition值
  • 既没有Partition值又没有Key值的情况下,第一次调用时随机生成一个整数(后面每次调用在这个整数上自增),将这个值与Topic可用的Partition总数取余得到Partition值,即round-robin算法

Q:Kafka分区数可以增加或减少吗?
A:可使用bin/kafka-topics.sh命令增加Kafka的分区数,但不支持减少分区数。

Kafka分区数据不支持减少是由很多原因的,比如减少的分区内数据放到哪里去?是删除,还是保留?删除的话,这些没消费的消息不就丢了。如果保留这些消息如何放到其他分区里面?追加到其他分区后面的话那么就破坏Kafka单个分区的有序性。如果要保证删除分区数据插入到其他分区保证有序性,实现起来逻辑就会非常复杂。

Q:Kafka新建的分区会在哪个目录下创建?
A:在启动Kafka集群之前,需提前配置好log.dirslog.dir参数,其值是Kafka数据的存放目录,可配置多个目录,使用逗号分隔,通常这些目录是分布在不同的磁盘上用于提高读写性能。

如果log.dirs参数只

你可能感兴趣的:(kafka)