1。kafka容量评估需求场景分析1.集群每天10亿+请求是如何做到的?以电商平台为例,kafka集群每天24小时需要承载10亿+请求流量数据。对于平台来说,从中午12:00到早上8:00这8个小时,几乎没有数据涌入。这里我们用“8亿法则”来估算,即80%的数据(8亿)会在剩下的16小时内涌入,8亿数据中的80%(约6.4亿)会在2016小时(约3小时)涌入的百分比。通过以上场景分析,可以得出:QPS计算公式=640000000÷(3*60*60)=60000,也就是说集群在高峰期需要每秒处理60000个并发请求。假设每条数据按20kb平均计算(生产端有数据汇总),即1000000000*20kb=18T。一般我们会设置3个副本,也就是54T。另外,Kafka数据有一个保留时间段。一般是保留最近3天的数据,即54T*3=162T。2.场景总结处理10亿+请求,高峰期支持60000QPS,需要约162T存储空间。二、Kafka容量评估的物理机数量1.物理机OR虚拟机一般在自建Kafka、Mysql、Hadoop等集群时,都是使用物理机进行建设,性能和稳定性要比虚拟机强很多机器。2.物理机数量的计算第一步我们分析系统在高峰期要支持60000QPS。如果公司有足够的资金和资源,我们一般会把高峰期的QPS控制在集群的总QPS上。在这种情况下,可以得出集群可以承载的总QPS容量在20万左右,这样系统就安全了。3.场景总结根据经验可以得出每台物理机支持40000QPS。从QPS的角度来看,我们需要5台左右的物理机来支撑10亿+的请求。考虑到消费者的要求,我们需要增加大约1.5倍的机器,即7台物理机。三、kafka容量测评的磁盘1、机械硬盘OR固态硬盘SSD的主要区别如下:SSD是固态硬盘。它的优点是速度快,日常读写比机械硬盘快几十倍、上百倍。缺点是单位成本高,不适合大容量存储。HDD是机械硬盘。优点是单位成本低,适用于大容量存储,但速度远不如SSD。首先,SSD硬盘性能好主要是指随机读写能力表现好,非常适合像Mysql这样的集群,而SSD的顺序读写性能和机械硬盘差不多.Kafka是顺序写入磁盘的,所以对于Kafka集群,我们可以使用普通的机械硬盘。2、每台服务器需要多少块硬盘根据第一步和第二步的计算结果,我们需要7台物理机,总共需要存储162T的数据,每台机器需要存储23T的数据。根据以往的经验,一般的服务器配备11块硬盘,所以每块硬盘可以存储2T左右的数据。另外,为了服务器的性能和稳定性,我们一般需要预留一部分空间。保守地说,每个硬盘最多可以存储3T的数据。3、场景总结处理10亿+请求,需要7台物理机,使用普通机械硬盘存储,每台服务器11块硬盘,每块硬盘存储2T数据。四、MemoryforKafka容量测评1.Kafka磁盘写入过程及内存分析从上图可以看出,Kafka读写数据的过程主要是基于oscache,所以基本上Kafka对于数据都是基于内存的transfer,so如果是的话,尽可能多的分配内存资源给oscache。kafka的核心源码基本都是用scala和java(客户端)编写的,底层是基于JVM来运行的,所以必须给JVM分配一定的内存来保证服务的稳定性。对于Kafka的设计,很多数据结构并没有存储在JVM中,所以根据经验,给JVM分配6~10G就足够了。从上图可以看出,一个topic会对应多个partition,一个partition会对应多个segment,一个segment会对应磁盘上的4个日志文件。假设我们的平台一共有100个Topic,那么一共有100个Topic*5个partition*3个copy=1500个partition。对于partition,其实就是物理机上的一个文件目录,.log是用来存放数据文件的。默认情况下,.log日志文件的大小为1G。如果要保证这1500个分区最新的.log文件的数据都在内存中,性能当然是最好的,需要1500*1G=1500G内存,但是我们不需要全部数据驻留在内存中,我们只需要保证25%左右的数据在内存中即可,这大约需要1500*250M=1500*0.25G=375G内存。通过第二步的分析结果,我们一共需要7台物理机。这样的话,每台服务器只需要54G左右的内存,加上上面分析的JVM的10G,一共需要64G的内存。内存中也预留了一部分给操作系统使用,所以我们选择128G内存的服务器,还是比较够用的。2.场景总结处理10亿+请求,需要7台物理机,每台物理机内存128G,这样内存会比较充裕。五、Kafka容量评估的CPU压力1、CPUCore分析我们评估需要多少个CPUCore,主要看Kafka进程中会有多少个线程。线程主要由多核CPU执行。如果线程太多,但CPU核少,则CPU负载高,整体工作线程执行效率低,性能也不好。因此,我们需要保证CPUCore充足,以保证系统的稳定性和最佳性能。2.Kafka网络架构和线程数的计算我们评估Kafka服务器启动后会运行多少个线程。其实这部分内容和Kafka的超高并发网络架构息息相关。上图是Kafka的超高并发网络架构图。从图中我们可以分析出:除了上图中列出的,还有其他的线程,所以估计一个kafka服务启动后,会有100多个线程在运行。2.场景总结处理10亿+请求,需要7台物理机。每台物理机的内存主要是128G内存,需要16个CPU核心(32个性能更好)。六、kafka容量测评的网卡1.网卡对比分析通过上图的分析可以得出,千兆网卡和10G网卡最大的区别在于网口的传输速率。千兆网卡的传输速率为1000Mbps,1万兆网卡为10Gbps,是千兆网卡传输速率的10倍。从性能上来说,10G网卡的性能肯定优于千兆网卡。现在10G网卡的主流是10G,发展趋势逐渐面向40G和100G网卡。但是还是要根据使用环境和预算来选择投资。毕竟千兆网卡和10G网卡的性价比范围还是挺大的。2.网卡选型分析根据第一步和第二步的分析结果,在高峰期,每秒大约有60000个请求涌入,即每台机器大约有10000个请求涌入(60000/7),而每秒接收请求数数据大小为:10000*20kb=184M/s,加上数据拷贝的同步网络请求,一共需要184*3=552M/s。一般情况下,网卡带宽不会达到上限。对于千兆网卡,我们可以使用700M左右。根据以上计算结果,千兆网卡基本可以满足要求,10G网卡更好。3.场景总结处理10亿+请求,需要7台物理机。每台物理机主存128G内存,需要16个CPU核(性能较好的32个)。千兆网卡基本可以满足要求,10G网卡更好。4.kafka容量评估的核心参数5.kafka容量评估的集群规划(1)集群部署规划这里我用5台服务器搭建了一个Kafka集群,依赖ZooKeeper,所以在部署Kafka之前需要先部署一个ZooKeeper集群。这里我把Kafka和ZooKeeper一起部署了。Kafka集群节点操作系统依然使用Centos7.7版本。各个主机的角色和软件版本如下表所示:这里注意:Kafka和ZooKeeper的版本,默认自带的Kafka2.11版本ZooKeeper依赖jar包的版本是3.5.7,所以ZooKeeper必须至少为3.5.7及以上版本。(2)下载安装Kafka需要安装Java运行环境。您可以点击Kafka官网(https://kafka.apache.org/downloads)获取Kafka安装包。推荐版本为kafka_2.11-2.4.1.tgz。将下载的安装包直接解压到某个路径即可完成Kafka的安装。在这里,Kafka将安装在/usr/local目录中。我以kafka-zk1主机为例。基本操作流程如下:[root@kafkazk1~]#tar-zxvfkafka_2.11-2.4.1.tgz-C/usr/local[root@kafkazk1~]#mv/usr/local/kafka_2.11-2.4.1/usr/local/kafka这里我创建一个Kafka用户来管理和维护Kafka集群。后续对Kafka的所有操作都是通过这个用户完成的。执行以下操作创建用户并授权:[root@kafkazk1~]#useraddkafka[root@kafkazk1~]#chown-Rkafka:kafka/usr/local/kafka在kafka-zk1节点上安装好kafka后,首先配置Kafka,等待Kafka配置完成,然后打包复制到另外两个节点。broker.id=1listeners=PLAINTEXT://172.16.213.31:9092log.dirs=/usr/local/kafka/logsnum.partitions=6log.retention.hours=72log.segment.bytes=1073741824zookeeper.connect=172.16.213.31:2181,172.16.213.32:2181,172.16.213.33:2181auto.create.topics.enable=truedelete.topic.enable=truenum.network.threads=9num.io.threads=32message.max.bytes=10485760log.flush.interval。message=10000log.flush.interval.ms=1000replica.lag.time.max.ms=10修改Kafka配置文件后,将Kafka安装程序打包,复制到其他4个节点,然后解压。注意,在其他4个节点上,必须修改broker.id,Kafka集群中的broker.id不能相同(唯一)。(3)启动集群5个节点的Kafka配置完成后即可启动,但是在启动Kafka集群之前,需要保证ZooKeeper集群已经正常启动。然后在各个Kafka节点依次执行如下命令:[root@kafkazk1~]#cd/usr/local/kafka[root@kafkazk1kafka]#nohupbin/kafka-server-start.shconfig/server.properties&[root@kafkazk1kafka]#jps21840Kafka15593Jps15789QuorumPeerMain将Kafka放在后台(deamon)运行。启动后,会在Kafka启动的当前目录下生成一个nohup.out文件。您可以查看启动和运行状态。通过jps命令可以看到有一个Kafka的标志,这是Kafka进程启动成功的标志。9.整个场景总结总结:要处理10亿+请求,经过上面的深入分析评估,需要以下资源:
