Spark Streaming揭秘 Day33

Kafka内核再揭秘

优秀的框架会把引擎做到极致,Kafka就是这样,让我们再深入一下研究。

设计目标

kafka系统有着比较独特的的设计,包括5点:

  1. kafka第一设计原则是速度,不是个考虑功能的消息组件,主要考虑的是消息的传递速度,为了速度可以舍弃功能。

  2. 首要的考量是消息的吞吐量,而不是功能。使用3台pc Server,可以达到每秒百万条消息的吞吐量。

  3. kafka和其他消息系统不太一样,消息在磁盘上可以持久化,所以消息存储能力是无限的,从kafka角度讲就是个分布式文件系统,消息可以重复消费。

  4. 哪些数据已经被使用,不是保存在broker上,而是保存在consumer中,所以可以根据业务逻辑去做很多很有意思的操作,可以认为kafka就是个实时的动态数据来源。consumer(比如sparkstreaming)去维护哪些消息被消费,这个和一般消息中间件也是不一样的。

  5. 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

Kakfa揭秘 Day2 Kafka内核再揭秘的更多相关文章

  1. Kakfa揭秘 Day4 Kafka中分区深度解析

    Kakfa揭秘 Day4 Kafka中分区深度解析 今天主要谈Kafka中的分区数和consumer中的并行度.从使用Kafka的角度说,这些都是至关重要的. 分区原则 Partition代表一个to ...

  2. Kakfa揭秘 Day3 Kafka源码概述

    Kakfa揭秘 Day3 Kafka源码概述 今天开始进入Kafka的源码,本次学习基于最新的0.10.0版本进行.由于之前在学习Spark过程中积累了很多的经验和思想,这些在kafka上是通用的. ...

  3. Kakfa揭秘 Day1 Kafka原理内幕

    Spark Streaming揭秘 Day32 Kafka原理内幕 今天开始,会有几天的时间,和大家研究下Kafka.在大数据处理体系中,kafka的重要性不亚于SparkStreaming.可以认为 ...

  4. Kafka 高性能吞吐揭秘

    Kafka 高性能吞吐揭秘   Kafka作为时下最流行的开源消息系统,被广泛地应用在数据缓冲.异步通信.汇集日志.系统解耦等方面.相比较于RocketMQ等其他常见消息系统,Kafka在保障了大部分 ...

  5. 阅读《Oracle内核技术揭秘》的读书笔记

    阅读<Oracle内核技术揭秘>,对oracle的内存结构.锁.共享池.undo.redo等整理成了如下的思维导图:

  6. Spark Tungsten揭秘 Day2 Tungsten-sort Based Shuffle

    Spark Tungsten揭秘 Day2 Tungsten-sort Based Shuffle 今天在对钨丝计划思考的基础上,讲解下基于Tungsten的shuffle. 首先解释下概念,Tung ...

  7. Catalyst揭秘 Day2 Catalyst源码初探

    Catalyst揭秘 Day2 Catalyst源码初探 这节课从源码角度来讲catalyst. 首先有一个观点要澄清,就是技术不是越底层就越是性能和效率更高.因为除了指令执行性能以外,更重要的是架构 ...

  8. Kafka内核中的分布式机制实现

    Kafka内核中的分布式机制实现 一个Topic中的所有数据分布式的存储在kafka集群的所有机器(broker)上,以分区(partition)的的形式进行数据存储:每个分区允许存在备份数据/备份分 ...

  9. 干货 | Kafka 内核知识梳理,附思维导图

    前面我们已经分享过几篇Kafka的文章,最近简单梳理了下Kafka内核相关的知识,涵盖了Kafka架构总结,副本机制,控制器,高水位机制,日志或消息存储,消息发送与消费机制等方面知识.文末含对应的Ka ...

随机推荐

  1. 想学React Native?你只需要一个App!(11月5号更新)

    最近有点空闲时间,顺手研究下react-native,2013年的时候在老师的指导下使用jQuery Mobile做过手机应用,那个运行速度慢呀!让我对WebApp和PhoneGap这一类的跨平台Ap ...

  2. CSS 实现行内和上下自适应的几种方法

    在写一个移动端网页,发现网页的头部搜索框两边各有固定宽度的按钮,搜索框可以根据宽度的变化来改变自己的宽度,达到填充的目的,也就是一种自适应吧,下面写写自己尝试的几种方法 一 利用css3 的width ...

  3. 使用SCNetworkReachability判断网络是否连接

    先来看一下整个方法 - (BOOL)isConnectionAvailable { //创建零地址,0.0.0.0的地址表示查询本机的网络连接状态 struct sockaddr_in zeroAdd ...

  4. 关于JAVA那点事---i++和++i

    对i++和++i 一直有点晕,今天专门抽空来研究相关的知识. 先从简单的说起. 有如下程序: int i=0; i=i++; system.out.print(i); 一眼望去这个结果显而易见是1,但 ...

  5. I2C驱动程序

    i2c_add_driver i2c_register_driver driver->driver.bus = &i2c_bus_type; driver_register(&d ...

  6. Oracle_11g中解决被锁定的scott用户的方法(转载)

    转自:http://www.2cto.com/database/201402/277206.html Oracle 11g中修改被锁定的用户:scott 在安装完Oracle11g和创建完oracle ...

  7. gitlab ce 中删除空项目之后,没有删除掉,访问500

    在VirtualBox中的gitlab ce,在管理页面的操作如下: 新建一个仓库名为test的仓库,并从gitlab中导入 导入失败,使用root用户登录,在 Admin Area -> Pr ...

  8. 【转】android应用程序签名

    概述 Android系统要求,所有的程序经过数字签名后才能安装.Android系统使用这个证书来识别应用程序的作者,并且建立程序间的信任关系.证书不是用于用户控制哪些程序可以安装.证书不需要授权中心来 ...

  9. JMS - Message

    一条 JMS 消息包含三个部分:消息头.消息属性和消息体. 消息头 消息头提供了和消息有关的元数据,它描述了消息有谁创建.何时创建.数据的有效长度等信息.消息头还包含了描述消息目的地(主题或队列)的路 ...

  10. Xcode6:The file couldn’t be opened because you don’t have permission to view it

    最近为了兼容iOS8升级到Xcode6.0编译之前的工程,结果App无法在真机上运行.报错如下: The file “xxxx.app” couldn’t be opened because you ...