Kafka集群搭建解决方案总结

目录

操作系统

磁盘

磁盘容量

带宽

总结


上篇总结了kafka各个版本的差异,了解了改怎样正确选择kafka版本。下面从操作系统,磁盘,带宽各方面来做一下总结。

作为一个集群,当然首先是集群各个节点的机器。平时学习中,我们都是用单台机器做的伪集群。伪集群做测试学习还可以,生产上,绝对是要用真实机器的。

操作系统

我们知道Kafka是由Scala和Java开发的,都是JVM系的语言。而且昨晚Javaer都知道,只要他们编译成*.class字节码后就可以在任何装了虚拟机的操作系统上运行,这叫做跨平台,这叫做Compile once and run everywhere。我们现在要说的不是JVM系语言本身,而是Kafka。我们知道不同操作系统,对有些模式的实现是不一样的。例如我们学netty的时候,就会学netty对不同操作系统的支持,其实就是不同操作系统对I/O操作实现的方式是不一样的,有性能差异。

目前比较主流的操作系统有三个Windows、Linux、macOS。为什么我们平时开发大都用linux做服务器能?我打算从Kafka本身去思考这个问题。总结原因有以下三条:

  • I/O 模型的使用
  • 数据网络传输效率
  • 社区支持度

主流的I/O模型有五种:

阻塞、非阻塞,多路复用,I/O复用(select 和 epoll),信号驱动,异步

这里就不必详细的去理解这些词汇代表的概念了,只需要知道这五种按顺序,一个比一个能,一个比一个高级就行了。其中同样是I/O复用,Linux的epoll就比Windows的select高级性能好。

  1. 我记得在之前学习Netty的时候说netty对三种IO的支持BIO,NIO,AIO,最后Netty取消AIO,原因是NIO Linux支持比Windows好,但是AIO Windows支持比Linux好的多。NIO大概对应的就是复用模型,AIO对应的是异步模型。很少见有人用macOS做服务器吧?我想就算Apple也会想节约成本呢。所以就不考虑它了吧?从I/O性能来讲,肯定Linux是最佳的。
  2. 接下来就是数据网络传输效率,我们知道Kafka传输消息都是同过网络传输的,而消息的保存Kafka的log是写在磁盘上的。Linux有一种技术叫做零拷贝(Zero-copy),先看一张图:

深入剖析Linux IO原理和几种零拷贝机制的实现

我们看到当用户进程发起了一个read()操作一直到结束,用户态和内核态一共切换了两次上下文切换。而零拷贝并不是一次都不拷贝,而是要做到CPU零参与,减少昂贵的内核态拷贝。不占用CPU,CPU就可以去做其他事,从而达到复用的目的,这样操作系统就可以做更多的事,效率就会增加很多很多。像Kafka这种可以支持高吞吐量的,性能的提高,就更不用多说了。至于零拷贝怎么实现的,以后再说。

3.最后是社区支持度,首先Linux开发者肯定是比Windows多得多,当然我们得说Kafka,它在Windows上面的BUG开发人员几乎都是忽视的。所以你知道该怎么选了吧?

磁盘

众所周知,磁盘是影响IO性能的重要因素,固态硬盘在随机读写方面远远超过机械硬盘。但这里建议使用机械硬盘,因为Kafka的顺序读写,刚刚好规避了随机读写性能差的短板,而且它成本低,经济又实用。有人说它易损坏,不用愁啊,Kafka在软件层面就解决了这个问题(副本集)。所以,追求性价比的话,可以不用固态硬盘,机械硬盘完全可以了。

磁盘容量

我们知道,Kafka的消息都是以日志文件的方式追加到磁盘上的,虽然Kafka本省有历史数据的清除机制,有三种日志清除策略可选择:

  1. 基于时间
  2. 基于日志大小
  3. 基于起始偏移量

但是根据业务的需求规划出集群搭建所需磁盘容量。

假设业务需要一个数据的副本,一条消息的大小为1kb,一天有1亿数据的量,消息默认保存两周。那么占的磁盘总量就是1亿*1kb*2/1000/1000 = 200GB 而且还需要预留出10%的空间来存储像索引等数据。那就是220GB的容量。那么两周就是220GB*14天 约等于3TB。Kafka可以压缩数据,如果压缩比例是0.75,那么容量就是3TB *0.75 =2.25TB。总之磁盘容量规划需要get的点有:

  1. 新增消息数量
  2. 消息保留时间
  3. 平均消息大小
  4. 备份数据的份数
  5. 是否数据压缩

带宽

kafka这种大量进行网络传输的框架来说,贷款很容易变成它的瓶颈。如果还要跨机房传输,那情况会更糟。

假设是千兆网也就是1Gbps。如果业务需求是一小时处理1TB的数据,那么需要多少kafka服务台机器来完成这件事情呢?

通常你还需要给其他业务预留30%的带宽,也就是说你最多只能用70%,就是700Mb。这只是它能使用的最大带宽,相当保守估计,你需要预留出2/3的带宽资源(这部分资源是预留给像操作系统其它进程还有follower拉取leader数据所占的带宽资源)。你可以根据你的业务实际情况酌情减小这个值。那么单台可用带宽资源就是700Mb/3 ≈240Mbps。现在带宽有了我们就可以计算一小时处理1TB数据所需机器数量了,1024/3600 = 0.284GB/s = 285MB/s,285MB/s*8=2280Mb,所以就是2280Mb/240Mb ≈10,就是10台机器,如果要两个副本集,那就是 要乘以3,就是30台。

总结

所谓工欲善其事必先利其器,如果项目上线了再去调整这些,会很麻烦,所以在集群搭建的过程中我们就要把方方面面的因素考虑到。

说明:

  1. 文中的B值的是Byte ,b指的是bit
  2. 1Byte  = 8bit
  3. 文中的70%来自实际经验,超过这个值会出现网络丢包的风险

注:图片来自极客时间

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值