Kafka线上集群部署方案怎么做?
1. 操作系统选型
- Linux最佳,原因包括三个维度
- I/O模型的使用
- 数据网络传输效率
- 社区支持度
1.1 I/O模型分类
- 阻塞式IO BIO
- 非阻塞时IO NIO
- IO多路复用 Select函数
- 信号驱动IO Epoll
- 异步IO AIO
Kafka的Java客户端底层使用了selector,在Linux上的实现机制是epoll,在windows平台上的实现机制是select;
因此在这一点上将 Kafka 部署在 Linux 上是有优势的,因为能够获得更高效的 I/O 性能。
1.2 网络传输效率
- kafka需要在磁盘和网络间进行大量数据传输,考虑Linux的零拷贝技术
- 零拷贝(Zero Copy)技术,就是当数据在磁盘和网络进行传输时避免昂贵的内核态数据拷贝从而实现快速的数据传输
- 一句话总结一下,在 Linux 部署 Kafka 能够享受到零拷贝技术所带来的快速数据传输特性。
零拷贝避免了将数据从磁盘复制到缓冲区,再将缓冲区的内容发送到socket的性能损耗。这中间有四次数据拷贝,磁盘->页缓存->用户空间->socket缓存->网络
1.3 社区的支持度
- 社区目前对 Windows 平台上发现的 Kafka Bug 不做任何承诺。
- Windows 平台上部署 Kafka 只适合于个人测试或用于功能验证,千万不要应用于生产环境。
2. 磁盘选型
- 建议使用普通机械硬盘即可,原因
- Kafka使用的方式多是顺序读写操作,一定程度上规避了机械磁盘最大的劣势,即随机读写操作慢。
- 从性价比上来说,机械磁盘物美价廉,而它因易损坏而造成的可靠性差等缺陷,又由 Kafka 在软件层面提供机制来保证,故使用普通机械磁盘是很划算的
- 是否应该使用磁盘阵列(RAID)
- Kafka 自己实现了冗余机制来提供高可靠性;
- 通过分区的概念,Kafka 也能在软件层面自行实现负载均衡。
- 追求性价比的公司可以不搭建 RAID,使用普通磁盘组成存储空间即可
- 使用机械磁盘完全能够胜任 Kafka 线上环境。
2.1 磁盘容量
- 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。
- 规划磁盘容量时需要考虑的元素:每天消息量+ 单条数据大小+备份数量+保留天数+是否压缩
- 新增消息数
- 消息留存时间
- 平均消息大小
- 备份数
- 是否启用压缩
2.2 带宽
- 带宽主要有两种:1Gbps 的千兆网络和 10Gbps 的万兆网络
- 带宽资源的规划背后其实是要规划所需的 Kafka 服务器的数量
- 计算例子:
假设你公司的机房环境是千兆网络,即 1Gbps,现有个业务,其业务目标或 SLA 是在 1 小时内处理 1TB 的业务数据。那么问题来了,你到底需要多少台 Kafka 服务器来完成这个业务呢?- 由于带宽是 1Gbps,即每秒处理 1Gb 的数据,假设每台 Kafka 服务器都是安装在专属的机器上,也就是说每台 Kafka 机器上没有混布其他服务。通常情况下只能假设 Kafka 会用到 70% 的带宽资源,因为总要为其他应用或进程留一些资源。根据实际使用经验,超过 70% 的阈值就有网络丢包的可能性了,故 70% 的设定是一个比较合理的值,也就是说单台 Kafka 服务器最多也就能使用大约 700Mb 的带宽资源。
- 这只是它能使用的最大带宽资源,你不能让 Kafka 服务器常规性使用这么多资源,故通常要再额外预留出 2/3 的资源,即单台服务器使用带宽 700Mb / 3 ≈ 240Mbps。
- 有了 240Mbps,我们就可以计算 1 小时内处理 1TB 数据所需的服务器数量了。根据这个目标,我们每秒需要处理 2336Mb 的数据,除以 240,约等于 10 台服务器。
- 如果消息还需要额外复制两份,那么总的服务器台数还要乘以 3,即 30 台。
总结
扫描二维码,分享此文章