目录
Kafka是什么
Kafka简介
KafKa基本结构
KafKa特性
Kafka是什么
KafKa是一个高吞吐量、分布式的发布—订阅消息系统。据KafKa官网介绍,当前的KafKa已经定位为一个分布式流式处理平台(a distributed streaming platform),它以可水平扩展和具有高吞吐量等特性而著称。越来越多的开源分布式处理系统(Flume、Apache Storm 、Spark、Flink等)支持与KafKa集成。
Kafka简介
计算机所存储的信息量正在呈爆炸式的增长,目前数据量已经进入大规模和超大规模的海量数据时代,如何高效的存储、分析、处理和挖掘海量数据已经成为技术研究的热点和难点问题。
当前出现的云存储、分布式存储系统、NoSQL数据库以及列存储等前沿技术在海量数据的驱使下,正在日新月异的向前发展,采用这些技术来处理大数据称为一种发展趋势。
而如何采集和运营管理、分析这些数据也是大数据处理中的一个至关重要的组成环节,这就需要相应的基础设施对其提供支持。
针对这个需求,当前业界已有很多开源的消息系统应运而生,KafKa就是当前流行的一款非常优秀的消息系统。
KafKa是一款开源的、轻量级的、分布式、可分区和具有复制备份的(Replicated)、基于ZooKeeper的协调管理的分布式流平台的功能强大的消息系统。与传统的消息系统相比,KafKa能够很好的处理活跃的流数据,使得数据在各个子系统中高性能、低延迟地不停流转。
据KafKa官网介绍,KafKa定位就是一个分布式流处理平台,作为一个流式处理平台,必须具备以下三个特征:
- 能够允许发布和订阅流数据。从这个角度来讲,平台更像是一个消息队列或者企业级的消息系统;
- 存储流数据的时候提供相应的容错机制;
- 当流数据达到的时候能够即时的被处理。
kafka能够很好的满足以上3个特性,通过kafka能够很好的建立实时流式数据通道,由该通道可靠地获取系统或者应用程序的数据,也可以通过kafka方便的构建实时流数据应用来转换或者是对流数据进行响应处理。特别是在0.10版本之后,KafKa推出KafKa Streams,这让KafKa对流数据处理变得更加的方便。
KafKa基本结构
KafKa的结构需要解决如下的问题:
- 生产者负责生产消息,如何写入KafKa集群。
- 消费者如何从KafKa集群中拉取消息
- KafKa如何存储消息
- KafKa集群如何管理调度
- 如何进行负载均衡
- 各组件之间如何进行通信
KafKa特性
1、消息持久化
KafKa高度依赖于文件系统来存储和缓存消息。说到文件系统,大家普遍认为磁盘读写慢,依赖于文件系统进行存储和缓存消息势必在性能上会大打折扣,其实文件系统存储速度快慢一定程度上也取决于我们对磁盘的用法。
KafKa官网介绍:磁盘线性写的速度约是随机写的速度的6000多倍。由此看来,磁盘的快慢取决于我们是如何应用磁盘的。
KafKa是基于JVM的,Java对象的增加会导致JVM的垃圾回收也越来越繁琐,这些都加大了内存的消耗。鉴于以上因素,使用文件系统和依赖于页缓存(page cache)的存储比维护一个内存的存储或者是应用其他结构存储消息更有优势,因此KafKa选择以文件系统来存储数据;
因为是顺序追加,所以KafKa在设计上是采用的时间复杂度为O(1)的磁盘结构,它提供了常量的时间性能,即使是存储海量信息(TB级别)也是如此,性能和数据的大小关系也不大,同时KafKa将数据持久化到磁盘上,这样只要磁盘空间足够大数据就可以一直追加,而不会想消息系统在消息被消费之后就删除掉,KafKa提供了相关配置让用户决定消息需要保存多久,因此,KafKa能够在没有性能损失的情况下提供一般消息系统不具备的特性;
正式因为KafKa将消息持久化,使得KafKa在机器重启之后,已存储的消息可以继续恢复使用。同时KafKa能够很好的支持在线或者离线的处理、与其他存储以及流处理框架集成。
2、高吞吐量
高吞吐量是KafKa设计的主要目标,KafKa将数据写到磁盘,充分利用磁盘的顺序读写。同时KafKa在数据写入以及数据同步采用了零拷贝(zero-copy)技术,采用sendFile()函数调用,该函数是在两个文件描述符之间直接传递数据,完全在内核中操作,从而避免了内核缓冲区与用户缓冲区之间数据的拷贝,操作效率极高。KafKa还支持数据压缩以及批量发送,同时KafKa将每个主题划分为多个分区,这一系列的优化以及实现方法使得KafKa具有很高的吞吐量。KafKa支持每秒钟数百万级别的消息。
3、扩展性
KafKa依赖ZooKeeper来对集群进行协调管理,这样使得KafKa更加容易进行水平扩展。生产者、消费者和代理都为分布式,可以配置多个。同时在机器扩展的时候无需将整个集群停机,集群可以自动的感知,重新进行负载均衡以及数据复制。
4、多客户端支持
KafKa支持多种连接器和多种语言接入,与当前大多数主流的数据框架都可以很好的集成。
5、KafKa Streams
KafKa Streams是一个用Java语言实现的用于流处理的jar文件。
6、安全机制
- 通过SSL和SASL(Kerberos),SASL/PLAIN验证机制支持生产者、消费者与代理连接时的身份认证;
- 支持代理与ZooKeeper连接身份验证;
- 通信的时候数据加密;
- 客户端读、写权限认证;
- KafKa支持与外部其他认证授权服务的集成;
7、数据备份
KafKa可以为每个主题指定副本数,对数据进行持久化备份,这可以在一定的程度上方式数据的丢失,提高可用性。
8、轻量级
KafKa的代理是无状态的,代理不记录消息是否被消费,消息偏移量的管理工作交由消费者自身或者组协调器来完成。同时集群本身不需要生产者和消费者的状态信息,这就使得KafKa非常的轻量级。
9、消息压缩
KafKa支持Gzip、Snappy以及LZ4这三种压缩方式,通常把多条消息放在一起组成MessageSet,然后将MessageSet放到一条消息里面,从而提高压缩比率进而提高吞吐量。