生产环境需考量各种因素,结合自身业务需求而制定。看一些考虑因素(以下顺序,可是分了顺序的哦)
1 OS
Kafka由Scala/Java编写,编译后源码是“.class”文件。部署到啥OS应该一样,但部署在Linux生产环境肯定最多,why?主要是如下方面更佳:
1.1 I/O模型
I/O模型,即os执行I/O指令的方法。主流的I/O模型:
- 阻塞式I/O e.g. Java中Socket的阻塞模式
- 非阻塞式I/O e.g. Java中Socket的非阻塞模式
- I/O多路复用 e.g. Linux中的系统调用select函数
- 信号驱动I/O e.g. epoll系统调用,介于第3、4种模型
- 异步I/O e.g. 很少有Linux支持,Windows系统提供IOCP线程模型
Kafka Client 底层使用Java的selector,而selector在:
- Linux上的实现机制是epoll
- Windows平台上的实现机制是select
Kafka部署在Linux上更有优势,能获得更高效I/O性能。
1.2 网络传输效率
Kafka生产和消费的消息都通过网络传输,但消息保存在磁盘。故Kafka需在磁盘、网络间进行大量数据传输。在Linux部署Kafka能享受到零拷贝技术带来的快速数据传输特性。
而Windows要等到Java 8的60更新版本才能有此福利。
1.3 生态
社区对Windows平台上发现的Kafka Bug不做任何承诺。
2 磁盘
2.1 机械硬盘 or SSD
- 前者便宜且容量大,但易坏
- 后者性能优势大,但贵
建议普通机械硬盘:
- Kafka虽大量使用磁盘,可大多是顺序读写,一定程度规避机械磁盘最大劣势:随机读写慢。使用SSD并无太大性能优势,机械磁盘物美价廉
- 易损坏而造成的可靠性差等缺陷,由Kafka在软件层面提供机制保证
2.2 是否应使用磁盘阵列(RAID)
主要优势:
- 提供冗余的磁盘存储空间
- 提供负载均衡
但Kafka:
- 自己实现了冗余机制,提供高可靠
- 通过分区,也能在软件层面实现负载均衡
RAID优势就不明显了。
综上:
- 追求性价比的公司可不搭建RAID,使用普通磁盘组成存储空间即可
- 机械磁盘完全能够胜任
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 带宽
普通以太网络,带宽主要两种:
- 1Gbps千兆网络(主流)
- 10Gbps万兆网络
其实贷款规划,就是规划所需Kafka服务器数量。假设机房千兆网络1Gbps,业务目标或SLA是在1h内处理1TB业务数据。需多少台Kafka服务器完成这业务?
计算
带宽1Gbps,即每秒处理1Gb数据 假设每台Kafka服务器都是安装在专属机器,即每台Kafka机器上没有混入其他服务。通常你只能假设Kafka会用到70%带宽资源,因为总要为其他应用或进程留一些资源。
超过70%阈值就有网络丢包可能,故70%设定是合理值,即单台Kafka服务器最多也就能使用大约700Mb带宽。这只是它能使用的最大带宽资源,你不能让Kafka服务器常规就使用这么多资源,故通常再额外预留2/3资源,即
单台服务器使用带宽700Mb / 3 ≈ 240Mbps
有这240Mbps,计算1h内处理1TB数据所需的服务器数量。即每s处理2336Mb数据,除以240=10台服务器。 若消息还需额外复制两份,总服务器台数乘3=30台。
4 总结
部署Kafka环境,一开始就要思考好实际场景下业务所需的集群环境,不能仅从单个维度上进行评估。
参考
- Linux内核模型架构
- Kafka核心技术与实战