Kafka
官网地址
http://kafka.apache.org/21/documentation.html#introduction
Apache Kafka®是一个分布式流媒体平台。这到底是什么意思?流媒体平台有三个关键功能:发布和订阅记录流,类似于消息队列或企业消息系统。以容错的持久方式存储记录流。在记录发生时处理记录流。
Kafka通常用于两大类应用程序:
构建实时流数据管道,在系统或应用程序之间可靠地获取数据;
构建实时流应用程序,转换或响应数据流。
为了理解Kafka是如何做这些事情的,让我们深入研究一下Kafka的能力。
首先是一些概念:
Kafka作为集群运行在一个或多个服务器上,这些服务器可以跨多个数据中心。
Kafka集群将记录流存储在称为主题的类别中。
每条记录由一个键、一个值和一个时间戳组成。
具体组件
Topic :消息根据Topic进行归类,一个队列
Producer:发送消息者
Consumer:消息接受者
Broker:每个kafka实例(server)。一台kafka服务器就是一个broker。一个集群由多个broker组成。一个broker可以容纳多个topic。
Zookeeper:依赖集群保存meta信息。
其他概念:
Partition:为了实现扩展性,一个非常大的topic可以分布到多个broker(即服务器)上,一个topic可以分为多个partition,每个partition是一个有序的队列。partition中的每条消息都会被分配一个有序的id(offset)。kafka只保证按一个partition中的顺序将消息发给consumer,不保证一个topic的整体(多个partition间)的顺序。
要想topic有序要全局排序。(浪费资源)
Offset:kafka的存储文件都是按照offset.kafka来命名,用offset做名字的好处是方便查找。例如你想找位于2049的位置,只要找到2048.kafka的文件即可。当然the first offset就是00000000000.kafka。
Metadata:
Metadata是Topic/Partition 和 broker 的映射关系,每一个 topic 的每一个 partition,需要知道对应的 broker 列表是什么,leader是谁、follower 是谁。这些信息都是存储在 Metadata 这个类里面
消息分发方式:broker-(push)>topic<-(pull)consumer
klafka集群中的任何一个broker都可以向producer提供metadata信息,这些metadata中包含"集群中存活的servers列表"/"partitions leader列表"等信息;当producer获取到metadata信息之后, producer将会和Topic下所有partition leader保持socket连接;
消息由producer直接通过socket发送到broker
问题
-
在kafka中,一个partition中的消息只会被group中的一个consumer消费(同一时刻)
-
kafka只能保证一个partition中的消息被某个consumer消费时是顺序的;事实上,从Topic角度来说,当有多个partitions时,消息仍不是全局有序的。
kafka存储机制:首先理解Sequence I/O和Random I/O的区别,如果它在磁盘的某个地方,访问它会有同样的寻道和旋转时延,我们就把这种方式的IO叫做随机IO;但是如果它刚好就在你刚才访问的那一个磁盘块的后面,磁头就能立刻遇到,不需等待,这种IO就叫顺序IO
首先,kafka是“规规矩矩”的,因为Kafka在磁盘上只做Sequence I/O,由于消息系统读写的特殊性,这并不存在什么问题。
关于磁盘I/O的性能,Kafka官方给出的测试数据(Raid-5,7200rpm):
Sequence I/O: 600MB/s
Random I/O: 100KB/s
- OS从硬盘把数据读到内核区的PageCache。
- 用户进程把数据从内核区Copy到用户区。
- 然后用户进程再把数据写入到Socket,数据流入内核区的Socket Buffer上。
- OS再把数据从Buffer中Copy到网卡的Buffer上,这样完成一次发送。
传统网络IO
kafka
数据的存储机制:
1、Broker先接收到数据后,将数据放到操作系统(linux)的缓存里(pagecache),pagecache会尽可能多的使用空闲内存,
会是有sendfile技术尽可能多的减少操作系统和应用程序之间的重复缓存。
2、写入数据的时候使用顺序写入,速度可达600m/s
3、如果此时正好有消费者消费数据,会直接绕过磁盘从pagecache里进行消费
设计思想是在内存中完成整个过程,实现过程中的零拷贝
“零拷贝技术”是用将磁盘文件的数据复制到页面缓存中一次,然后将数据从页面缓存直接发送到网络中(发送给不同的订阅者时,都可以使用同一个页面缓存),避免了重复复制操作。