目录
- 基本信息
- 挂了
- 数据丢失
- 重复数据
- 数据积压
- 优化
- 其他
基本信息
1.组成
producer brokers consumer zookeeper
2.需要安装多少台
2 * (生产者峰值生产速率 * 副本 / 100) + 1 = 3台
3.副本多少
副本2-3个,2个居多
副本的优势:提高可靠性
副本劣势:增加了网络IO传输
4.生产者峰值生产速率 ? 压测
百兆/s 消费速率 百兆/s
5.监控器用的什么?
KafkaManager、KafkaMonitor、KafkaEagle 都是开源
如果面试官问:我们都是自己研发的 仰视大佬
6.kafka数据保存多久
默认保存7天; 生产环境下建议3天
7.数据量
条/s m/s
日活 100万 1人1天100条 一天多少条日志=100万*100=1亿
1亿/(24*3600s) = 1150条/s
1条日志1k (0.5-2k)
大约1m/s
什么时间点数据量最大,能达到多少?
晚上7-10点 =》 20m/s - 30m/s 尽量不要超过50m/s 原因:2 * (n*2/100) + 1 = 3
100万的日活=1亿k=100G
8.给kafka磁盘预留多大空间
100g * 2个副本 * 3天 / 0.7 zabbix监控资源情况
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/s / 20 = 5个
分区数影响了并发度
10.isr
解决leader挂了谁当老大;谁在isr队列,就有机会
旧版:延迟时间,延迟条数; 新版:延迟时间
11.分区分配策略
1.Range(默认)
10个线程 3个分区
1 2 3 4
5 6 7
8 9 10
容易产生数据倾斜
2.RoundRobin
hash 随机打散,再采用轮询,尽量减少数据倾斜
挂了
短时间数据进入到flume channel
长时间有日志服务器(springboot)30天数据
数据丢失
1.ack
0 发送过去就不管了, 可靠性最差 传输效率最高
1 发送过去,leader应答; 可靠性一般 传输效率一般
-1 发送过去leader和follower,共同应答;可靠性最高,传输速率最低
2.在生产环境下怎么选择?
0是没人选的。
如果是普通日志,通常会选择1
如果是金融和钱相关的,通长选择-1 上海用-1比较多
重复数据
1.不处理
2.处理
幂等性(单分区,单会话)+事务(控制多分区)+ack=-1
下一级处理
hive dwd sparkstreaming (groupby,开窗取窗口第一条,redis)
精确一次性消费
数据积压
自身:增加分区 消费者也要增加消费线程(sparkstreaming CPU核数)
5个分区 CPU核数5个
128m 1g内存
找兄弟:提高下一级消费者的消费能力 batchsize(1000/s => 2000-3000)
优化
- Broker参数配置(server.properties)
1、网络和io操作线程配置优化
8个处理器=8个CPU核数
broker处理消息的最大线程数(默认为3)
num.network.threads=cpu核数+1
broker处理磁盘IO的线程数
num.io.threads=cpu核数*2
2、log数据文件刷盘策略
每当producer写入10000条消息时,刷数据到磁盘
log.flush.interval.messages=10000
每间隔1秒钟时间,刷数据到磁盘
log.flush.interval.ms=1000
3、日志保留策略配置
保留三天,也可以更短 (log.cleaner.delete.retention.ms)
log.retention.hours=72
4、Replica相关配置
offsets.topic.replication.factor:3
这个参数指新创建一个topic时,默认的Replica数量,Replica过少会影响数据的可用性,太多则会白白浪费存储资源,一般建议在2~3为宜。
buffer.memory:33554432 (32m)
#在Producer端用来存放尚未发送出去的Message的缓冲区大小。缓冲区满了之后可以选择阻塞发送或抛出异常,由block.on.buffer.full的配置来决定
compression.type:none
压缩优势:减少磁盘空间,提高网络传输效率; 劣势:频繁计算场景,就不要采用
#默认发送不进行压缩,推荐配置一种适合的压缩算法,可以大幅度的减缓网络压力和Broker的存储压力。
默认内存1个G,生产环境kafka内存调到4-6g,不要超过6g,如果6G还是不行,增加kafka台数
export KAFKA_HEAP_OPTS="-Xmx1G -Xms1G"
其他
1.为什么kafka传输效率快
分布式集群 采用分区
顺序读写 600m/s 随机读写 100/s
0拷贝技术 压缩
2.如果传输日志文件2m,会有什么问题?
kafka不能生产,也不能消费
kafka对于消息体的大小默认为单条最大值是1M
我们就要对kafka进行以下配置:server.properties
3.Kafka过期数据清理
保证数据没有被引用(没人消费他)
日志清理保存的策略只有delete和compact两种
log.cleanup.policy=delete启用删除策略
log.cleanup.policy=compact启用压缩策略
4.Kafka可以按照时间消费数据
使用API
Map<TopicPartition, OffsetAndTimestamp> startOffsetMap =
KafkaUtil.fetchOffsetsWithTimestamp(topic, sTime, kafkaProp);
5.Zookeeper中存储kafka哪些信息