1. 需求分析
因为我的公司是属于零售业务,我就拿电商平台来说
电商平台,假设每天有10亿请求都需要发送到kafka上面,28原则的话
10亿请求是通过24个小时来进行发送的,一般情况下,零点到早上8点这段时间是没有多大的数据量的,百分之80的请求都是需要另外的16个小时来进行
处理的,其实16个小时也并不是每个小时都是高峰,我们采用28原则,其实真正的高峰是有3个小时的,那么我们高峰qps也就是 5.5W
2. kafka物理机数量的评估
其实在生产环境中,像Kafka、MySQL、Hadoop等这些基础服务搭建的时候我们一般使用的都是物理机,那么我们搭建kafka的时候也应该选择物理机
我们根据场景来看,假如我们高峰期的请求是每秒5.5W个,那么我们其实1-2台服务器就可以搞定了,但是我们业务也是会有增长的,万一以后增长的话,我们机器不够了,那么别人会认为是你的评估不准确,这个时候我们一般评估会为QPS的4倍左右,当然这个是根据我们公司的情况来决定的,现在都流行开源节流,我们评估一台服务器都很困难,你去找领导汇报的时候要这么多集群肯定是不合适的,当然这个是根据自己的公司情况来看。我们先按照常规的来评估,我们每秒5W QPS那么4倍就是20W QPS 那么我们的集群的能力要规划到每秒20W的QPS,这个时候我们大概需要5台服务器就足够了,每一台都可以抗的住4万的请求
3. Kafka磁盘评估
SSD固态硬盘比较贵,普通的机械硬盘比较便宜,这个时候我们就需要来进行规划一下
SSD硬盘: 性能比较好指的是随机读写的性能比较好适合MySQL、Zookeeper这样的组件,价格贵
**SAS硬盘:**某方面性能不是很好,例如它的随机读写性能不是很好,但是顺序读写的性能比较好,比较便宜
根据我们对kafka的理解:
Kafka就是顺序写硬盘的,故我们选择普通的sas盘就可以了。
那么我们每台需要多少块硬盘呢?
假如我们一条消息1K,20W QPS,一台机器就是4T,那么一天就是20T,那么我们存储三天,应该是60T,其实kafka并不是立即删除数据,其实我们并不会
把所有的磁盘都写满,这个时候我们应该有冗余的数据,一般为磁盘的0.8为使用,这样我们每台服务器就需要75T数据,
那么一台机器挂10个硬盘一个硬盘8T应该是够用了 这样总共可以存储的数据为 400T
4. Kafka网络需求评估
千兆网卡: 1G/s
**万兆网卡:**10G/s
我们之前高峰期是每秒5.5W的请求,我们要为以后做考虑,那么就是每秒20W,这样每台机器4W的请求
这样的话,假设我们的数据最大一条是20KB,那么40000*20KB 其实很多公司都达不到20KB,
20KB * 4W = 781M每秒,那么我们kafka还有副本同步呢
781M * 2 = 1562 M
那么这个时候我们千M网卡肯定是已经不具备了,那么我们采用万兆网卡肯定是够的
5. Kafka 内存评估
5.1 我们先来看看我们kafka的写数据流程
5.2 内存规划
我们可以发现kafka读写数据的流程都是基于os cache的 ,换句话说,我们的os cache无限大,那么整个kafka是不是就可以基于我们内存去操作
但是我们内存是有限的
kafka的设计,没有把很多数据结构都放在jvm里面,所以我们的这个jvm不需要太大的内存,和Namenode有点不一样因为Namenode的元数据例如目录树等是放在jvm的内存里面的
假设 10亿请求,一共有100个topic,假设100 topic 有 5个 partiiton 还有副本数2个
一个parition其实就是物理机上面的一个目录,这个目录下面会有很多个。log文件
其实log文件就是我们存储数据的文件,默认一个log文件是1G,我们如果要保证1000个partition的最新数据都是存在内存里面的话,
那么我们就需要1000G内存,那么哪里有这么多内存啊,我们只需要保证百分之25的最新数据在内存里面,
也就是说,我们有1000个文件,每个文件最新的一部分在内存里面就好了,这样的话
250M * 1000 paritiion = 250G内存
那么我们有5台机器 250G/5 = 50G内存,
我们还需要分给内存和系统 那么大概每台机器64G就差不多了
当然最好的情况下给128G内存,这样可以保证最新的百分之50在内存里面
6. Kafka CPU 评估
评估每台服务器需要多少cpu core (资源很有限)
评估cpu是根据我们的服务器里面有多少线程
如果我们线程比较多吗,但是cpu core比较少,这样我们的机器的负载会很高,性能就会很不好
如果看过源码的话,那么我们应该知道每台服务端有几个线程大户
- Acceptor线程 1
- processor线程 3
- 处理请求的线程默认有 8个
- 定时清理的线程 拉取数据的线程 ISR线程等等
所以大概1个kafka的服务启动起来以后,会有一百多个线程
一些经验值:
cpu core = 4个的话, 几十个线程就把cpu打满了
cpu core = 8个的话,几十个线程能够轻松应对
如果我们的线程 100多个 或者差不多200个,那么 8个cpu core 是肯定搞不定的
cpu core 16个 如果可以的话,可以满足 当然 32个 core 当然最好
2C 8核 也行,当然4C 8核 最好
7. Kafka集群压力测试
https://www.cnblogs.com/xiao987334176/p/10075659.html
其他
- 有条件 zk 和 kafka部署分开
- ZK集群有条件的可以上SSD