操作系统

Linux的表现更胜一筹:IO模型的使用网络传输效率社区支持度

IO模型

  1. 主流的IO模型:阻塞式IO、非阻塞式IO、IO多路复用、信号驱动IO、异步IO,后一种模型比前一种高级
    • Java中的Socket对象的阻塞模式和非阻塞模式,对应阻塞式IO和非阻塞式IO
    • Linux中的系统调用select函数属于IO多路复用模型
    • 大名鼎鼎的epoll系统调用则介于第三种模型和第四种模型之间
    • 很少有Linux系统支持异步IO,Windows系统提供的IOCP线程模型属于异步IO
  2. Kafka客户端底层使用了Java的selector,selector在Linux上的实现机制是epoll,在Windows上是select
    • Kafka部署在Linux上,能够获得更高效的IO性能

网络传输效率

  1. Kafka生产和消费的消息都是通过网络传输的,而消息是保存在磁盘上的
    • 因此Kafka需要在磁盘网络间进行大量的数据传输
  2. Linux支持零拷贝技术
    • 当数据在磁盘网络进行传输时,避免昂贵的内核态数据拷贝,从而实现快速的数据传输
    • 在Windows平台必须等待Java 8 Update 60才能享受到类似Linux零拷贝的福利,而Linux早就支持

社区支持度

  1. 社区目前对在Windows平台上发现的Bug不做任何承诺
  2. WIndows平台上部署Kafka只适用于个人测试或用于功能验证,不能应用于生产环境

磁盘类型

  1. Kafka大量使用磁盘,但使用的方式多为顺序读写操作,一定程度上规避了机械硬盘的最大劣势,随机IO
    • 所以SSD并没有太大的性能优势,而且机械硬盘物美价廉
  2. 机械硬盘易损坏而造成的可靠性差等缺陷,又由Kafka在软件层面提供机制来保证,故使用机械硬盘性价比很高
  3. RAID的主要优势:提供冗余的磁盘存储空间、提供负载均衡
    • Kafka自身实现了冗余机制(副本)来提供高可靠性
    • Kafka通过分区的概念,在软件层面实现了负载均衡
  4. 小结
    • 如果追求性价比,可以不搭建RAID,使用普通磁盘组成存储空间即可
    • 使用机械硬盘完全能胜任Kafka线上环境

磁盘容量

  1. 场景:每天需要向Kafka集群发送一亿条消息,每条消息保存两份,默认保存两周,消息平均大小为1KB
  2. 100,000,000 * 1KB * 2 / 1000 / 1000 = 200GB
  3. 一般情况下,Kafka集群除了消息数据还有其他类型的数据,比如索引数据,为这些数据预留10%的磁盘空间,220GB
  4. 保存两周,220GB * 14 ≈ 3TB
  5. Kafka支持数据压缩,假设压缩比为0.75,3TB * 0.75 = 2.25TB
  6. 预留20%的磁盘空间,2.25TB / 0.8 ≈ 2.bTB
  7. 考虑的因素
    • 新增消息数
    • 消息留存时间
    • 平均消息大小
    • 备份数
    • 是否启动压缩

带宽

  1. 常见带宽:1Gbps(千兆网络,常见配置)、10Gbps(万兆网络)
  2. 场景:机房环境为1Gbps,某个业务的SLA是一个小时内处理1TB的业务数据
  3. 假设每台Kafka服务都部署在专属的机器上,Kafka最多会用到机器上70%的带宽资源(超过70%,可能会网络丢包
    • 即单台Kafka服务器最多能使用700Mbps的带宽资源
  4. 通常情况下,需要额外预留2/3的资源,即单台服务器使用带宽为700Mbps / 3 ≈ 240Mbps
  5. 需要的服务器数量:1TB / 3600s / 240Mbps ≈ 10,如果备份数量为3,那需要的服务器数量为30

参考资料

Kafka核心技术与实战