如果你第一次看kafka的文章,请先看《分布式消息系统kafka初步》

之前有人问kafka和一般的MQ之间的区别,这个问题挺难回答,我觉得不如从kafka的实现原理来分析更为透彻,这篇将依据官网上给出的design来详细的分析,kafka是如何实现其高性能、高吞吐的。这一段应该会挺长的我想分两篇来写。今天这一篇主要从宏观上说kafka实现的细节,下一篇,在从具体的技术上去分析。

我们先看kafka的设计元素:

1. 通常来说,kafka的使用是为了消息的持久化(persistent messages)

2. 吞吐量是kafka设计的主要目标

3. 关于消费的状态被记录为consumer的一部分,而不是server。这点稍微解释下,这里的server还是只broker,谁消费了多少数据都记录在消费者自己手中,不存在broker中。按理说,消费记录也是一个日志,可以放在broker中,至于为什么要这么设计,我们写下去了再说。

4. Kafka的分布式可以表现在producer、broker、consumer都可以分布在多台机器上。

在讲实现原理之前,我们还得了解几个术语:

l  Topic:其实官网上没有单独提这个词,但topic其实才是理解的关键,在kafka中,不同的数据可以按照不同的topic存储。

l  Message:消息是kafka处理的对象,在kafka中,消息是被发布到broker的topic中。而consumer也是从相应的topic中拿数据。也就是说,message是按topic存储的。

l  Consumer Group:虽然上面的设计元素第四条,我们说三者都可以部署到多台机器上,三者分别并作为一个逻辑的group,但对于consumer来说这样的部署需要特殊的支持。Consumer Group就是让多个(相关的)进程(机器)在逻辑上扮演一个consumer。这个group的定义其实是为了去支持topic这样的语义。在JMS中,大家最熟悉的是队列,我们将所有的consumer放到一个group中,这样就是队列。而topic则是将consumer放置到与它相关的topic中去。所以无论一个topic存在于多少个consumer中, a message is stored only a single time。你可能会有疑问,备份怎么办,接着看下去。

接下来,我们来看kafka的实现究竟依赖了哪些东西。

1.  硬件上,kafka选用了硬盘直接读写,当然这里也有策略。一个67200rpm STAT RAID5的阵列,线性读写速度是300MB/sec,如果是随机读写,速度则是50K/sec。差距很明显,所以kafka选的策略就是利用线性存储,至于怎么存,我们在存储中会说到。

2.  关于缓存,kafka没有使用内存作为缓存。操作系统用个特性,如果不用direct I/O,那些闲置的memory会去做disk caching,如果 a process maintains an in-process cache of the data,这样的情况下可能会产生双份的pagecache,会存储两遍。另外Kafka跑在JVM上,本身JVM垃 圾回收、创建对象都非常的耗内存,所以不再依赖于内存做缓存。All data is immediately written to a persistent log on the filesystem without any call to flush the data. 当然内核自己的flush不算了。温泉做一次32G的内存缓存,需要大概10多分钟。

3.    Liner writer/reader:这样做的虽然没有B树那样多样的变化,但却有O(1)的操作,而且读写不会相互影响。同时,线性的读写也解耦了数据规模的问题。用廉价的存储就可以达到很高的性价比。

4.    Zero-copy:将数据从硬盘写到socket一般需要经过…你可以自己算一下,这是操作系统里的知识,答案在文章末尾,具体也可以看这里:http://my.oschina.net/ielts0909/blog/85147。一句话,Zero-copy减少了IO的操作步骤。

5.   GZIP and Snappy compression:考虑到传输最大的瓶颈就在于网络上,kafka提供了对数据压缩的各种协议。

6.   事务机制:虽然kafka对事务的处理比较薄弱,但是在message的分发上还是做了一定的策略来保证数据递送的准确性:

At most once—this handles the first case described. Messages are immediately marked as consumed, so they can't be given out twice, but many failure scenarios may lead to losing messages.

At least once—this is the second case where we guarantee each message will be delivered at least once, but in failure cases may be delivered twice.

