Spark Streaming揭秘 Day33
Kafka内核再揭秘
优秀的框架会把引擎做到极致,Kafka就是这样,让我们再深入一下研究。
设计目标
kafka系统有着比较独特的的设计,包括5点:
-
kafka第一设计原则是速度,不是个考虑功能的消息组件,主要考虑的是消息的传递速度,为了速度可以舍弃功能。
-
首要的考量是消息的吞吐量,而不是功能。使用3台pc Server,可以达到每秒百万条消息的吞吐量。
-
kafka和其他消息系统不太一样,消息在磁盘上可以持久化,所以消息存储能力是无限的,从kafka角度讲就是个分布式文件系统,消息可以重复消费。
-
哪些数据已经被使用,不是保存在broker上,而是保存在consumer中,所以可以根据业务逻辑去做很多很有意思的操作,可以认为kafka就是个实时的动态数据来源。consumer(比如sparkstreaming)去维护哪些消息被消费,这个和一般消息中间件也是不一样的。
-
kafka是个天然分布式系统,producer和consumer分布在不同的机器上,数量不会收到限制。运行的时候可以动态增减brokers,因为brokers是被zk管理的,consumer也会和zk打交道,zk作为适配层,让我们不需要关心状态信息,所以就算是broker挂掉,我们也不会感知到。
Consumer group
在kafka中,最小的通信单位是消息,消息是什么,由应用说了算。producer会以topic的方式,把消息交给brokers,topic是个抽象,也是个数据组织的方式,broker收到消息后,会存在具体的机器上,consumer可以订阅topic,producer所有发布的消息都会被订阅者感知到。
对于我们的一个topic而言,无论有多少个consumer,消息只会存储一次。consumer会注册给zookeeper,它会管理拓扑结构,所以可以协调数据的传输,
在订阅过程中,有个consumer group的概念,不同的group会同时消费,类似广播机制。但是如果在一个consumer group中有多个consumer,消息会在相同group中互斥。把所有的consumer放到一个group中,就类似队列。处理方式很灵活。
为什么会有consumer group的概念,每个consumer都一定要属于一个group,每个消息只会发给每个group中的一个consumer,一个group中的多个consumer,可能在不同机器上,但在逻辑上还是一个单位。这个抽象概念非常强大,目标是可以协调消费者,可以灵活的实现广播和队列。
性能设计
一个topic就是个table,table会动态增长,而且只是追加,在集群中有很多table,访问时访问table中的数据,有个巨大的优势是,只会在最新的基础上追加数据,所以不会有冲突,不需要加锁。完全可以使用磁盘的顺序读写,比随机读写快10000倍。
Kafka中用到了sendfile机制,随机读写是每秒k级别的,如果是线性读写可能能到每秒上G,kafka在实现时,速度非常快,是因为会把数据立即写入文件系统的持久化日志中,不是先写在缓存中,再flush到磁盘中。也就是说,数据过来的时候,是传输在os kernel的页面缓存中,由os刷新到磁盘中。在os采用sendfile的机制,os可以从页面缓存一步发送数据到网络中,同时,kafka支持gzip和Snappy对数据进行压缩,这个对传输数据至关重要。
数据存储采用topic-partition-record的三层体系,是个树状数据结构。对于树的存储,比较常用的是B tree,运行时间是O(logN),但是在因为需要锁定机制,在磁盘层面,在高速交换、数据规模比较大的时候,性能损耗还是比较厉害的。Kafka的方式是把所有消息看成普通的日志,理念就是把日志内容简单的追加,采用offset读取数据,优势是性能完全是线性的,和数据大小没有关系,同时,读取操作和写入操作不会互相阻塞,性能能永远达到最大化。
小结
通过一系列的设计,使用kafka,我们可以抛弃昂贵的高性能硬盘,可以以十分之一的硬件投入产生十倍的消息吞吐能力,还能存储无限大的消息,构建一个在线的、交互式、个性化的大数据系统!!!
欲知后事如何,且听下回分解!
DT大数据每天晚上20:00YY频道现场授课频道68917580