首页 > 其他分享 >Kafka - 线上集群部署方案怎么做?

Kafka - 线上集群部署方案怎么做?

时间:2023-08-29 15:50:22浏览次数:30  
标签:模型 带宽 Kafka 集群 线上 Linux 磁盘 服务器

既然是集群,那必然就要有多个 Kafka 节点机器,因为只有单台机器构成的 Kafka 伪集群只能用于日常测试之用,根本无法满足实际的线上生产需求。而真正的线上环境需要仔细地考量各种因素,结合自身的业务需求而制定。下面我就分别从操作系统、磁盘、磁盘容量和带宽等方面来讨论一下。

 

操作系统 -- 选择Linux

Linux 系统显然要比 Windows 系统更加适合部署 Kafka(macOS肯定更不行了)。优势主要是在下面这三个方面上:

  • I/O 模型的使用
  • 数据网络传输效率
  • 社区支持度

 

I/O 模型的使用

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 线程模型属于这一种。

通常情况下我们认为后一种模型会比前一种模型要高级,比如 epoll 就比 select 要好。

 

说了这么多,I/O 模型与 Kafka 的关系又是什么呢?

实际上 Kafka 客户端底层使用了 Java 的 selector:

  • selector 在 Linux 上的实现机制是 epoll
  • 而selector在 Windows 平台上的实现机制是 select

因此在这一点上将 Kafka 部署在 Linux 上是有优势的,因为能够获得更高效的 I/O 性能。

 

数据网络传输效率

在 Linux 部署 Kafka 能够享受到零拷贝技术所带来的快速数据传输特性

Kafka 生产和消费的消息都是通过网络传输的,而消息保存在磁盘。故 Kafka 需要在磁盘和网络间进行大量数据传输。如果你熟悉 Linux,你肯定听过零拷贝(Zero Copy)技术,就是当数据在磁盘和网络进行传输时避免昂贵的内核态数据拷贝从而实现快速的数据传输。Linux 平台实现了这样的零拷贝机制,但有些令人遗憾的是在 Windows 平台上必须要等到 Java 8 的 60 更新版本才能“享受”到这个福利。

 

社区支持度

简单来说就是,社区目前对 Windows 平台上发现的 Kafka Bug 不做任何承诺。虽然口头上依然保证尽力去解决,但根据我的经验,Windows 上的 Bug 一般是不会修复的。因此,Windows 平台上部署 Kafka 只适合于个人测试或用于功能验证,千万不要应用于生产环境。

 

磁盘 - 一般选择普通机械磁盘

普通的机械磁盘HDD VS 固态硬盘SSD

  • HDD成本低且容量大,但易损坏;
  • SSD性能优势大(通常我们认为SSD的顺序写TPS大约是HDD的4倍),不过单价高。

我给出的建议是使用普通机械硬盘即可。

 

Kafka 大量使用磁盘不假,可它使用的方式多是顺序读写操作,一定程度上规避了机械磁盘最大的劣势,即随机读写操作慢。从这一点上来说,使用 SSD 似乎并没有太大的性能优势,毕竟从性价比上来说,机械磁盘物美价廉,而它因易损坏而造成的可靠性差等缺陷,又由 Kafka 在软件层面提供机制来保证,故使用普通机械磁盘是很划算的。

 

关于磁盘选择另一个经常讨论的话题就是到底是否应该使用磁盘阵列(RAID)。使用 RAID 的两个主要优势在于:提供冗余的磁盘存储空间提供负载均衡以上两个优势对于任何一个分布式系统都很有吸引力。不过就 Kafka 而言,一方面 Kafka 自己实现了冗余机制来提供高可靠性;另一方面通过分区的概念,Kafka 也能在软件层面自行实现负载均衡。如此说来 RAID 的优势就没有那么明显了。

 

综合以上的考量,我给出的建议是:

  • 追求性价比的公司可以不搭建 RAID;
  • 使用普通磁盘组成存储空间即可。使用机械磁盘完全能够胜任 Kafka 线上环境。

 

补充 -- 如果写入负载偏高,两个方案:

  • 纵向扩展:使用SSD
  • 横向扩展:增加更多的broker或HDD分散负载

 

磁盘容量 - 如何估算

Kafka 集群到底需要多大的存储空间?这是一个非常经典的规划问题。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。

 

总之在规划磁盘容量时你需要考虑下面这几个元素

  • 新增消息数
  • 消息留存时间
  • 平均消息大小
  • 备份数
  • 是否启用压缩

 

带宽

对于 Kafka 这种通过网络大量进行数据传输的框架而言,带宽特别容易成为瓶颈。事实上,在我接触的真实案例当中,带宽资源不足导致 Kafka 出现性能问题的比例至少占 60% 以上。如果你的环境中还涉及跨机房传输,那么情况可能就更糟了。

 

带宽也主要有两种:1Gbps 的千兆网络和 10Gbps 的万兆网络,特别是千兆网络应该是一般公司网络的标准配置了。下面我就以千兆网络举一个实际的例子,来说明一下如何进行带宽资源的规划。

 

