一 基本信息

1)组成 

Kafka基础(十二): 基本面试题(二)_内核空间

2)需要安装多少台?

  2 *(生产者峰值生产速率 * 副本 /100) + 1 = 3台

  2 * (n*2 /100)+1 = 3

3)压测;

  生产者峰值生产速率 

4)默认副本为1.副本2-3个,2个居多

  副本的优势:提高可靠性;

  副本劣势:增加了网络IO传输

5)数据量 (单位:条/s m/s)

  日活 100万 1人1天100条 一天多少条日志=100万*100条=1亿   

       1条日志1k (0.5k-2k)

       每天数据量:100g

  平均速度; 1亿条/(24*3600) = 1150条/s   数据量 1m/s

  峰值速度:(什么时间点数量最大,能达到多少?)

    晚上7-10点 =》  1150条*20/s 2万条

    20m/s -30m/s 不要超过50m/s

6)Kafka数据保存多久

  默认保存7天;生产环境建议3天

7)给Kafka磁盘预留多大空间

  100g * 2个副本* 3天 /0.7 zabbix

8)监控器用的什么?

  kafka manager  kafkaegale 都是开源

  我们都是自己研发的。 仰视大佬

9)设置多少个分区

  一般3-10个分区

         步骤:

  (1)设置1个分区

  (2)压测:生产者峰值生产速率tp ,消费者峰值消费峰值速率tc

  (3)有个预期的吞吐量 t

  (4)分区数=t /min(tp,tc) 

      tp = 20m/s   tc=50m/s    t =100m/s

     分区数=100 /20 =5个

     分区数影响了并发度

10)分区分配策略

  range(默认)

    10个分区 3个消费线程

    1 2 3 4

    5 6 7

    8 9 10

  容易产生数据倾斜

  roundRobin

    分区hash 随机打散,再采用轮询,尽量减少数据倾斜。


11)isr

  解决leader挂了谁当老大;谁在isr队列,就机会;

       根据下列条件是否加入isr

    旧版:延迟时间、延迟条数;

     新版:延迟时间

12)多少个Topic

   通常情况:多少个日志类型就多少个Topic。也有对日志类型进行合并的。

 

二 挂了

  1)短时间会存储在Flume channel里面

  2)长时间,日志服务器保存30天数据

  3)短期没事

三 丢了

  ack 应答机制

  ack = 0 发送过去就不管了 , 可靠性最差 传输效率最高

  ack = 1 发送过去,leader应答; 可靠性一般 传输效率一般

  ack = -1 发送过去leader和follower,共同应答;可靠性最高;传输效率最低


  在生产环境:

  0是没人选的。

  如果是普通日志,通常选择1 最求效率

  如果是金融和钱相关的,通常选择-1 上海

四 重复了

  1)不处理

  2)处理

    幂等性+事务+ ack=-1

    下一级处理

      hive dwd sparkstreaming (groupby、开窗取窗口第一条、redis)

    精确一次消费

五 积压了

  自身 :增加分区 消费者也要增加消费线程(sparkstreaming CPU核数)

      5个分区 CPU核数5 个

      128m 1g内存

  找兄弟: 提高下一级消费者的消费能力 batchsize(1000/s =》2000-3000)

六 优化

  1)num.network.threads=3 计算线程 线程数=CPU核数+1 =9

  num.io.threads=8 IO线程 线程数=CPU核数*2 = 16

  CPU核数为8

  2)压缩:优势:减少磁盘空间、提高网络传输效率; 劣势: 频繁计算场景,就不要采用

  3)kafka内存调整到4-6g,不要超过6g。6g还不行,增加kafka台数

1)Broker参数配置(server.properties)

  1、网络和io操作线程配置优化

    # broker处理消息的最大线程数(默认为3)

    num.network.threads=cpu核数+1

    # broker处理磁盘IO的线程数

    num.io.threads=cpu核数*2

  2、日志保留策略配置

    # 保留三天,也可以更短 (log.cleaner.delete.retention.ms)

    log.retention.hours=72

  3、Replica相关配置

    offsets.topic.replication.factor:3

    # 这个参数指新创建一个topic时,默认的Replica数量,Replica过少会影响数据的可用性,太多则会白白浪费存储资源,一般建议在2~3为宜。

4、网络通信延时

  replica.socket.timeout.ms:30000 #当集群之间网络不稳定时,调大该参数

  replica.lag.time.max.ms= 600000# 如果网络不好,或者kafka集群压力较大,会出现副本丢失,然后会频繁复制副本,导致集群压力更大,此时可以调大该参数

2)Producer优化(producer.properties)

  buffer.memory:33554432 (32m)

  #在Producer端用来存放尚未发送出去的Message的缓冲区大小。缓冲区满了之后可以选择阻塞发送或抛出异常,由block.on.buffer.full的配置来决定。

  compression.type:none

  #默认发送不进行压缩,推荐配置一种适合的压缩算法,可以大幅度的减缓网络压力和Broker的存储压力。

3)Kafka内存调整(kafka-server-start.sh

  默认内存1个G,生产环境尽量不要超过6个G。

  export KAFKA_HEAP_OPTS="-Xms4g -Xmx4g"

七 其他

  1) 为什么kafka传输效率快?

    分布式集群、采用分区

    顺序读写 600m/s 随机读写 100m/s

    0拷贝技术、压缩

  2)如果传输的日志文件1m,会有什么问题?

    kafka不能生产、也不能消费

    kafka对于消息体的大小默认为单条最大值是1M但是在我们应用场景中, 常常会出现一条消息大于1M,如果不对kafka进行配置。则会出现生产者无法将消息推送到kafka或消费者无法去消 费kafka里面的数据, 这时我们就要对kafka进行以下配置:server.properties

              Kafka基础(十二): 基本面试题(二)_数据_02

  3)Kafka过期数据清理

    保证数据没有被引用(没人消费他)

    日志清理保存的策略只有delete和compact两种

    log.cleanup.policy=delete启用删除策略

    log.cleanup.policy=compact启用压缩策略

        4)Kafka可以按照时间消费数据

          Map<TopicPartition, OffsetAndTimestamp> startOffsetMap = KafkaUtil.fetchOffsetsWithTimestamp(topic, sTime, kafkaProp);

八 0拷贝

kafka中的消费者在读取服务端的数据时,需要将服务端的磁盘文件通过网络发送到消费者进程,网络发送需要经过几种网络节点。如下图所示:

Kafka基础(十二): 基本面试题(二)_页面缓存_03




传统的读取文件数据并发送到网络的步骤如下:

(1)操作系统将数据从磁盘文件中读取到内核空间的页面缓存;

(2)应用程序将数据从内核空间读入用户空间缓冲区;

(3)应用程序将读到数据写回内核空间并放入socket缓冲区;

(4)操作系统将数据从socket缓冲区复制到网卡接口,此时数据才能通过网络发送。

通常情况下,Kafka的消息会有多个订阅者,生产者发布的消息会被不同的消费者多次消费,为了优化这个流程,Kafka使用了“零拷贝技术”,如下图所示:

Kafka基础(十二): 基本面试题(二)_kafka_04



“零拷贝技术”只用将磁盘文件的数据复制到页面缓存中一次,然后将数据从页面缓存直接发送到网络中(发送给不同的订阅者时,都可以使用同一个页面缓存),避免了重复复制操作。

如果有10个消费者,传统方式下,数据复制次数为4*10=40次,而使用“零拷贝技术”只需要1+10=11次,一次为从磁盘复制到页面缓存,10次表示10个消费者各自读取一次页面缓存。