Kafka核心技术与实战——06 | Kafka线上集群部署方案怎么做?

  • 操作系统
    • Kafka 由 Scala 语言和 Java 语言编写而成,编译之后的源代码就是普通的“.class”文件
    • 应该说部署在 Linux 上的生产环境是最多的
    • 主要是在下面这三个方面上,Linux 的表现更胜一筹。
      • I/O 模型的使用
      • 数据网络传输效率
      • 社区支持度
    • 主流的 I/O 模型通常有 5 种类型:阻塞式 I/O、非阻塞式 I/O、I/O 多路复用、信号驱动 I/O 和异步 I/O。每种 I/O 模型都有各自典型的使用场景
      • 通常情况下我们认为后一种模型会比前一种模型要高级
      • 在这一点上将 Kafka 部署在 Linux 上是有优势的,因为能够获得更高效的 I/O 性能
    • 数据网络传输效率
      • Kafka 生产和消费的消息都是通过网络传输的,而消息保存在哪里呢?肯定是磁盘
      • 故 Kafka 需要在磁盘和网络间进行大量数据传输
      • 如果你熟悉 Linux,你肯定听过零拷贝(Zero Copy)技术,就是当数据在磁盘和网络进行传输时避免昂贵的内核态数据拷贝从而实现快速地数据传输
      • Linux 平台实现了这样的零拷贝机制
      • 一句话总结一下,在 Linux 部署 Kafka 能够享受到零拷贝技术所带来的快速数据传输特性
    • 社区的支持度
      • Windows 平台上部署 Kafka 只适合于个人测试或用于功能验证,千万不要应用于生产环境
  • 磁盘
    • 如果问哪种资源对 Kafka 性能最重要,磁盘无疑是要排名靠前的
      • 在对 Kafka 集群进行磁盘规划时经常面对的问题是,我应该选择普通的机械磁盘还是固态硬盘?
      • 前者成本低且容量大,但易损坏;后者性能优势大,不过单价高
      • 我给出的建议是使用普通机械硬盘即可
    • Kafka 大量使用磁盘不假
      • 可它使用的方式多是顺序读写操作,一定程度上规避了机械磁盘最大的劣势,即随机读写操作慢
      • 从这一点上来说,使用 SSD 似乎并没有太大的性能优势,毕竟从性价比上来说,机械磁盘物美价廉
      • 而它因易损坏而造成的可靠性差等缺陷,又由 Kafka 在软件层面提供机制来保证,故使用普通机械磁盘是很划算的
    • 使用普通机械磁盘
      • 一方面 Kafka 自己实现了冗余机制来提供高可靠性;另一方面通过分区的概念,Kafka 也能在软件层面自行实现负载均衡
  • 磁盘容量
    • Kafka 集群到底需要多大的存储空间?
      • 这是一个非常经典的规划问题
      • Kafka 需要将消息保存在底层的磁盘上,这些消息默认会被保存一段时间然后自动被删除
    • 总之在规划磁盘容量时你需要考虑下面这几个元素:
      • 新增消息数(消息数据,索引数据)
      • 消息留存时间
      • 平均消息大小
      • 备份数
      • 是否启用压缩
  • 带宽
    • 对于 Kafka 这种通过网络大量进行数据传输的框架而言,带宽特别容易成为瓶颈
      • 事实上,在我接触的真实案例当中,带宽资源不足导致 Kafka 出现性能问题的比例至少占 60% 以上
      • 如果你的环境中还涉及跨机房传输,那么情况可能就更糟了
    • 下面我就以千兆网络举一个实际的例子,来说明一下如何进行带宽资源的规划
      • 与其说是带宽资源的规划,其实真正要规划的是所需的 Kafka 服务器的数量
      • 其业务目标或 SLA 是在 1 小时内处理 1TB 的业务数据。那么问题来了,你到底需要多少台 Kafka 服务器来完成这个业务呢?
    • 评估线上环境的服务器台数
      • 让我们来计算一下,由于带宽是 1Gbps,即每秒处理 1Gb 的数据,假设每台 Kafka 服务器都是安装在专属的机器上,也就是说每台 Kafka 机器上没有混布其他服务,毕竟真实环境中不建议这么做。通常情况下你只能假设 Kafka 会用到 70% 的带宽资源,因为总要为其他应用或进程留一些资源。
      • 根据实际使用经验,超过 70% 的阈值就有网络丢包的可能性了,故 70% 的设定是一个比较合理的值,也就是说单台 Kafka 服务器最多也就能使用大约 700Mb 的带宽资源。
      • 稍等,这只是它能使用的最大带宽资源,你不能让 Kafka 服务器常规性使用这么多资源,故通常要再额外预留出 2/3 的资源,即单台服务器使用带宽 700Mb / 3 ≈ 240Mbps。需要提示的是,这里的 2/3 其实是相当保守的,你可以结合你自己机器的使用情况酌情减少此值。
      • 好了,有了 240Mbps,我们就可以计算 1 小时内处理 1TB 数据所需的服务器数量了。根据这个目标,我们每秒需要处理 2336Mb 的数据,除以 240,约等于 10 台服务器。如果消息还需要额外复制两份,那么总的服务器台数还要乘以 3,即 30 台。
  • 小结
posted @ 2020-05-02 22:15  怡情养性长智  阅读(204)  评论(0编辑  收藏  举报