与其说是带宽资源的规划,其实真正要规划的是所需的 Kafka 服务器的数量。假设你公司的机房环境是千兆网络,即 1Gbps,现在你有个业务,其业务目标或 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 的数据 ——1000*1000/(60*60)*8,大致等于2300+Mb(小b);带宽资源一般用Mbps而不是MBps衡量;再除以 240,约等于 10 台服务器。如果消息还需要额外复制两份,那么总的服务器台数还要乘以 3,即 30 台。

 

怎么样,还是很简单的吧。用这种方法评估线上环境的服务器台数是比较合理的,而且这个方法能够随着你业务需求的变化而动态调整。

 

标签:模型,带宽,Kafka,集群,线上,Linux,磁盘,服务器
From: https://www.cnblogs.com/frankcui/p/17664943.html

相关文章

  • oceanbase集群版安装(离线部署)
    环境:OS:Centos7oceanbase:4.2192.168.1.105中控机192.168.1.106192.168.1.1071.下载离线包(中控机执行)https://www.oceanbase.com/product/opensource下载的介质为:oceanbase-all-in-one-4.2.0.0-100120230821114201.el7.x86_64.tar.gz2.安装java1.8以上版本2.解压(中控机......
  • redis集群-Cluser
    目录一RedisCluser介绍背景1.1问题1.2解决二数据分布(分布式数据库)2.1存在问题2.2分区方式2.2.1顺序分区2.2.2哈希分区三集群搭建四python操作集群一RedisCluser介绍背景https://www.cnblogs.com/liuqingzheng/articles/17324393.html1.1问题#存在问题1并发量......
  • 一台服务器上部署 Redis 伪集群
    哈喽大家好,我是咸鱼今天这篇文章介绍如何在一台服务器(以CentOS7.9为例)上通过redis-trib.rb工具搭建Rediscluster(三主三从)redis-trib.rb是一个基于Ruby编写的脚本,其功能涵盖了创建、管理以及维护Redis集群的各个方面值得注意的是,随着时间的推移,一些较新版本的Redi......
  • Kubernetes集群部署三节点yum部署
    一、修改主机名(三个节点都操作)vi/etc/hostname#跟换主机名systemctlrestartsystemd-hostnamed#修改完成后重新链接服务二、同步时间(三个节点都操作)yuminstallntpdate-yntpdatetime.windows.com#时区设置cp/usr/share/zoneinfo/Asia/Shanghai/etc/localtime#最......
  • 生产环境 kafka 平滑迁移之旅
    背景线上kafka集群,3台机器,3个broker;其中某台机器因为硬件故障,需要停机维修;停机意味这跑在机器上的服务会停止。所以本次做kafka迁移的目标是机器可以停止但依赖kafka的上游和下游业务可不能停止,因为所属行业的特殊性,服务的停止,对业务的影响和伤害还蛮大的。分析我们知道kafka是有......
  • 园子的脱困努力-线上大会合作:欢迎预约直播——2023腾讯全球数字生态大会 + 腾讯云微服
    在园子脱困的关键时期,每一笔收入都很重要,一边在会员救园,一边我们要努力把握每一个商务合作机会,争取早日走出困境。之前园子维持生存的收入主要来自于与云厂商的合作,但去年由于云厂商推广策略的调整,这块收入几乎没有了。当我们对这块收入不报任何希望时,这个月开始,有些云厂商又回......
  • 2023年DAMA-CDGA/CDGP数据治理认证线上到这里学习
    DAMA认证为数据管理专业人士提供职业目标晋升规划,彰显了职业发展里程碑及发展阶梯定义,帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力,促进开展工作实践应用及实际问题解决,形成企业所需的新数字经济下的核心职业竞争能力。DAMA是数据管理方面的认证,帮助数据从业者提升......
  • Karmada 结合 coreDNS 插件实现跨集群统一域名访问
    本文分享自华为云社区《Karmada结合coreDNS插件实现跨集群统一域名访问》,作者:云容器大未来。在多云与混合云越来越成为企业标配的今天,服务的部署和访问往往不在一个K8s集群中。如何做到服务访问与集群无关,成为了各个云服务提供商必须要面对的问题。本文基于Karmadav1.6.1版......
  • Kafka - 不仅是消息引擎,还是分布式流处理平台
     如果你通读全篇文字但只能记住一句话,我希望你记住的就是这句ApacheKafka是消息引擎系统,也是一个分布式流处理平台(DistributedStreamingPlatform) 作为流处理平台,Kafka与其他主流大数据流式计算框架相比,优势在哪里呢?我能想到的有两点。第一点是更容易实现端到端的正......
  • Kafka - 为什么 Kafka 不像 MySQL 那样允许追随者副本对外提供读服务?
    几个原因:1,kafka的分区已经让读是从多个broker读从而负载均衡,不是MySQL的主从,压力都在主上;2,kafka保存的数据和数据库的性质有实质的区别就是数据具有消费的概念,是流数据,kafka是消息队列,所以消费需要位移,而数据库是实体数据不存在这个概念,如果从kafka的follower读,消费端offset控制......