Kafka实战(七) - 优雅地部署 Kafka 集群
既然是集群,必然有多个Kafka节点,只有单节点构成的Kafka伪集群只能用于日常测试,不可能满足线上生产需求。
真正的线上环境需要考量各种因素,结合自身的业务需求而制定。看一些考虑因素(以下顺序,可是分了顺序的哦)
1 操作系统 - OS
可能你会问Kafka不是JVM上的大数据框架吗?Java又是跨平台的语言,把Kafka安装到不同的操作系统上会有什么区别吗?
区别相当大!
确实,Kafka由Scala/Java编写,编译后源码就是“.class”文件。
本来部署到哪个OS应该一样,但是不同OS的差异还是给Kafka集群带来了相当大的影响。
毋庸置疑,部署在Linux上的生产环境是最多的。
考虑操作系统与Kafka的适配性,Linux系统显然要比其他两个特别是Windows系统更加适合部署Kafka。可具体原因你能谈笑风生吗?
1.1 I/O模型
I/O模型可以近似认为I/O模型就是OS执行I/O指令的方法。
主流的I/O模型通常有5种类型:
- 阻塞式I/O
e.g. Java中Socket的阻塞模式 - 非阻塞式I/O
e.g. Java中Socket的非阻塞模式 - I/O多路复用
e.g. Linux中的系统调用select函数 - 信号驱动I/O
e.g. epoll系统调用则介于第三种和第四种模型之间 - 异步I/O
e.g. 很少有Linux支持,反而Windows系统提供了一个叫IOCP线程模型属于该类
我在这里不详细展开每一种模型的实现细节,因为那不是本文重点。
言归正传,I/O模型与Kafka的关系几何?
Kafka Client 底层使用了Java的selector,而selector
- 在Linux上的实现机制是epoll
- 在Windows平台上的实现机制是select
因此在这一点上将Kafka部署在Linux上是有优势的,能够获得更高效的I/O性能。
1.2 数据网络传输效率
Kafka生产和消费的消息都是通过网络传输的,而消息保存在哪里呢?
肯定是磁盘!
故Kafka需要在磁盘和网络间进行大量数据传输。
Linux有个零拷贝(Zero Copy)技术,就是当数据在磁盘和网络进行传输时避免昂贵内核态数据拷贝从而实现快速数据传输。Linux平台实现了这样的零拷贝机制,但有些令人遗憾的是在Windows平台上必须要等到Java 8的60更新版本才能“享受”到。
一句话,在Linux部署Kafka能够享受到零拷贝技术所带来的快速数据传输特性带来的极致快感。
1.3 社区生态
社区目前对Windows平台上发现的Kafka Bug不做任何承诺。因此,Windows平台上部署Kafka只适合于个人测试或用于功能验证,千万不要应用于生产环境。
2 磁盘
2.1 灵魂拷问:机械硬盘 or 固态硬盘
- 前者便宜且容量大,但易坏!
- 后者性能优势大,但是贵!
建议是使用普通机械硬盘即可。
- Kafka虽然大量使用磁盘,可多是顺序读写操作,一定程度上规避了机械磁盘最大的劣势,即随机读写慢。从这一点上来说,使用SSD并没有太大性能优势,机械磁盘物美价廉
- 而它因易损坏而造成的可靠性差等缺陷,又由Kafka在软件层面提供机制来保证
2.2 是否应该使用磁盘阵列(RAID)
使用RAID的两个主要优势在于:
- 提供冗余的磁盘存储空间
- 提供负载均衡
不过就Kafka而言
- Kafka自己实现了冗余机制提供高可靠性
- 通过分区的设计,也能在软件层面自行实现负载均衡
如此说来RAID的优势也就没有那么明显了。虽然实际上依然有很多大厂确实是把Kafka底层的存储交由RAID的,只是目前Kafka在存储这方面提供了越来越便捷的高可靠性方案,因此在线上环境使用RAID似乎变得不是那么重要了。
综上,追求性价比的公司可以不搭建RAID,使用普通磁盘组成存储空间即可。使用机械磁盘完全能够胜任Kafka线上环境。
2.3 磁盘容量
集群到底需要多大?
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
总之在规划磁盘容量时你需要考虑下面这几个元素:
- 新增消息数
- 消息留存时间
- 平均消息大小
- 备份数
- 是否启用压缩
3 带宽
对于Kafka这种通过网络进行大数据传输的框架,带宽容易成为瓶颈。
普通的以太网络,带宽主要有两种: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的数据,除以240,约等于10台服务器。
如果消息还需要额外复制两份,那么总的服务器台数还要乘以3,即30台。
总结
与其盲目上马一套Kafka环境然后事后费力调整,不如在一开始就思考好实际场景下业务所需的集群环境。在考量部署方案时需要通盘考虑,不能仅从单个维度上进行评估。
参考
- Linux内核模型架构
- Kafka核心技术与实战
Kafka实战(七) - 优雅地部署 Kafka 集群的更多相关文章
- 《Apache kafka实战》读书笔记-管理Kafka集群安全之ACL篇
<Apache kafka实战>读书笔记-管理Kafka集群安全之ACL篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 想必大家能看到这篇博客的小伙伴,估计你对kaf ...
- Docker部署zookeeper集群和kafka集群,实现互联
本文介绍在单机上通过docker部署zookeeper集群和kafka集群的可操作方案. 0.准备工作 创建zk目录,在该目录下创建生成zookeeper集群和kafka集群的yml文件,以及用于在该 ...
- 基于Ambari Server部署HDP集群实战案例
基于Ambari Server部署HDP集群实战案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.部署Ambari Server端 博主推荐阅读: https://www.c ...
- 阿里云ECS服务器部署HADOOP集群(七):Sqoop 安装
本篇将在 阿里云ECS服务器部署HADOOP集群(一):Hadoop完全分布式集群环境搭建 阿里云ECS服务器部署HADOOP集群(二):HBase完全分布式集群搭建(使用外置ZooKeeper) 阿 ...
- ZooKeeper 01 - 什么是ZooKeeper + 部署ZooKeeper集群
目录 1 什么是ZooKeeper 2 ZooKeeper的功能 2.1 配置管理 2.2 命名服务 2.3 分布式锁 2.4 集群管理 3 部署ZooKeeper集群 3.1 下载并解压安装包 3. ...
- docker 快速部署ES集群 spark集群
1) 拉下来 ES集群 spark集群 两套快速部署环境, 并只用docker跑起来,并保存到私库. 2)弄清楚怎么样打包 linux镜像(或者说制作). 3)试着改一下,让它们跑在集群里面. 4) ...
- RabbitMQ系列(五)使用Docker部署RabbitMQ集群
概述 本文重点介绍的Docker的使用,以及如何部署RabbitMQ集群,最基础的Docker安装,本文不做过多的描述,读者可以自行度娘. Windows10上Docker的安装 因为本人用的是Win ...
- 在CentOS7上部署Kubernetes集群
在CentOS7上部署Kubernetes集群 文/FCBusquest 2015-12-22 18:36:00 简介 Kubernetes(k8s)是Google开源的大规模容器集群管理系统, 本文 ...
- 阿里云ECS服务器部署HADOOP集群(一):Hadoop完全分布式集群环境搭建
准备: 两台配置CentOS 7.3的阿里云ECS服务器: hadoop-2.7.3.tar.gz安装包: jdk-8u77-linux-x64.tar.gz安装包: hostname及IP的配置: ...
随机推荐
- attach()与detach()的使用
attach()与detach()需要配对使用,如果使用了attach而未使用detach,再次使用attach时,会有"对象被屏蔽"的问题,如下:
- PHP命令空间namespace及use的用法
使用namespace的目的 命名空间将代码划分出不同的空间(区域),每个空间的常量.函数.类(为了偷懒,我下边都将它们称为元素)的名字互不影响, 这个有点类似我们常常提到的'封装'的概念. 团队合作 ...
- 你的SpringBoot应用真的部署更新成功了吗
前提 当我们在生产环境部署了SpringBoot应用的时候,虽然可以通过Jenkins的构建状态和Linux的ps命令去感知应用是否在新的一次发布中部署和启动成功,但是这种监控手段是运维层面的.那么, ...
- 3分钟了解ServiceStage 应用智能化运维【华为云分享】
[摘要] 微服务云应用平台(ServiceStage)是面向企业及开发者的一站式DevOps平台服务,支持基于微服务的应用开发.治理.部署及运维监控的全生命周期管理,并提供大规模容器集群管理及中间件服 ...
- 如何不用BPM配置时间
详细方案 配置时间 您需要同步消息接口(JDBC)和异步消息接口(对JEDBCReceiver的响应).对于SAP BAPI,我们不需要消息接口. 注意:CIMS是数据库系统 消息接口(请求/响应) ...
- .Net Core的API网关Ocelot使用 (一)
1.什么是API网关 API网关是微服务架构中的唯一入口,它提供一个单独且统一的API入口用于访问内部一个或多个API.它可以具有身份验证,监控,负载均衡,缓存,请求分片与管理,静态响应处理等.API ...
- c获取shell中的参数
问题背景 在Linux中我们会使用到shell,来完成输入参数的获取,就如同下面的形式,这种形式在进行多语言编程和调用有着非常重要的作用 一.传递的过程 1.1 原理模型如下: 1.1.1 可执行sh ...
- swift实现单例的四种方式
单例模式 单例模式是设计模式中最简单的一种,甚至有些模式大师都不称其为模式,称其为一种实现技巧,因为设计模式讲究对象之间的关系的抽象,而单例模式只有自己一个对象. 当你只需要一个实例的时候需要使用单例 ...
- MVC方法的返回值类型
MVC方法返回值类型 ModelAndView返回值类型: 1.当返回为null时,页面不跳转. 2.当返回值没有指定视图名时,默认使用请求名作为视图名进行跳转. 3.当返回值指定了视图名,程序会按照 ...
- [TimLinux] docker CentOS7入门——服务(2)
1. 服务含义 分布式应用中,应用的不同部分即称为“服务”,视频网站是一个分布式应用,包含有:数据的存储,视频的转码,前端展示等部分,对应的这些部分即称为相应的服务.docker平台中,定义.运行和扩 ...