<>Kafka 线上集群部署方案

<>操作系统

* Kafka 由 Scala 语言和 Java 语言编写而成,编译之后的源代码就是普通的“.class”文件。
* 本来部署到哪个操作系统应该都是一样的,但是不同操作系统的差异还是给 Kafka 集群带来了相当大的影响。
* 目前常见的操作系统有 3 种:Linux、Windows 和 macOS。
* 部署在 Linux 上的生产环境是最多的,也有一些 Kafka 集群部署在 Windows 服务器上。
* 如果考虑操作系统与 Kafka 的适配性,Linux 系统显然要比其他两个特别是 Windows 系统更加适合部署
Kafka。主要是在下面这三个方面上,Linux 的表现更胜一筹。
* 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 性能。
* 数据网络传输效率
* Kafka 需要在磁盘和网络间进行大量数据传输。
* 在 Linux 部署 Kafka 能够享受到零拷贝技术所带来的快速数据传输特性。
* 社区支持度
* Windows 平台上部署 Kafka 只适合于个人测试或用于功能验证,千万不要应用于生产环境。
<>磁盘

* Kafka 大量使用磁盘不假,可它使用的方式多是顺序读写操作,一定程度上规避了机械磁盘最大的劣势,即随机读写操作慢。
* 从这一点上来说,使用 SSD 似乎并没有太大的性能优势。
* 毕竟从性价比上来说,机械磁盘物美价廉,而它因易损坏而造成的可靠性差等缺陷,又由 Kafka 在软件层面提供机制来保证,故使用普通机械磁盘是很划算的。
* 关于磁盘选择另一个经常讨论的话题就是到底是否应该使用磁盘阵列(RAID)。
* 使用 RAID 的两个主要优势在于:提供冗余的磁盘存储空间和提供负载均衡。
* 以上两个优势对于任何一个分布式系统都很有吸引力。
* 不过就 Kafka 而言,一方面 Kafka 自己实现了冗余机制来提供高可靠性;
* 另一方面通过分区的概念,Kafka 也能在软件层面自行实现负载均衡。
* 如此说来 RAID 的优势就没有那么明显了。实际上依然有很多大厂确实是把 Kafka 底层的存储交由 RAID 的,只是目前 Kafka
在存储这方面提供了越来越便捷的高可靠性方案,因此在线上环境使用 RAID 似乎变得不是那么重要了。
* 追求性价比的公司可以不搭建 RAID,使用普通磁盘组成存储空间即可。
* 使用机械磁盘完全能够胜任 Kafka 线上环境。
<>磁盘容量

* Kafka 需要将消息保存在底层的磁盘上,这些消息默认会被保存一段时间然后自动被删除。
* 虽然这段时间是可以配置的,但你应该如何结合自身业务场景和存储需求来规划Kafka集群的存储容量呢?
* 假设所在公司有个业务每天需要向 Kafka 集群发送 1 亿条消息,每条消息保存两份以防止数据丢失,另外消息默认保存两周时间。现在假设消息的平均大小是
1 KB,那么 Kafka 集群需要为这个业务预留多少磁盘空间吗?
* 每天 1 亿条 1 KB大小的消息,保存两份且留存两周的时间,那么总的空间大小就等于 1 亿 1 KB * 2 / 1000 / 1000 = 200
GB。
* Kafka 集群除了消息数据还有其他类型的数据,比如索引数据等,故再为这些数据预留出 10% 的磁盘空间,因此总的存储容量就是 220 GB。
* 既然要保存两周,那么整体容量即为 220 GB * 14,大约 3 TB左右。
* Kafka 支持数据的压缩,假设压缩比是 0.75,那么最后需要规划的存储空间就是 0.75 * 3 = 2.25 TB。
* 在规划磁盘容量时需要考虑下面这几个元素:
* 新增消息数。
* 消息留存时间。
* 平均消息大小。
* 备份数。
* 是否启用压缩。
<>带宽

* 对于 Kafka 这种通过网络大量进行数据传输的框架而言,带宽特别容易成为瓶颈。
* 带宽也主要有两种:1 Gbps 的千兆网络和 10 Gbps 的万兆网络,特别是千兆网络应该是一般公司网络的标准配置了。
* 假设公司的机房环境是千兆网络,即 1 Gbps,现在你有个业务,其业务目标或 SLA 是在 1 小时内处理 1 TB的业务数据。到底需要多少台
Kafka 服务器来完成这个业务呢?
* 由于带宽是 1 Gbps,即每秒处理 1 Gb的数据,假设每台 Kafka 服务器都是安装在专属的机器上,也就是说每台 Kafka
机器上没有混布其他服务,毕竟真实环境中不建议这么做。
* 通常情况下假设 Kafka 会用到 70% 的带宽资源,因为总要为其他应用或进程留一些资源。
* 根据实际使用经验,超过 70% 的阈值就有网络丢包的可能性了,故 70% 的设定是一个比较合理的值,也就是说单台 Kafka 服务器最多也就能使用大约
700 Mb的带宽资源。
* 这只是它能使用的最大带宽资源,Kafka 服务器常规性无法使用这么多资源,故通常要再额外预留出 2/3 的资源,即单台服务器使用带宽 700 Mb /
3 ≈ 240 Mbps。
* 根据这个目标,每秒需要处理 2336 Mb的数据,除以 240,约等于 10 台服务器。如果消息还需要额外复制两份,那么总的服务器台数还要乘以 3,即
30 台。

技术
下载桌面版
GitHub
Gitee
SourceForge
百度网盘(提取码:draw)
云服务器优惠
华为云优惠券
腾讯云优惠券
阿里云优惠券
Vultr优惠券
站点信息
问题反馈
邮箱:[email protected]
吐槽一下
QQ群:766591547
关注微信