一、操作系统的选型
目前布署kafka最多的三种操作系统:linux、 os x 、 windows
Linux 要比windows等其他操作系统更适合布署kafka,原因二点:
1、epoll I/O模型的使用,在linux上能够获得比windows更高效的I/O处理性能;
2、Linux会采用零拷贝技术获得更高的数据网络传输效率(JDK8以后,windows已正式让FileChannel的transferTo方法调用TransmitFile函数,可以享受零拷贝技术带来的高效传输);
二、磁盘选择
1、选择SSD(固态硬盘)还是HDD(机械硬盘)?
机械硬盘是磁头寻道,随机I/O操作,很慢,但顺序I/O操作,机械硬盘也是不弱的;
kafka是顺序写磁盘的,所以从磁盘的使用上看,两者并不会有存在着巨大的差异;
对于预算有限又追求高性价比的公司而言,机械硬盘完成可以胜任kafka的存储任务,当然SSD更好;
2、使用JBOD(一堆普通磁盘) 还是RAID(磁盘阵列)?
- 能用得起RAID最好,追求性价比的公司可以考虑使用 JBOD,
- 另外推荐用户为每个 broker 都配置多个日志路径,每个路径都独立挂载在不同的磁盘上,这使得多块物理磁盘磁头同时执行物理 I/O 操作,可以极大地加速 Kafka 消息生产的速度。
- 最后关于磁盘的一个建议就是,尽量不要使用NAS这样的网络存储设备,性能很差,不比一台笔记本电脑的硬盘强多少,平时延时有很大的不稳定性。
三、磁盘容量规划

四、内存规划
首先讲一下kafka是怎么使用内存的,kafka虽然会持久化每一条消息,但其实这个工作是操作系统底层的文件系统来完成的,kafka仅将消息写入page cache,之后将消息“冲刷”到磁盘的任务完成交由操作系统完成。
另外consumer在读取消息时也首先尝试从该区域中查找,如果直接命中则完全不用执行耗时的物理I/O操作,从而提升了consumer的整体性能;无论是缓冲已发送消息还是待读取消息,操作系统都要先开辟一块内存区域用于存放接收的kafka消息,因此这块内存区域大小的设置对于kafka的性能就显得尤为关键了。
内存建议:
- 尽量分配更多的内存给操作系统的 page cache
- 不要为 broker 设置过大的堆内存,最好不超过 6GB
- page cache 大小至少要大于一个日志段的大小,确保直接命中。
五、CPU规划
kafka不属于计算密集型系统,追求多核而非高时钟频率。
建议:
- 使用多核系统, CPU 核数最好大于8。
- 如果使用 Kafka 0.10 0.0 之前的版本或 clients 端与 broker 端消息版本不一致(若无显式 配置,这种情况多半由 clients broker 版本不一致造成),则考虑多配置 些资源以防止消息解压缩操作消耗过多 CPU。
六、带宽规划
首先kafka是通过网络传输大量数据的,所以带宽资源至关重要,并且特别容易成为系统的瓶颈,所有低延时的网络以及高带宽有助于实现kafka集群的高吞吐量以及用户请求处理低延时。
下面举例说明如何根据自身网络条件和带宽来评估 Kafka 集群机器数量:
网络环境中使用的是1Gb/s的带宽,用户的业务目标是每天1小时处理完成1TB的业务消息,我们计算一下需要多少台机器;
首先计算单台broker能使用的带宽:
1Gb/s * 70%(单台分配70%的带宽资源给kafka)* 1/3(防止峰值把网卡打满) ≈ 240Mb/s 注:1Gb/s = 1024Mb/s (每秒兆比特,注意与平常使用的兆字节MB单位区分)
1TB的业务数据 = 1048576 MB/3600秒 ≈ 291MB/s,即要处理完这些消息,要每秒处理完成291MB的数据,换算成Mb,以1MB = 8Mb的公式换算,就是291 *8 =2328Mb/s 。
2328/240 ≈ 10台broker机器,如果副本是2,这个数据还要翻一倍,即20台borker机器。
- 尽量使用高速网络。
- 根据自身网络条件和带宽来评估 Kafka 集群机器数量。
- 避免使用跨机房网络。
七、典型线上环境配置
下面给出一份典型的线上环境配置,用户可以参考这份配置以及结合自己的实际情况进行二次调整:
- CPU 24 核
- 内存 32GB
- 磁盘 lTB 7200 SAS 盘两块
- 带宽1Gb/s
- ulimit -n 1000000
- Socket Buffer 至少64KB,适用于跨机房网络传输