一、操作系统
目前常见的操作系统有 3 种:Linux、Windows 和 macOS。
部署在 Linux 上的生产环境是最多的,也有一些 Kafka 集群部署在 Windows 服务器上。
如果考虑操作系统与 Kafka 的适配性,Linux 系统显然要比其他两个特别是 Windows 系统更加适合部署 Kafka。
主要是在下面这三个方面上,Linux 的表现更胜一筹。
- I/O 模型的使用
- 数据网络传输效率
- 社区支持度
1.I/O 模型
可以近似地认为 I/O 模型就是操作系统执行 I/O 指令的方法。
主流的 I/O 模型通常有 5 种类型:
- 阻塞式 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 性能。
2.网络传输效率
Kafka 生产和消费的消息都是通过网络传输的,而消息保存在磁盘。故 Kafka 需要在磁盘和网络间进行大量数据传输。 Linux的零拷贝(Zero Copy)技术,就是当数据在磁盘和网络进行传输时避免昂贵的内核态数据拷贝从而实现快速的数据传输。Linux 平台实现了这样的零拷贝机制,所以在 Linux 部署 Kafka 能够享受到零拷贝技术所带来的快速数据传输特性。
3.社区的支持度
社区目前对 Windows 平台上发现的 Kafka Bug 不做任何承诺。虽然口头上依然保证尽力去解决,Windows 上的 Bug 一般是不会修复的。因此,Windows 平台上部署 Kafka 只适合于个人测试或用于功能验证,千万不要应用于生产环境。
二、磁盘
在对 Kafka 集群进行磁盘规划时经常面对的问题是,应该选择普通的机械磁盘还是固态硬盘?前者成本低且容量大,但易损坏;后者性能优势大,不过单价高。建议使用普通机械硬盘即可。
Kafka 大量使用磁盘不假,可它使用的方式多是顺序读写操作,一定程度上规避了机械磁盘最大的劣势,即随机读写操作慢。从这一点上来说,使用 SSD 似乎并没有太大的性能优势,毕竟从性价比上来说,机械磁盘物美价廉,而它因易损坏而造成的可靠性差等缺陷,又由 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。
四、带宽
根据实际带宽资源和业务SLA预估服务器数量
对于千兆网络,建议每台服务器按照700Mbps来算,避免大流量下的丢包。
以千兆网络举一个实际的例子来说明一下如何进行带宽资源的规划:
1Gbps,现在有个业务,其业务目标或 SLA 是在 1 小时内处理 1TB 的业务数据:
带宽是 1Gbps,即每秒处理 1Gb 的数据,假设每台 Kafka 服务器都是安装在专属的机器上,也就是说每台 Kafka 机器上没有混部其他服务,毕竟真实环境中不建议这么做。通常情况下只能假设 Kafka 会用到 70% 的带宽资源,因为要为其他应用或进程留一些资源。即单台 Kafka 服务器最多也就能使用大约 700Mb 的带宽资源。通常要再额外预留出 2/3 的资源,即单台服务器使用带宽 700Mb / 3 ≈ 240Mbps。
每秒需要处理 2336Mb 的数据,除以 240,约等于 10 台服务器。如果消息还需要额外复制两份,那么总的服务器台数还要乘以 3,即 30 台。
极客时间《Kafka 核心技术与实战》学习笔记Day2 - http://gk.link/a/11UOV
网友评论