当前位置 博文首页 > Shockang的博客:Kafka 的线上集群部署方案是怎样的?

    Shockang的博客:Kafka 的线上集群部署方案是怎样的?

    作者:[db:作者] 时间:2021-08-23 22:10

    前言

    本文隶属于专栏《1000个问题搞定大数据技术体系》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!

    本专栏目录结构和参考文献请见1000个问题搞定大数据技术体系

    正文

    方案背景

    假设每天集群需要承载10亿数据。一天24小时,晚上12点到凌晨8点几乎没多少数据。

    使用二八法则估计,也就是80%的数据(8亿)会在16个小时涌入,而且8亿的80%的数据(6.4亿)会在这16个小时的20%时间(3小时)涌入。

    QPS计算公式=640000000÷(36060)=6万,也就是说高峰期的时候咱们的Kafka集群要抗住每秒6万的并发。

    磁盘空间计算,每天10亿数据,每条50kb,也就是46T的数据。

    保存2副本,46*2=92T,保留最近3天的数据。故需要 92 * 3 = 276T

    QPS角度

    部署Kafka,Hadoop,MySQL,大数据核心分布式系统,一般建议大家直接采用物理机,不建议用一些低配置的虚拟机。

    QPS这个东西,不可能是说,你只要支撑6万QPS,你的集群就刚好支撑6万QPS就可以了。

    假如说你只要支撑6w QPS,2台物理机绝对绝对够了,单台物理机部署kafka支撑个几万QPS是没问题的。

    但是这里有一个问题,我们通常是建议,公司预算充足,尽量是让高峰QPS控制在集群能承载的总QPS的30%左右,所以我们搭建的kafka集群能承载的总QPS为20万~30万才是安全的。

    所以大体上来说,需要5~7台物理机来部署,基本上就很安全了,每台物理机要求吞吐量在每秒几万条数据就可以了,物理机的配置和性能也不需要特别高。

    磁盘角度

    磁盘的数量

    我们现在需要5台物理机,需要存储276T的数据,所以大概需要每台存储60T的数据,公司一般的配置是11块盘,这样的话,我们一个盘7T就搞定。

    SAS盘还是SSD盘?

    现在我们需要考虑一个问题:是需要SSD固态硬盘,还是普通机械硬盘?

    SSD就是固态硬盘,比机械硬盘要快,那么到底是快在哪里呢?

    其实SSD的快主要是快在磁盘随机读写,就要对磁盘上的随机位置来读写的时候,SSD比机械硬盘要快。

    像比如说是MySQL这种系统,就应该使用SSD了。

    比如说我们在规划和部署线上系统的MySQL集群的时候,一般来说必须用SSD,性能可以提高很多,这样MySQL可以承载的并发请求量也会高很多,而且SQL语句执行的性能也会提高很多。

    Kafka集群,物理机是用昂贵的SSD呢?还是用普通的机械硬盘呢?

    因为写磁盘的时候kafka是顺序写的。

    机械硬盘顺序写的性能机会跟内存读写的性能是差不多的,所以对于Kafka集群来说我们使用机械硬盘就可以了。

    内存角度

    kafka自身的jvm是用不了过多堆内存的,因为kafka设计就是规避掉用jvm对象来保存数据,避免频繁fullgc导致的问题,所以一般kafka自身的jvm堆内存,分配个10G左右就够了,剩下的内存全部留给os cache。

    那服务器需要多少内存够呢?

    我们估算一下,大概有100个topic,所以要保证有100个topic的leader partition的数据在os chache里。

    100个topic,一个topic有5个partition。那么总共会有500个partition。

    每个partition的大小是1G,我们有2个副本,也就是说要把100个topic的leader partition数据都驻留在内存里需要1000G的内存。

    我们现在有5台服务器,所以平均下来每天服务器需要200G的内存,但是其实partition的数据我们没必要所有的都要驻留在内存里面,只需要25%的数据在内存就行,200G * 0.25 = 50G就可以了。

    所以一共需要60G的内存,故我们可以挑选64G内存的服务器也行,大不了partition的数据再少一点在内存,当然如果是128G内存那就更好。

    需要多少CPU?

    CPU规划,主要是看你的这个进程里会有多少个线程,线程主要是依托多核CPU来执行的,

    如果你的线程特别多,但是CPU核很少,就会导致你的CPU负载很高,会导致整体工作线程执行的效率不太高,

    在Kafka的Broker中,acceptor线程负责去接入客户端的连接请求,但是他接入了之后其实就会把连接分配给多个processor,默认是3个,

    但是说实话一般生产环境的话呢 ,建议大家还是多加几个,整体可以提升kafka的吞吐量比如说你可以增加到6个,或者是9个。

    另外就是负责处理请求的线程,是一个线程池,默认是8个线程,在生产集群里,建议大家可以把这块的线程数量稍微多加个2倍~3倍,

    其实都正常,比如说搞个16个工作线程,24个工作线程。

    后台会有很多的其他的一些线程,比如说定期清理7天前数据的线程,Controller负责感知和管控整个集群的线程,副本同步拉取数据的线程,这样算下来每个broker起码会有上百个线程。

    根据经验4个cpu core,一般来说几十个线程,在高峰期CPU几乎都快打满了

    8个cpu core,也就能够比较宽裕的支撑几十个线程繁忙的工作。

    所以Kafka的服务器一般是建议16核,基本上可以hold住一两百线程的工作。当然如果可以给到32 cpu core那就最好不过了。

    网卡角度

    现在的网基本就是千兆网卡(1GB / s),还有万兆网卡(10GB / s)。

    kafka集群之间,broker和broker之间是会做数据同步的,因为leader要同步数据到follower上去,他们是在不同的broker机器上的,broker机器之间会进行频繁的数据同步,传输大量的数据。

    每秒两台broker机器之间大概会传输多大的数据量?

    高峰期每秒大概会涌入6万条数据,约每天处理10000个请求,每个请求50kb,故每秒约进来488M数据,我们还有副本同步数据,故高峰期的时候需要488M * 2 = 976M/s的网络带宽,所以在高峰期的时候,使用千兆带宽,网络还是非常有压力的。

    总结:推荐的Kafka集群配置

    10亿数据,6w/s的吞吐量,276T的数据,5台物理机
    硬盘:11(SAS) * 7T,7200转
    内存:64GB/128GB,JVM分配10G,剩余的给os cache
    CPU:16核/32核
    网络:千兆网卡,万兆更好

    cs