Apache Kafka是消息引擎系统,也是一个分布式流处理平台。
kafka产生原因:
之前有一些数据强实时处理方面的需求,但遇到了问题:
- 数据正确性不足。 因为数据的收集主要采用轮询(Polling)的方式,如何确定轮询的间隔时间就变成了一个高度经验化的事情。
- 系统高度定制化,维护成本高。各个业务子系统都需要对接数据收集模块,引入了大量的定制开销和人工成本。
所以kafka出现了。
但后来大多公司都将kafka承接上下游, 所有的数据几乎都要从一个系统流入Kafka然后再流向下游的另一个系统中。
这样的使用方式屡见不鲜以至于引发了Kafka社区的思考:与其我把数据从一个系统传递到下一个系统中做处理,我为何不自己实现一套流处理框架呢?基于这个考量,Kafka社区于0.10.0.0版本正式推出了流处理组件Kafka Streams ,也正是从这个版本开始,Kafka正式“变身”为分布式的流处理平台,而不仅仅是消息引擎系统了。
今天Apache Kafka是和Apache Storm、Apache Spark和Apache Flink同等级的实时流处理平台。
实时流处理是什么?
Kafka与其他主流大数据流式计算框架相比,优势在哪里
1、容易实现端到端的正确性。
流处理要最终替代它的“兄弟”批处理需要具备两点核心优势:要实现正确性和提供能够推导时间的工具。
目前主流的大数据流处理框架都宣称实现了精确一次处理语义(即都会产生且只会产生一条数据),但这是有限定条件的,即它们只能实现框架内的精确一次处理语义,无法实现端到端的。这是为什么呢?因为当这些框架与外部消息引擎系统结合使用时,它们无法影响到外部系统的处理语义。
比如一个普通的producer程序:producer需要接收到broker发送的response才能认为发送成功,如果response在传输过程中因为网络抖动丢失了或超时了(这种情况非常常见)而broker实际上已经写入了该消息,那么producer就会认为发送失败从而尝试重新发送,这就可能造成同一条消息被发送了多次。
但Kafka则不是这样,因为所有的数据流转和计算都在Kafka内部完成,故Kafka可以实现端到端的精确一次处理语义。
2、对于流式计算的定位:适合中小企业。 还可以被用作分布式存储系统
流处理和批处理的区别是前者主要用于处理无限数据集(unbound data set)
每次执行批处理都能保证得到相同的值,但是流处理无法做到这一点。批处理一般采用fail-fast来保证即使中间出现错误也能实现正确性
JMXTrans + InfluxDB + Grafana
kafka的几种版本
-
Apache Kafka,也称社区版Kafka。优势在于迭代速度快,社区响应度高,使用它可以让你有更高的把控度;缺陷在于仅提供基础核心组件,缺失一些高级的特性。
-
Confluent Kafka,Confluent公司提供的Kafka。优势在于集成了很多高级特性且由Kafka原班人马打造,质量上有保证;缺陷在于相关文档资料不全,普及率较低,没有太多可供参考的范例。
-
CDH/HDP Kafka,大数据云公司提供的Kafka,内嵌Apache Kafka。优势在于操作简单,节省运维成本;缺陷在于把控度低,演进速度较慢。
kafka的版本号( 重要)
Kafka服务器端的代码完全由Scala语言编写,Scala同时支持面向对象编程和函数式编程,用Scala写成的源代码编译之后也是普通的“.class”文件,因此我们说Scala是JVM系的语言,它的很多设计思想都是为人称道的。
版本号:
大 + 小 + patch
0.7版本:只有基础消息队列功能,无副本;打死也不使用
0.8版本:增加了副本机制,新的producer API;建议使用0.8.2.2版本;不建议使用0.8.2.0之后的producer API
0.9版本:增加权限和认证,新的consumer API,Kafka Connect功能;不建议使用consumer API;
0.10版本:引入Kafka Streams功能,bug修复;建议版本0.10.2.2;建议使用新版consumer API
0.11版本:producer API幂等,事物API,消息格式重构;建议版本0.11.0.3;谨慎对待消息格式变化
1.0和2.0版本:Kafka Streams改进;建议版本2.0;
最后还有个建议,不论你用的是哪个版本,都请尽量保持服务器端版本和客户端版本一致,否则你将损失很多Kafka为你提供的性能优化收益。
问:
1.kafka如何做压力测试,它的参考主要指标是什么,比如QPS,最大连接数,延迟等等。
2.扩容如何做到平滑扩容,不影响原业务
3.kafka有什么好的监控软件。
回答:
1. Kafka提供了命令行脚本可以执行producer和consumer的性能测试,主要指标还是TPS,延时
2. 增加broker很简单,也不会对现有业务有影响。关键是做好迁移计划——比如避开业务高峰时刻,如果迁移对业务影响最小
Kafka社区将其清晰地定位为一个分布式、分区化且带备份功能的提交日志(Commit Log)服务。
Kafka在设计之初就旨在提供三个方面的特性:
-
提供一套API实现生产者和消费者;
-
降低网络传输和磁盘存储开销;
-
实现高伸缩性架构。
它是如何做到这三点的?后续说明。