所谓线上部署环境,其实无非就是操作系统的选择,以及存储介质磁盘的选择,内存大小的选择,cpu的选择,网络带宽的选择。
除了操作系统意外,剩下的影响因子任何一个到了瓶颈,都相当于是短板,将会制约整体性能的发挥。
其实不光是部署kafka要考虑这些因素。部署其他的也是一样从这几个点出发,来考虑究竟应该如何选择环境。
如何择操作系统这里简单的说一下kafka原理,之所以kafka有着极高的吞吐量,和kafka的写入速度以及读的速度有很大的关系。同样都是写磁盘,为啥kafka就能做到这么快呢?
实际上消息队列有一个现象,就是顺序的写入,以及顺序的读取。中间不会对数据有什么修改操作。这样以来,实际上可以对磁盘顺序访问。并且kafka是把数据写到了操作系统的页缓存中。kafka读取消息首先尝试从页缓存中读取,如果命中直接把消息发送到网络的Socket上。这个过程是利用linux系统的内核级函数 sendFile做到的。而sendFile就是系统为我们提供实现零拷贝的函数。
想要用到这一个优化,我们最好选择主流的linux环境来部署kafka。
如果你还有疑问,我使用windows怎么了,有什么问题?我这里再多解释一下:kafka新版的clients再和解底层网络库时采用了Java的Selector机制,这在linux下对用的是epoll,而在windows上,java的Selector是使用的select模型,而不是多路复用。部署在linux相比window下可以获得更好的IO性能。
如何选择磁盘呢其实就几个关键的问题:
- 机械硬盘 or 固态硬盘
- 组不组磁盘矩阵 也就是 DAID 0
- 磁盘容量大小问题
先说一下固态硬盘优势所在:相比机械硬盘它的寻道时间更短。当然这个就是是针对随机访问磁盘这个场景的。再多说一点,机械硬盘是通过磁头旋转来找到数据的,而固态硬盘没有这个过程。机械硬盘和固态硬盘的对比
根据kafka的存储原理,它用到了是磁盘的顺序读。正是这一点,kafka规避掉了机械硬盘在随机读的劣势。因此,部署kafka 的机器实际上,使用普通机械硬盘就足够了。
如果想要有更好的突破,愿意承担固态硬盘的成本的话。固态硬盘是更好的选择。
组不组磁盘矩阵 也就是 DAID 0不组磁盘矩阵也是可以的。
组磁盘矩阵的好处是可以冗余数据,一定程度上可以避免数据的丢失。可以提供天然的数据负载均衡。但是kafka本身就为我们提供了数据负载均衡,以及避免数据丢失的机制。其实就是数据副本以及partition。
另外有一个小技巧,可以为我们的kafka节点配置多个日志路径,并且每个日志路径单独挂在不同的磁盘上,这样可以让多块磁盘磁头同时工作,可以加速kafka的生成消息的速度。
磁盘容量问题这个要根据公式:估算出容量大小,压缩比例是需要开启压缩配置的。另外还需要多出来百分10的磁盘空间用于系统产生的数据文件。
生产消息的速度 * 单条消息的大小*消息保留的时间*副本的个数 * 压缩比例
关于CPU选择kafaka 是IO密集型的应用,如果要为了节省消息传输占用的带宽,可以开启压缩。如果开启压缩,就要用到额外的CPU。
kafka最好配置 8核以上,如果开启压缩,则更多核心数。
关于带宽实际上在带宽一定的情况下,我们应该合理的根据需求估算出kafka节点的个数。
举个栗子(这个栗子是:《kafka实战》这本书中的)
如果业务需求时一个小时1T消息,我们网络带宽是 1Gb/s。一般情况下,不要把kafka和其他服务部署在一起。kafka对带宽的占用是非常高的,毕竟是用来做实时传输的。kafka一般使用百分之七十的带宽,这个具体值可以再根据实际情况去压测。防止在高带宽情况下丢包。这是在资源到达极限的情况下的占用,我们还要考虑到突发情况,万一流量倍增。我们可以预留三倍的增长流量增长空间。也就是1Gb * 0.7 * 0.33 约等于240Mb。在1Gb/s 的带宽下,240M/s 就是单个kafka节点的处理能力。其中我们预留出来了三倍的突发流量增长空间,也就是我们只用了三分之一的带宽。 每小时1T的业务数据,换算成秒就是 1T / 3600 约等于 2336Mb/s 。再根据我们单台kafka节点的处理能力,实际上我们差不多需要10个kafka节点,才能,满足每个小时1T的业务流量的需求。
另外避免多机房组成服务机集群。
最后来一个典型的环境案例:
cpu 24核
内存32G
磁盘 1TB
带宽1Gb/s
读书笔记,内容来源于《kafka实战》