Exactly once—this is what people actually want, each message is delivered once and only once.

上述就是关于kafka的实现细节,主要写了关于kafka采用到的技术和使用技术的原因,在后面一篇中,我将主要讲述producer、broker、consumer之间的配合以及kafka的存储问题。

--------------------------------------------------------------------------------

To understand the impact of sendfile, it is important to understand the common data path for transfer of data from file to socket:

  1. The operating system reads data from the disk into pagecache in kernel space
  2. The application reads the data from kernel space into a user-space buffer
  3. The application writes the data back into kernel space into a socket buffer
  4. The operating system copies the data from the socket buffer to the NIC buffer where it is sent over the network

其实zero-copy这个技术我们已经在使用了,在NIO中的FileChannel中的transferTo就是采用这样的原理的。

在这一篇,我想主要写点儿kafka的存储,以及对前文kafka的分布式一些补充,kafka的应用中,分布式使用是一个很关键的主题,更好的理解producer、broker和consumer的分布式构建有利于提高系统整体的性能。这部分理论其实很简单,所以就不花大精力去写了。

在上一篇中,我们说到了kafka直接使用硬盘作为存储,并且不使用内存缓存。我们还说到,之所以要这么应用,主要是考虑到硬盘在线性读写时候速度完全能满足要求,以及使用内存缓存会带来的一些负面影响。如果你不是很了解,可以先看看之前的那篇。

有关存储方面,我们要引进几个概念:

l  Partition:同一个topic下可以设置多个partition,目的是为了提高并行处理的能力。可以将同一个topic下的message存储到不同的partition下。

l  Offset:kafka的存储文件都是按照offset.kafka来命名,用offset做名字的好处是方便查找。例如你想找位于2049的位置,只要找到2048.kafka的文件即可。当然the first offset就是00000000000.kafka。

l  Messages:这里写下message的构成,a fixed-size header和variable length opaque byte array payload组成。Header由version和checksum组成,checksum采用CRC32。

下图就反应了日志都是append的这一个过程:

在写的时候会有两个参数需要注意:The log takes two configuration parameter M which gives the number of messages to write before forcing the OS to flush the file to disk, and S which gives a number of seconds after which a flush is forced.

在分布式方面:

1.   broker的部署是一种no central master的概念,并且每个节点都是同等的,节点的增加和减少都不需要改变任何配置。

2.   producer和consumer通过zookeeper去发现topic,并且通过zookeeper来协调生产和消费的过程。

3.   producer、consumer和broker均采用TCP连接,通信基于NIO实现。Producer和consumer能自动检测broker的增加和减少。

