一 基本信息
1)组成
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
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中的消费者在读取服务端的数据时,需要将服务端的磁盘文件通过网络发送到消费者进程,网络发送需要经过几种网络节点。如下图所示:
传统的读取文件数据并发送到网络的步骤如下:
(1)操作系统将数据从磁盘文件中读取到内核空间的页面缓存;
(2)应用程序将数据从内核空间读入用户空间缓冲区;
(3)应用程序将读到数据写回内核空间并放入socket缓冲区;
(4)操作系统将数据从socket缓冲区复制到网卡接口,此时数据才能通过网络发送。
通常情况下,Kafka的消息会有多个订阅者,生产者发布的消息会被不同的消费者多次消费,为了优化这个流程,Kafka使用了“零拷贝技术”,如下图所示:
“零拷贝技术”只用将磁盘文件的数据复制到页面缓存中一次,然后将数据从页面缓存直接发送到网络中(发送给不同的订阅者时,都可以使用同一个页面缓存),避免了重复复制操作。
如果有10个消费者,传统方式下,数据复制次数为4*10=40次,而使用“零拷贝技术”只需要1+10=11次,一次为从磁盘复制到页面缓存,10次表示10个消费者各自读取一次页面缓存。