Kafka -- 线上部署
操作系统
Linux的表现更胜一筹:IO模型的使用、网络传输效率、社区支持度
IO模型
- 主流的IO模型:阻塞式IO、非阻塞式IO、IO多路复用、信号驱动IO、异步IO,后一种模型比前一种高级
- Java中的Socket对象的阻塞模式和非阻塞模式,对应阻塞式IO和非阻塞式IO
- Linux中的系统调用select函数属于IO多路复用模型
- 大名鼎鼎的epoll系统调用则介于第三种模型和第四种模型之间
- 很少有Linux系统支持异步IO,Windows系统提供的IOCP线程模型属于异步IO
- Kafka客户端底层使用了Java的selector,selector在Linux上的实现机制是epoll,在Windows上是select
- Kafka部署在Linux上,能够获得更高效的IO性能
网络传输效率
- Kafka生产和消费的消息都是通过网络传输的,而消息是保存在磁盘上的
- 因此Kafka需要在磁盘和网络间进行大量的数据传输
- Linux支持零拷贝技术
- 当数据在磁盘和网络进行传输时,避免昂贵的内核态数据拷贝,从而实现快速的数据传输
- 在Windows平台必须等待Java 8 Update 60才能享受到类似Linux零拷贝的福利,而Linux早就支持
社区支持度
- 社区目前对在Windows平台上发现的Bug不做任何承诺
- WIndows平台上部署Kafka只适用于个人测试或用于功能验证,不能应用于生产环境
磁盘类型
- Kafka大量使用磁盘,但使用的方式多为顺序读写操作,一定程度上规避了机械硬盘的最大劣势,随机IO
- 所以SSD并没有太大的性能优势,而且机械硬盘物美价廉
- 机械硬盘易损坏而造成的可靠性差等缺陷,又由Kafka在软件层面提供机制来保证,故使用机械硬盘性价比很高
- RAID的主要优势:提供冗余的磁盘存储空间、提供负载均衡
- Kafka自身实现了冗余机制(副本)来提供高可靠性
- Kafka通过分区的概念,在软件层面实现了负载均衡
- 小结
- 如果追求性价比,可以不搭建RAID,使用普通磁盘组成存储空间即可
- 使用机械硬盘完全能胜任Kafka线上环境
磁盘容量
- 场景:每天需要向Kafka集群发送一亿条消息,每条消息保存两份,默认保存两周,消息平均大小为1KB
- 100,000,000 * 1KB * 2 / 1000 / 1000 = 200GB
- 一般情况下,Kafka集群除了消息数据还有其他类型的数据,比如索引数据,为这些数据预留10%的磁盘空间,220GB
- 保存两周,220GB * 14 ≈ 3TB
- Kafka支持数据压缩,假设压缩比为0.75,3TB * 0.75 = 2.25TB
- 预留20%的磁盘空间,2.25TB / 0.8 ≈ 2.bTB
- 考虑的因素
- 新增消息数
- 消息留存时间
- 平均消息大小
- 备份数
- 是否启动压缩
带宽
- 常见带宽:1Gbps(千兆网络,常见配置)、10Gbps(万兆网络)
- 场景:机房环境为1Gbps,某个业务的SLA是一个小时内处理1TB的业务数据
- 假设每台Kafka服务都部署在专属的机器上,Kafka最多会用到机器上70%的带宽资源(超过70%,可能会网络丢包)
- 即单台Kafka服务器最多能使用700Mbps的带宽资源
- 通常情况下,需要额外预留2/3的资源,即单台服务器使用带宽为700Mbps / 3 ≈ 240Mbps
- 需要的服务器数量:1TB / 3600s / 240Mbps ≈ 10,如果备份数量为3,那需要的服务器数量为30
参考资料
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.