kafka 线上真实环境实战及调优进阶系列
本套系列博客从真实商业环境抽取案例进行总结和分享,并给出kafka商业应用的调优建议和集群环境容量规划等内容,请持续关注本套博客。版权声明:本套kafka调优系列版权归做者(秦凯新)全部,禁止转载,欢迎学习。java
kafka真实环境部署规划
1. 操做系统选型
由于kafka服务端代码是Scala语言开发的,所以属于JVM系的大数据框架,目前部署最多的3类操做系统主要由Linux ,OS X 和Windows,可是部署在Linux数量最多,为何呢?由于I/O模型的使用和数据网络传输效率两点。缓存
- 第一:Kafka新版本的Clients在设计底层网络库时采用了Java的Select模型,而在Linux实现机制是epoll,感兴趣的读者能够查询一下epoll和select的区别,明确一点就是:kafka跑在Linux上效率更高,由于epoll取消了轮询机制,换成了回调机制,当底层链接socket数较多时,能够避免CPU的时间浪费。
- 第二:网络传输效率上。kafka须要经过网络和磁盘进行数据传输,而大部分操做系统都是经过Java的FileChannel.transferTo方法实现,而Linux操做系统则会调用sendFile系统调用,也即零拷贝(Zero Copy 技术),避免了数据在内核地址空间和用户程序空间进行重复拷贝。
2. 磁盘类型规划
- 机械磁盘(HDD) 通常机械磁盘寻道时间是毫秒级的,如有大量随机I/O,则将会出现指数级的延迟,可是kafka是顺序读写的,所以对于机械磁盘的性能也是不弱的,因此,基于成本问题能够考虑。
- 固态硬盘(SSD) 读写速度可观,没有成本问题能够考虑。
- JBOD (Just Bunch Of Disks ) 经济实惠的方案,对数据安全级别不是很是很是高的状况下能够采用,建议用户在Broker服务器上设置多个日志路径,每一个路径挂载在不一样磁盘上,能够极大提高并发的日志写入速度。
- RAID 磁盘阵列 常见的RAID是RAID10,或者称为(RAID 1+0) 这种磁盘阵列结合了磁盘镜像和磁盘带化技术来保护数据,由于使用了磁盘镜像技术,使用率只有50%,注意,LinkedIn公司采用的就是RAID做为存储来提供服务的。那么弊端在什么地方呢?若是Kafka副本数量设置为3,那么实际上数据将存在6倍的冗余数据,利用率实在过低。所以,LinkedIn正在计划更改方案为JBOD.
3. 磁盘容量规划
咱们公司物联网平台天天大约可以产生一亿条消息,假设副本replica设置为2 (其实咱们设置为3),数据留存时间为1周,平均每条上报事件消息为1K左右,那么天天产生的消息总量为:1亿 乘 2 乘 1K 除以 1000 除以 1000 =200G磁盘。预留10%的磁盘空间,为210G。一周大约为1.5T。采用压缩,平均压缩比为0.5,总体磁盘容量为0.75T。 关联因素主要有:安全
- 新增消息数
- 副本数
- 是否启用压缩
- 消息大小
- 消息保留时间
4. 内存容量规划
kafka对于内存的使用,并不过多依赖JVM 内存,而是更多的依赖操做系统的页缓存,consumer若命中页缓存,则不用消耗物理I/O操做。通常状况下,java堆内存的使用属于朝生夕灭的,很快会被GC,通常状况下,不会超过6G,对于16G内存的机器,文件系统page cache 能够达到10-14GB。服务器
- 怎么设计page cache,能够设置为单个日志段文件大小,若日志段为10G,那么页缓存应该至少设计为10G以上。
- 堆内存最好不要超过6G。
5. CPU选择规划
kafka不属于计算密集型系统,所以CPU核数够多就能够,而没必要追求时钟频率,所以核数选择最好大于8。网络
6. 网络带宽决定Broker数量
带宽主要有1Gb/s 和10 Gb/s 。咱们能够称为千兆位网络和万兆位网络。举例以下: 咱们的物联网系统一天每小时都要处理1Tb的数据,咱们选择1Gb/b带宽,那么须要选择多少机器呢?并发
- 假设网络带宽kafka专用,且分配给kafka服务器70%带宽,那么单台Borker带宽就是710Mb/s,可是万一出现突发流量问题,很容易把网卡打满,所以在下降1/3,也即240Mb/s。由于1小时处理1TTB数据,每秒须要处理292MB,1MB=8Mb,也就是2336Mb数据,那么一小时处理1TB数据至少须要2336/240=10台Broker数据。冗余设计,最终能够定为20台机器。
典型推荐
- cpu 核数 32
- 内存 32GB
- 磁盘 3TB 7200转 SAS盘三块
- 带宽 1Gb/s
结语
秦凯新 于深圳 2018-10-27框架