Kafka实战(七) - 优雅地部署 Kafka 集群

既然是集群,必然有多个Kafka节点,只有单节点构成的Kafka集群只能用于日常测试,不可能满足线上生产需求。
真正的线上环境需要考量各种因素,结合自身的业务需求而制定。看一些考虑因素(以下顺序,可是分了顺序的哦)

1 操作系统 - OS

可能你会问Kafka不是JVM上的大数据框架吗?Java又是跨平台的语言,把Kafka安装到不同的操作系统上会有什么区别吗?
区别相当大!

确实,Kafka由Scala/Java编写,编译后源码就是“.class”文件。
本来部署到哪个OS应该一样,但是不同OS的差异还是给Kafka集群带来了相当大的影响。
毋庸置疑,部署在Linux上的生产环境是最多的。

考虑操作系统与Kafka的适配性,Linux系统显然要比其他两个特别是Windows系统更加适合部署Kafka。可具体原因你能谈笑风生吗?

1.1 I/O模型

I/O模型可以近似认为I/O模型就是OS执行I/O指令的方法。
主流的I/O模型通常有5种类型:

阻塞式I/O
e.g. Java中Socket的阻塞模式

非阻塞式I/O
e.g. Java中Socket的非阻塞模式

I/O多路复用
e.g. Linux中的系统调用select函数

信号驱动I/O
e.g. epoll系统调用则介于第三种和第四种模型之间

异步I/O
e.g. 很少有Linux支持,反而Windows系统提供了一个叫IOCP线程模型属于该类

我在这里不详细展开每一种模型的实现细节,因为那不是本文重点。

言归正传,I/O模型与Kafka的关系几何?
Kafka Client 底层使用了Java的selector,而selector

在Linux上的实现机制是epoll

在Windows平台上的实现机制是select

因此在这一点上将Kafka部署在Linux上是有优势的,能够获得更高效的I/O性能。

1.2 数据网络传输效率

Kafka生产和消费的消息都是通过网络传输的,而消息保存在哪里呢?
肯定是磁盘!
故Kafka需要在磁盘和网络间进行大量数据传输。
Linux有个零拷贝(Zero Copy)技术,就是当数据在磁盘和网络进行传输时避免昂贵内核态数据拷贝从而实现快速数据传输。Linux平台实现了这样的零拷贝机制,但有些令人遗憾的是在Windows平台上必须要等到Java 8的60更新版本才能“享受”到。

一句话,在Linux部署Kafka能够享受到零拷贝技术所带来的快速数据传输特性带来的极致快感。

1.3 社区生态

社区目前对Windows平台上发现的Kafka Bug不做任何承诺。因此,Windows平台上部署Kafka只适合于个人测试或用于功能验证,千万不要应用于生产环境。

2 磁盘 2.1 灵魂拷问:机械硬盘 or 固态硬盘

前者便宜且容量大,但易坏!

后者性能优势大,但是贵!

建议是使用普通机械硬盘即可。

Kafka虽然大量使用磁盘,可多是顺序读写操作,一定程度上规避了机械磁盘最大的劣势,即随机读写慢。从这一点上来说,使用SSD并没有太大性能优势,机械磁盘物美价廉

而它因易损坏而造成的可靠性差等缺陷,又由Kafka在软件层面提供机制来保证

2.2 是否应该使用磁盘阵列(RAID)

使用RAID的两个主要优势在于:

提供冗余的磁盘存储空间

提供负载均衡

不过就Kafka而言

Kafka自己实现了冗余机制提供高可靠性

通过分区的设计,也能在软件层面自行实现负载均衡

如此说来RAID的优势也就没有那么明显了。虽然实际上依然有很多大厂确实是把Kafka底层的存储交由RAID的,只是目前Kafka在存储这方面提供了越来越便捷的高可靠性方案,因此在线上环境使用RAID似乎变得不是那么重要了。
综上,追求性价比的公司可以不搭建RAID,使用普通磁盘组成存储空间即可。使用机械磁盘完全能够胜任Kafka线上环境。

2.3 磁盘容量

集群到底需要多大?
Kafka需要将消息保存在磁盘上,这些消息默认会被保存一段时间然后自动被删除。
虽然这段时间是可以配置的,但你应该如何结合自身业务场景和存储需求来规划Kafka集群的存储容量呢?

假设有个业务

每天需要向Kafka集群发送1亿条消息

每条消息保存两份以防止数据丢失

消息默认保存两周时间

现在假设消息的平均大小是1KB,那么你能说出你的Kafka集群需要为这个业务预留多少磁盘空间吗?

计算:

每天1亿条1KB的消息,存两份
1亿 * 1KB * 2 / 1000 / 1000 = 200GB

一般Kafka集群除消息数据还存其他类型数据,比如索引数据
再为其预留10%磁盘空间,因此总的存储容量就是220GB

要存两周,那么整体容量即为
220GB * 14,大约3TB

Kafka支持数据的压缩,假设压缩比是0.75
那么最后规划的存储空间就是0.75 * 3 = 2.25TB

总之在规划磁盘容量时你需要考虑下面这几个元素:

新增消息数

消息留存时间

平均消息大小

备份数

是否启用压缩

3 带宽

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgwswd.html