Kafka实现细节(三)的更多相关文章

  1. Kafka 温故(三):Kafka的内部机制深入(持久化,分布式,通讯协议)

    一.Kafka的持久化 1.数据持久化:     发现线性的访问磁盘(即:按顺序的访问磁盘),很多时候比随机的内存访问快得多,而且有利于持久化:     传统的使用内存做为磁盘的缓存     Kafk ...

  2. Kafka详解三:开发Kafka应用

    问题导读 1.Kafka系统由什么组成?2.Kafka中和producer相关的API是什么? 一.整体看一下Kafka        我们知道,Kafka系统有三大组件:Producer.Consu ...

  3. Kafka使用kclient三种使用方法

    kclient提供了三种使用方法,对于每一种方法,按照下面的步骤可快速构建Kafka生产者和消费者程序. 前置步骤1) 下载源代码后在项目根目录执行如下命令安装打包文件到你的Maven本地库. mvn ...

  4. kafka入门(三)备份

    一.相关概念 备份相关的角色 Kafka消息备份分三个角色:分别是Leader副本.Follower副本.ISR集合 Leader副本 负责直接响应client端的读写请求,即和生产者和消费者直接对接 ...

  5. Kafka学习(三)-------- Kafka核心之Cosumer

    了解了什么是kafka( https://www.cnblogs.com/tree1123/p/11226880.html)以后 学习核心api之消费者,kafka的消费者经过几次版本变化,特别容易混 ...

  6. Kafka 系列(三)—— Kafka 生产者详解

    一.生产者发送消息的过程 首先介绍一下 Kafka 生产者发送消息的过程: Kafka 会将发送消息包装为 ProducerRecord 对象, ProducerRecord 对象包含了目标主题和要发 ...

  7. kafka学习(三)kafka生产者,消费者详解

    文章更新时间:2020/06/14 一.生产者 当我们发送消息之前,先问几个问题:每条消息都是很关键且不能容忍丢失么?偶尔重复消息可以么?我们关注的是消息延迟还是写入消息的吞吐量? 举个例子,有一个信 ...

  8. mysql.user细节三问

    一.如何拒绝用户从某个精确ip访问数据库假如在mysql.user表中存在用户'mydba'@'192.168.85.%',现在想拒绝此用户从某个精确ip访问数据库 # 创建精确ip用户,分配不同的密 ...

  9. 不该被忽视的CoreJava细节(三)

    一.不该被遗忘的移位位运算 本文主要介绍移位运算(Shift Operation), 适当介绍一下其它相关的位运算. 甭说计算机刚发明那会,就连21世纪初那段日子,计算机内存都是KB/MB计算的.编写 ...

随机推荐

  1. 2款适合HTML做音频和视频的插件

    Flowplayer-视频播放器 Flowplayer 是一个开源(GPL 3的)WEB视频播放器.您可以将该播放器嵌入您的网页中,如果您是开发人员,您还可以自由定制和配置播放器相关参数以达到您要的播 ...

  2. 005 爬虫(requests与beautifulSoup库的使用)

    一:知识点 1.安装requests库 2.Brautiful soup 可以提供一些简单的,python式的函数来处理导航,搜索,修改分析树等功能. 她是一个工具箱,通过解析文档为用户提供需要抓去的 ...

  3. Xcode的快捷键及代码格式化

    1. 文件CMD + N: 新文件 CMD + SHIFT + N: 新项目CMD + O: 打开 CMD + S: 保存 CMD+OPt+S:保存所有文件 CMD + SHIFT + S: 另存为 ...

  4. redis在Linux下的远程连接

    1.redis在Linux下的远程连接: $ redis-cli -h host -p port -a password 如何连接到主机为 127.0.0.1,端口为 6379 ,密码为 mypass ...

  5. python爬虫+词云图,爬取网易云音乐评论

    又到了清明时节,用python爬取了网易云音乐<清明雨上>的评论,统计词频和绘制词云图,记录过程中遇到一些问题 爬取网易云音乐的评论 一开始是按照常规思路,分析网页ajax的传参情况.看到 ...

  6. Tensorflow学习:(三)神经网络优化

    一.完善常用概念和细节 1.神经元模型: 之前的神经元结构都采用线上的权重w直接乘以输入数据x,用数学表达式即,但这样的结构不够完善. 完善的结构需要加上偏置,并加上激励函数.用数学公式表示为:.其中 ...

  7. In 和Exists

    1.exist,not exist一般都是与子查询一起使用. In可以与子查询一起使用,也可以直接in (a,b.....) 2.exist会针对子查询的表使用索引. not exist会对主子查询都 ...

  8. python 列表的浅拷贝和深拷贝

    转自:https://www.cnblogs.com/laolibk/p/7821369.html 浅拷贝 shallow copy 和深拷贝 deep copy list.copy() 浅拷贝:复制 ...

  9. 【WIN10】文本圖標

    在Storyboard動畫板中,我使用文本顯示了一個“心”形.在這裡,我將介紹一下文本圖標. 1.Segoe MDL2 Assets 首先,它必須使用字體:Segoe MDL2 Assets 其次,它 ...

  10. [CF1086E]Beautiful Matrix(容斥+DP+树状数组)

    给一个n*n的矩阵,保证:(1)每行都是一个排列 (2)每行每个位置和上一行对应位置不同.求这个矩阵在所有合法矩阵中字典序排第几.考虑类似数位DP的做法,枚举第几行开始不卡限制,那么显然之前的行都和题 ...