场景
每天总数据量100G,每天产生1亿条日志。
平均每秒钟:1亿/24小时/60分/60秒=1150条/每秒钟。
低谷每秒钟:50条/每秒钟。
高峰每秒钟:1150条*(2-20倍)=2300条-23000条/每秒钟。
每条日志大小:0.5K-2K(取1K)。
每秒多少数据量:2MB-20MB/s。
一、磁盘选择
1. 磁盘类型HDD VS SSD
(1)机械磁盘HDD一般机械磁盘寻道时间是毫秒级的,若有大量随机I/O,则将会出现指数级的延迟,但是Kafka是顺序读写的,因此对于机械磁盘的性能也是不弱的,所以基于成本问题可以考虑。
(2)固态硬盘SSD读写速度可观,没有成本问题可以考虑。
注意:kafka底层主要是顺序写,固态硬盘和机械硬盘的顺序写速度差不多。建议选择普通的机械硬盘。
2.磁盘大小
每天总数据量:1亿条*1K≈100G
100G*副本2*保存时间3天/0.7≈1T
建议三台服务器硬盘总大小,大于等于1T。
二、内存选择
Kafka内存组成:堆内存+页缓存
1. Kafka堆内存:建议每个节点10G~15G
在kafka-server-start.sh中修改
if [ "x$KAFKA_HEAP_OPTS" = "x" ]; thenexport KAFKA_HEAP_OPTS="-Xmx10G -Xms10G"fi
(1)查看Kafka进程号
[xiao@hadoop102 kafka]$ jps
2321 Kafka
5255 Jps
1931 QuorumPeerMain
(2)根据Kafka进程号,查看Kafka的GC情况
[xiao@hadoop102 kafka]$ jstat -gc 2321 1s 1
参数说明:YGC年轻代垃圾回收次数。
(3)根据Kafka进程号,查看Kafka的堆内存
[xiao@hadoop102 kafka]$ jmap -heap 2321
… …
Heap Usage:
G1 Heap:
regions = 2048
capacity = 2147483648 (2048.0MB)
used = 246367744 (234.95458984375MB)
free = 1901115904 (1813.04541015625MB)
11.472392082214355% used
2、页缓存:
页缓存是Linux系统服务器的内存。我们只需要保证1个segment(1G)中25%的数据在内存中就好。
每个节点页缓存大小=(分区数*1G*25%)/节点数。例如10个分区,页缓存大小=(10*1G*25%)/3≈1G
建议服务器内存大于等于11G。
三、CPU选择
Kafka对CPU的要求不高,主要是用在对消息解压和压缩上。所以 CPU的性能不是在使用 Kafka的首要考虑因素。
num.io.threads=8,负责写磁盘的线程数,整个参数值要占总核数的50%。
num.replica.fetchers=1,副本拉取线程数,这个参数占总核数的50%的1/3。
num.network.threads=3,数据传输线程数,这个参数占总核数的50%的2/3。
建议24CPU,32个cpu core。
四、网络选择
网络吞吐量决定了Kafka能够处理的最大数据流量。它和磁盘是制约 Kafka 拓展规模的主要因素。对于生产者、消费者写入数据和读取数据都要瓜分网络流量。
网络带宽=峰值吞吐量≈20MB/s, 选择千兆网卡即可。
100Mbps单位是bit;10MB/s单位是byte ; 1byte = 8bit,100Mbps/8=12.5MB/s。
一般百兆的网卡(100Mbps)、千兆的网卡(1000Mbps)、万兆的网卡(10000Mbps)。
五、总结
磁盘、内存、CPU和网络选择差一些的可能会影响Kafka的性能,如果选择最好的也可能造成资源的利用率不高,浪费资源,本文提供了选择Kafka的磁盘、内存、CPU和网络的思路,抓紧收藏吧。