面试题答案
一键面试Kafka实现消息持久化的方式
- 日志文件存储:Kafka将消息以日志文件的形式存储在磁盘上。每个Topic被划分为多个Partition,每个Partition又由多个Segment组成,每个Segment包含一定数量的消息。当Segment达到一定大小或一定时间时,会滚动生成新的Segment。
- 顺序写入:Kafka采用顺序写入磁盘的方式,这大大提高了写入性能。相比随机写入,顺序写入避免了磁盘寻道时间,使得写入速度接近磁盘的线性写速度。
- 副本机制:Kafka通过副本机制来保证数据的可靠性。每个Partition可以有多个副本,其中一个副本被指定为Leader,其他为Follower。生产者发送消息到Leader副本,Follower副本会从Leader副本同步数据。当Leader副本所在的Broker发生故障时,会从Follower副本中选举出新的Leader,确保数据不丢失。
控制消息持久化策略的关键参数
- log.retention.hours:指定消息在日志文件中保存的时长,默认值为168小时(7天)。超过这个时间,旧的日志文件会被删除。
- log.retention.minutes:与
log.retention.hours
类似,不过是以分钟为单位设置消息保存时长。如果同时设置了log.retention.hours
和log.retention.minutes
,以较小的值为准。 - log.retention.ms:同样是设置消息保存时长,以毫秒为单位。它的优先级高于
log.retention.hours
和log.retention.minutes
。 - log.segment.bytes:指定每个日志Segment文件的大小,默认值为1GB。当Segment文件达到这个大小,会滚动生成新的Segment。
- log.flush.interval.messages:指定在消息累计达到多少条时,将消息刷新到磁盘。默认值为Long.MAX_VALUE,即不按消息数量刷新,只按时间或文件大小刷新。
- log.flush.interval.ms:指定消息刷新到磁盘的时间间隔,默认值为null。如果设置了该值,Kafka会按照这个时间间隔将消息刷新到磁盘。
- replication.factor:指定每个Partition的副本数量。增加副本数量可以提高数据的可靠性和容错性,但也会增加存储和网络开销。
- min.insync.replicas:指定ISR(In-Sync Replicas)集合中最小的副本数量。生产者发送消息时,只有当ISR中的副本数量大于等于
min.insync.replicas
时,才认为消息发送成功。如果ISR中的副本数量小于该值,生产者会收到错误,从而保证数据不会丢失。