2.4 硬件的选择
为Kafka选择合适的硬件更像是一门艺术。Kafka本身对硬件没有特别的要求,它可以运行在任何系统上。不过,如果比较关注性能,那么就需要考虑几个会影响整体性能的因素:磁盘吞吐量和容量、内存、网络和CPU。在确定了性能关注点之后,就可以在预算范围内选择最优化的硬件配置。
2.4.1 磁盘吞吐量
生产者客户端的性能直接受到服务器端磁盘吞吐量的影响。生产者生成的消息必须被提交到服务器保存,大多数客户端在发送消息之后会一直等待,直到至少有一个服务器确认消息已经成功提交为止。也就是说,磁盘写入速度越快,生成消息的延迟就越低。
在考虑硬盘类型对磁盘吞吐量的影响时,是选择传统的机械硬盘(HDD)还是固态硬盘(SSD),我们可以很容易地作出决定。固态硬盘的查找和访问速度都很快,提供了最好的性能。机械硬盘更便宜,单块硬盘容量也更大。在同一个服务器上使用多个机械硬盘,可以设置多个数据目录,或者把它们设置成磁盘阵列,这样可以提升机械硬盘的性能。其他方面的因素,比如磁盘特定的技术(串行连接存储技术或SATA),或者磁盘控制器的质量,都会影响吞吐量。
2.4.2 磁盘容量
磁盘容量是另一个值得讨论的话题。需要多大的磁盘容量取决于需要保留的消息数量。如果服务器每天会收到1TB消息,并且保留7天,那么就需要7TB的存储空间,而且还要为其他文件提供至少10%的额外空间。除此之外,还需要提供缓冲区,用于应付消息流量的增长和波动。
在决定扩展Kafka集群规模时,存储容量是一个需要考虑的因素。通过让主题拥有多个分区,集群的总流量可以被均衡到整个集群,而且如果单个broker无法支撑全部容量,可以让其他broker提供可用的容量。存储容量的选择同时受到集群复制策略的影响(将在第6章讨论更多的细节)。
2.4.3 内存
除了磁盘性能外,服务器端可用的内存容量是影响客户端性能的主要因素。磁盘性能影响生产者,而内存影响消费者。消费者一般从分区尾部读取消息,如果有生产者存在,就紧跟在生产者后面。在这种情况下,消费者读取的消息会直接存放在系统的页面缓存里,这比从磁盘上重新读取要快得多。
运行Kafka的JVM不需要太大的内存,剩余的系统内存可以用作页面缓存,或者用来缓存正在使用中的日志片段。这也就是为什么不建议把Kafka同其他重要的应用程序部署在一起的原因,它们需要共享页面缓存,最终会降低Kafka消费者的性能。
2.4.4 网络
网络吞吐量决定了Kafka能够处理的最大数据流量。它和磁盘存储是制约Kafka扩展规模的主要因素。Kafka支持多个消费者,造成流入和流出的网络流量不平衡,从而让情况变得更加复杂。对于给定的主题,一个生产者可能每秒钟写入1MB数据,但可能同时有多个消费者瓜分网络流量。其他的操作,如集群复制(在第6章介绍)和镜像(在第8章介绍)也会占用网络流量。如果网络接口出现饱和,那么集群的复制出现延时就在所难免,从而让集群不堪一击。
2.4.5 CPU
与磁盘和内存相比,Kafka对计算处理能力的要求相对较低,不过它在一定程度上还是会影响整体的性能。客户端为了优化网络和磁盘空间,会对消息进行压缩。服务器需要对消息进行批量解压,设置偏移量,然后重新进行批量压缩,再保存到磁盘上。这就是Kafka对计算处理能力有所要求的地方。不过不管怎样,这都不应该成为选择硬件的主要考虑因素。