学习了kafka的原理知识后,还要学会如何评估生产环境集群,如果是一个大数据架构师,这个是必须要会的,比如kafka集群、Hbase集群、hadoop集群,评估集群的方式差不多,现在以kafka为例。
场景
电商平台,需要支持每天10亿请求发送到kafka集群。
场景拆解:采用二八原则,一般评估出来问题都不大。10亿请求->24小时过来的,一般情况下,每天晚上12:00到早上8:00这段时间其实是没有多大数据量的,80%的请求是用的另外16个小时处理的。
qps评估
16个小时处理->8亿请求
16*0.2=3个小时处理->8亿请求的80%的数据=6亿
也就是说3个小时处理6亿数据
我们简单算一下高峰期的qps:
6亿/3小时=5.5万/s qps=5.5万
数据量评估
10亿请求*50kb(假设消息大小)=46T,每天要存储46T数据
一般情况下,我们都会设置两个副本 46T*2=92T
kafka里面的数据是有保存的时间周期的,假设保留最近3天的数据
92T * 3天 = 276T
机器评估
场景总结:搞定10亿请求,高峰期5.5万qps,276T的数据。需要多少台服务器?
如果是公司架构师或者项目负责人,做一个项目可能需要采购机器。
1)首先分析一下是需要虚拟机还是物理机
像kafka mysql hadoop这些集群搭建的时候,我们生产里面都是使用物理机。
2)高峰期需要处理的请求每秒5.5万个,其实一两台物理机绝对是可以抗住的。一般情况下,我们评估机器的时候,是按照高峰期的4倍去评估。如果是4倍的话,大概我们集群的能力要准备到20万qps。这样子的集群才是比较安全的集群,大概就需要5台物理机,每台承受4万请求。
磁盘评估
场景总结:搞定10亿请求,高峰期5.5万的qps,276T的数据,需要5台物理机。
1)使用SSD固态硬盘?还是普通的机械硬盘?
SSD硬盘:性能比较好,但是价格贵
SAS盘:某方面性能不是很好,但是比较便宜
SSD硬盘性能比较好,指的是它随机读写的性能比较好。适合MySQL这样的集群,但是其实它顺序写的性能跟SAS盘差不多。
kafka的理解:就是用的顺序写,所以用普通的机械硬盘就可以了。
2)评估每台服务器需要多少块磁盘
5台服务器,一共需要276T,大约每台服务器需要存储60T的数据。我们公司里面服务器的配置用的是11块硬盘,每个硬盘7T
11 * 7T = 77T
77T * 5 台服务器 = 385T
内存评估
场景总结:搞定10亿请求,需要5台物理机,11(SAS) * 7T,一共需要多少内存?
我们发现kafka读写数据的流程都是基于os cache,换句话说假如咱们的os cache无限大,那么整个kafka是不是相当于就是基于内存去操作,如果是基于内存去操作,性能肯定很好。
内存是有限的
1)尽可能多的内存资源给os cache
2)kafka的核心代码是scala写的,客户端是java写的,都是基于jvm,所以我们还要给一部分内存给jvm。kafka的设计,没有把很多数据结构都放在jvm里,所以我们不用给太大内存给jvm。根据经验,给个10G就可以了。
NameNode:
jvm里面还放了元数据(几十G),JVM一定要给得很大。比如给个100G
假设我们这个10亿请求的项目,一共会有100个topic
100 topic * 5 partition * 2 = 1000 partition
一共partition其实就是物理机上面的一个目录,这个目录下面会有很多个.log文件。.log就是存储数据文件,默认情况下一个.log文件大小是1G。
我们如果要保证1000个partition的最新.log文件的数据都在内存里,这时候性能就是最好,1000 * 1G = 1000G内存。
我们只需要吧当前最新的这个log保证里面的25%的最新数据在内存里面:
0.25G * 1000 = 250G的内存
250G内存 / 5台机器 = 50G
50G + 10G(jvm)= 60G
64G的内存,另外的4G,操作系统本身也需要内存
其实kafka的jvm也可以不用给到10G这么多
评估出来64G是可以的
当然如果能给到128G的内存服务器是最好的。
上面评估的时候用的是一个topic 5个分区,如果数据量比较大的topic可能会有10个分区。
CPU评估
场景总结:搞定10亿请求,需要5台物理机,11(SAS)* 7T,需要64G的内存(128G更好)
评估一下每台服务器需要多少cpu core(资源很有限)
我们评估需要多少个cpu,依据就是看我们的服务里面有多少线程去跑。
线程就是依托cpu去运行的。如果我们的线程比较多,但是cpu core比较少,这样的话,我们的机器负载就会很高,性能就不好。
1)评估一下,kafka的一台服务器启动以后会有多少线程?
Accept线程 默认1
processor线程 默认3 可设置6~9个线程
requestHandler线程 默认8 可设置32个线程
定时清理的线程,拉取数据的线程,定时检查ISR列表的线程,等等。
所以大概一个kafka的服务器启动起来后,会有一百多个线程。
cpu core = 4个,一般来说,几十个线程,就肯定把cpu打满了。
cpu core = 8个,应该能很轻松的支持几十个线程。
如果我们的线程有100多个,或者差不多200个,那么8个线程是搞不定的。
所以我们这儿建议:
cpu core = 16个。如果可以的话,能给到32 cpu core那就更好。
2 cpu * 8 = 16 cpu core
4 cpu * 8 = 32 cpu core
网卡评估
场景总结:搞定10亿请求,需要5台物理机,11(SAS) * 7T,需要64G内存(128G更好),需要16个cpu core(32个更好)
评估我们需要什么样的网卡?
一般要么是千兆网卡(1G/s), 还有就是万兆网卡(10G/s)
高峰期每秒会有5.5万请求涌入,5.5万/5 = 大约每台服务器会有1万请求涌入。
我们之前说过:
10000 * 50kb(消息大小) = 488M,也就是每台服务器每秒要接收488M的数据,数据还要有副本,副本之间的同步也是走的网络请求,488 * 2 = 976M/s
说明一下:
很多公司的数据,一个请求里面是没有50kb这么大的,我们公司是因为主机在生产端封装了数据,然后多条数据合并在一起了,所以我们的一个请求才会有这么大。
一般情况下,网卡的带宽是达不到极限的,如果是千兆网卡,我们能用的一般是700M左右,所以最好情况这里的场景建议使用万兆网卡,如果是万兆网卡就很轻松。
评估结论
搞定10亿请求,需要:
1)5台物理机,11(SAS) * 7T
2)每台机器64G内存(128G更好)
3)每台机器16个cpu core(32个更好)
4)万兆网卡
from 洱海老师
源码:01-源码阅读准备之基础知识准备_哔哩哔哩_bilibili
深入浅出:Kafka 深入浅出_哔哩哔哩_bilibili