一、基本信息
1、组成
生产者
broker
消费者
zookeeper:brokerid、consumer信息(不包含生产者的信息)
2、需要安装多少台
2 * (生产者的峰值生产速率 * 副本 / 100) + 1 = 3
生产环境下,配置副本的数量为2-3个,2个居多
3、副本的优势和劣势
副本越多,越能提高可靠性
增加了网络IO传输
4、峰值生产速率,一般在百兆左右每秒
需要使用压力测试
如,10T数据,多长时间可以传输完
消费速率也是百兆每秒
5、监控器用的什么
kafka egale、monitor、manager,都是开源的
我们都是自己研发的,怎么回答,仰视大佬
6、kafka数据保存多久
默认保存7天,生产环境下建议保存3天
原因:当天把数据消费完,才能做到T+1模式,消费完数据
没有必要保存7天
其他原因:
日志服务器已经保存了30天☆(logfile)
7、数据量
条/S M/S
日活是100万时,1人1天100条,一天的日志数为1000000*100=1亿
1亿/(3600*24)=1150条/s
一条日志1k左右,生产环境下的日志大小为0.5K-2K之间
大约1M/S的数据
问:什么时间点数据量最大,最大能达到多少
晚上7-10点数据量达到高峰 =》 20M/S或30M/S左右,不要超过50M/S
原因:2 * (生产者的峰值生产速率 * 副本 / 100) + 1 = 3
2*(60*2/100)>3,三台kafka容易卡顿
8、100w日活对应100G数据量左右,给kafka预留多大的空间
100G*2个副本*保存3天/0.7(预留30%空间,zabbix磁盘报警)
9、设置多少个分区
一般设置3-10个分区
(1)设置1个分区
(2)进行压测:生产者峰值生产速率tp,消费者峰值生产速率cp
(3)有个预期的吞吐量是t
(4)分区数=t/min(tp, tc)
如tp=20M/S,tc=50M/S,t的期望值是100M/S
计算出的分区数=5个分区
分区数影响了并发度
10、ISR队列
解决leader挂了谁当老大,谁在队首就有机会
旧版:根据延迟时间和延迟条数判断
新版:根据延迟时间进行判断
11、分区分配策略
range:默认分区方式,分区特点是10个线程,3个分区,1234/567/8910,除不尽的放入低分区,容易产生数据倾斜
RandRobin:采用哈希的方式把任务随机打散,采用轮询的方式,减少数据倾斜
二、挂了/宕机的解决
1、分析
短时间内,数据进入到Flume Channel,长时间的话还有日志服务器存储30天的数据
Flume的非memory Channel都能保存一部分
三、丢失数据
1、看ACK,取值可以为0,1,-1
0:发送过去就不管了,可靠性最差,传输效率最高
1:发送过去,leader应答,可靠性一般,传输效率也一般
-1:发送过去,leader和follower共同应答,可靠性最高,传输效率最低
2、在生产环境下怎么选
0是没人选的
如果是普通日志,通常会选择1
如果是金融、和钱相关的,通常选择-1(上海比较多)
四、重复数据
1、【kafka去重】幂等性 + 事务 + ACK=-1【做到不丢不重:精确一次性消费】
单分区幂等性:只能保证单分区、单会话的数据不重复【单会话校验】
多分区事务:全局维护id,保证各个分区均不重复
两种方式为不同的级别,越增加校验越要求不重复,会带来更大的性能损失
很少同时使用幂等性+事务【精确一致性消费】
2、下一级处理:hive的DWD层 或 sparkstreaming、去重(groupby去重、redis、开窗函数取第一条)
3、不处理
五、数据积压【调参】
数据占满没有消费满
方案:自身找办法,找兄弟
自身找办法:增加并发度(增加分区),下一级消费者也要增加消费线程
(如果下一级是sparkstreaming,需要增加CPU核数,前边几个分区,就设置为几个CPU核数;)
(一次传输的数据是128M,对应1G的内存)
找兄弟:提高下一级消费者的消费能力,都有一个batch size参数 (1000/s---》2000-3000/s)
六、优化
1、配置文件
etc、conf、config
2、server.config
num.network.threads=3 计算线程,线程数=CPU核数+1
nums.io.threads=8 IO线程,线程数=CPU核数*2
CPU核数为8,计算线程为9,IO线程设为16
3、比较
进来后简单进行运算就出去:IO线程【IO密集型任务】
计算并行任务:进入后计算大量矩阵等运算后再出去,占用大量CPU时间,配置的线程数要少一些【计算密集型任务】
4、优化
kafka最终从内存进入磁盘,数据文件刷盘策略
日志保留策略天数,设置为3天
副本数量,设置为2
5、producer.properties
compression.type压缩配置:none/snappy/gzip/lz4/zstd
通常使用zstd,默认是none
压缩的优势:减少磁盘空间、提高网络传输效率
劣势:如果是频繁计算的场景,就不要采用压缩【大量运算、解压缩、压缩,影响CPU效率】
6、kafka的默认内存调整
bin/kafka-server-start.sh
默认为1G,通常情况下会调整为4-6G,不要超过6G
如果6G还不行,增加kafka台数(自己,找兄弟)
七、其他
1、kafka为什么传输效率快
分布式集群、采用分区
采用顺序读写,可以达到600M/S(随机读写只能达到100M/S)
采用零拷贝机制:
配置好压缩后,也可以提高传输效率
2、如果传输的日志文件为2M,kafka会有什么问题
默认传输消息最大值为1M,超过1M,无法消费也无法生产
可以调整参数,server.properties
3、kafka的消息过期后的策略
前提:不被引用,未被消费
删除或压缩
4、其他场景:从之前某一时刻,重新消费数据
可以按照时间戳的形式,来消费数据
5、zk中存储了kafka的哪些信息
brokerid、topic、分区,里面没有生产者信息