操作系统
目前常见的操作系统有三种:Linux、Windows和macOs,相比之下Linux系统要更适合,当然部署在Linux上的生产环境是最多的。
Linux系统的优势主要集中在下面的三个方面上:
- I/O模型的使用
- 数据网络传输效率
- 社区支持度
I/O模型的使用
主流的I/O模型通常有五种:阻塞式I/O、非阻塞式I/O、I/O多路复用、信号驱动I/O和异步I/O。
每种 I/O 模型都有各自典型的使用场景,Java 中Socket对象的阻塞模式和非阻塞模式就对应于前两种模型;Linux系统中的系统调用select函数就属于I/O多路复用模型;epoll系统调用介于第三种和第四种之间;第五种模型,很少有linux系统支持,反而是windows系统提供了一个叫IOCP线程模型属于这一种。
Kafka底层使用了Java的selector,selector在Linux上的实现机制式epoll,而在Windows平台上的实现机制是select。因此在这一点上将Kafka部署在Linux上是有优势的,因为能获得更高效的I/O性能。
数据网络传输效率
Kafka需要在磁盘和网络之间进行大量的数据传输,Linux提供了零拷贝(Zero Copy)技术,而在Windows上必须使用Java 8的60更新版本才能使用这个技术。
社区支持度
社区目前对Windows平台上发现的Kafka Bug不做任何承诺。
磁盘
SSD与机械硬盘
kafka使用磁盘的方式多是顺序读写操作,一定程度上规避了机械磁盘最大的劣势,即随机读写慢。从这一点上来说,机械硬盘物美价廉,而它因易损坏而造成的可靠性差等缺陷,又由Kafka在软件曾冕提供机制来保证,故使用普通的机械磁盘是很划算的。
当然,一般我们认为SSD顺序写TPS大约是HDD的四倍,让出现生产者阻塞写入负载偏高是可纵向扩展使用SSD,当然也可横向扩展,增加更多的broker和HDD分散负载
磁盘阵列(RAID)
使用RAID的两个主要优势:
- 提供冗余的磁盘存储空间
- 提供负载均衡
对于Kafka而言,一方面Kafka自己实现了冗余机制来提高可靠性;另一方面通过分区的概念,Kafka也能在软件层面自行实现负载均衡。因此在线上环境使用RAID似乎变得不是那么重要了。
- 追求性价比的公司可以不搭建RAID,使用普通磁盘组成存储空间即可。
- 使用机械磁盘完全能够胜任Kafka线上环境。
磁盘容量
预估容量时,一般要考虑的方面:
- 新增的消息数
- 消息留存时间
- 平均消息大小
- 备份数
- 是否启用压缩
例如:公司业务每天需要向Kafka集群发送一亿条消息,每份消息保存两份以防止消息丢失,另外消息默认保存两周时间。假设一条消息的平均大小是1KB。
每天一亿条1kb大小的消息,保存两份,那么一天使用的磁盘容量大概是 1亿 * 1KB * 2 / 1000 / 1000 = 200GB。一般情况下Kafka集群除了消息数据还有其他类型的数据,比如索引数据等,故我们再为这些数据预留出10%的磁盘空间,因此每天的总存储容量就是220GB。保存两周,即增提容量为220GB * 14,大约3TB左右。Kafka支持数据压缩,假设压缩比是0.75,最后你需要规划的容量大概就是0.75 * 3 = 2.25TB。
带宽
假如你要用一批千兆网卡的服务器处理一个业务的数据,其业务目标或SLA式在一小时内处理1TB的业务数据,那么需要多少台服务来完成的这个业务?
服务器网卡带宽是1Gbps,即每秒处理1Gb的数据,假设每台Kafka服务器都是安装在专属的机器上,也是就是说每台Kafka机器上没有混布其他服务。通常情况下你只能假设Kafka会用到70%的宽带资源,因为总要为其他应用程序或进程留一些资源。根据实际使用经验,超过70%的阈值就有网络丢包的可能性了,故70%的设定是一个比较合理的值,也是就是单台Kafka服务器最多也就能使用大约700Mb的带宽资源。
当然这只是他能使用的最大带宽资源,不能让Kafka服务器常规性使用这么多资源,故通常要再额外预留出2/3的资源,即单台服务器使用带宽700Mb/3 ≈ 240Mbps。这里的2/3其实是相当保守的,你可以结合自己机器的使用情况酌量减少此值。
根据我们的业务目标,一个小时内处理1TB数据,那么一秒大概需要处理1 * 1024 * 1024 * 8 / 60 / 60 ≈ 2336 Mb 的数据,除以240,约等于10台服务器。如果消息还需要额外复制两份,那么总的服务器台数还要乘以3,即30台。
网友评论