【Kafka入门】Kafka基础结构和知识
基本概念的总结
在基本的Kafka架构中,producer将消息发布到Kafka话题中,一个Kafka话题通常指消息的类别或者名称,Kafka话题被集群中一个充当Kafka server角色的
broker创建。Kafka broker用来存储消息,consumer可以订阅一个或者多个话题来获取话题中的消息。其中Kafka brokers用Zookeeper来获取消息状态,
而Kafka consumers则利用Zookeeper来跟踪消息的offset。具体如下图所示:
上图是一个只有一个Kafka broker的架构,其中包含一个topic,该topic包含4个partition,上图包含了Kafka中最重要的5个组件:Zookeeper, Broker, Topic, Producer, and Consumer。
在Kafka话题中,每一个partition都被映射到一个逻辑日志文件中,日志文件呈现为一组大小相等的段文件。每一个partition是一个有序的,不可变的消息序列;每一次当有消息被发布到这个partition,负责该partition的broker将新来的消息追加到该partition最后一个段文件中。在存储的消息的条数达到配置的消息条数或者当过了一段时间后,这些段文件将刷写到磁盘中。一旦段文件被刷写到磁盘,这些消息就可以被Kafka consumer消费。
每个消息在partition中都有一个称为offset的标记,该标记是有序,唯一的序号。每个partition可以有选择的冗余多份,以保证可用性。在多个partition存在的情况下,有一个称为leader的partition,其他partition都称为follower。其中leader负责该partition所有的读写请求,而follower则异步的更新本地来和leader保持一致,所以在消息的一致性上,follower是要延迟于leader的。
Kafka动态维护一组同步副本(ISR),该副本紧跟leader与其内容保持一致,并将最新的ISR同步给Zookeeper。如果leader挂了,一个follower(在ISR同步副本中)将自动成为新的leader。在Kafka集群中,每个server都扮演双重角色,它作为一些partition的leader的同时,也作为其他partition的follower,这确保了Kafka集群内的负载平衡。
在Kafka中有一个consumer group的概念,每个consumer只是consumer group中的一个进程。一个话题中的一条消息只能被consumer group中的一个consumer进程消费,也就是说,如果要求该话题中的某消息被多个consumer消费,则这些consumer必须在不同的consumer group中。
consumer总是从一个特定的partition顺序地消费消息,并应答消费了的消息的offset,已经应答的offset意味着consumer已经消费了这些信息。consumer发出了一个包含消息offset的异步请求给broker,并得到字节的缓冲区。
在Kafka的设计中,broker是无状态的,也就是说,在broker中不存储哪些消息被哪些consumer消费了,这些消费记录被设计存储在consumer中,也就是说,broker根本不知道哪些消息被消费了。在Kafka中,给消息定义了一个SLA (service level agreement),SLA表示消息的保留时间,一旦消息保留时间超过SLA,则会被删除,这种设计有意无意的提示了consumer去消费旧消息,不然就会被删除。
Kafka设计的一些重点总结:
1. Kafka最重要的基石是消息在文件系统上的缓冲和存储。在Kafka中,消息是立即写到操作系统内核页的,数据的缓冲和刷写到磁盘都是可配置的。
2. Kafka提供消息的长时间存储,即使消息已经被消费过,它支持consumer再消费。
3. Kafka利用消息集合来group消息,从而减小网络带宽的消耗。消息被消费的元数据不是存储在server上,而是在consumer上。这可以避免“消息的丢失”和“同一消息的多次传输”。
4. consumers将状态信息储存在Zookeeper上,Kafka也允许将这些信息存储到其他存储系统上。
5. 在Kafka中,producer和consumer以一种推-拉的模式工作,其中producer将信息推到Kafka broker上,然后consumer则从broker上拉取信息。
6. Kafka的设计中没有master的概念,所有的broker都是对等的。这种设计使得broker的添加和删除变得简便,因为broker的元数据信息被Zookeeper维护着并被所有的consumer共享。producer在发送数据给broker时也可以在同步和异步的模式中作选择。
消息压缩
在Kafka中,支持对消息分组压缩,以获得更高效的信息传输,这种压缩一次压缩多个消息,而不是一个消息。一组消息压缩后然后在发送给broker,这能有效减少网络带宽的消耗。
在Kafka0.8中,每个分区的leader broker在消息追加到日志上前,需要给每一个消息赋予一个独一无二的逻辑offset,所以如果消息是压缩的,broker需要解压缩,然后才能给每条消息赋予offset,对于压缩的数据,在赋予完offset后,broker还需要再压缩这些数据然后再刷写到磁盘上。所以,数据的压缩对broker的CPU的负载是一大挑战。
消息最初的压缩是发生在producer端的,可支持的压缩协议包括GZIP和Snappy,具体配置如下:
Property name |
Description |
Default value |
compression.codec |
This parameter specifies the compression codec for all data generated by this producer. Valid values are none, gzip, and snappy. |
none |
compressed.topics |
This parameter allows you to set whether compression should be turned on for particular topics. If the compression codec is anything other than none, enable compression only compressed.topics for specified topics, if any. If the list of compressed topics is empty, then enable the null specified compression codec for all topics. If the compression codec is none, compression is disabled for all topics. |
null |
消息partition
对消息如何partition由producer决定,broker按照消息来的先后顺序存储,在Kafka broker可以为每一个topic配置partition数目。
partition冗余
冗余是Kafka0.8的新特性,冗余可以提高Kafka的可用性,其中producer和consumer都是可感知冗余的。下图形象展示了冗余的特性:
在冗余机制下,每个拥有n个冗余的partition可以容忍n-1个冗余的不可用,在这n个冗余中,其中有一个担任leader的冗余,其余的冗余称为follower,这些可用的follower构成一个ISR集合,Zookeeper维护着每个partition的leader的信息和ISR的信息。
partition冗余方式
1. 同步冗余:消息在producer端分成了不同的partition,对于每一个partition,producer首先同Zookeeper确定该partition的lead broker,然后将消息发布到该broker上,当消息都发布完了,消息将刷写到lead broker的log上,然后关于该partition的所有follower都在该lead broker拉取该partition,通过单一通道来保证消息的顺序。每个follower拉取完毕partition并存储到本地log后,会返回一个应答给lead broker。当收到所有follower的应答后,lead broker则返回一个应答给producer。此时,该partition可以被consumer消费。
2. 异步冗余:异步冗余则不会等待所有的follower的应该就应答producer,这种机制如果lead broker挂掉的话则不能保证消息的正常消费。
对于某个ISR集合中的follower挂掉后,leader则将该follower从ISR集合中剔除,其他的follower继续同步信息;
如果是leader挂掉了,就算失败发生在最后的应答前,producer还是会再次发布该partition到新的leader上。
leader挂掉会经历如下几个过程:
1)从ISR集合中,所有follower中最早注册的replica称为新的leader,其他的依然为follower;
2)新leader的log end offset(LEO)成为该partition的最终提交消息;
3)新leader在配置时间过了后或者所有的replica都同步好了后,将新的ISR同步给Zookeeper,并启动读写服务。
Kafka学习刚入门,如有理解错误请给位指正!
【Kafka入门】Kafka基础结构和知识的更多相关文章
- kafka学习笔记(一)消息队列和kafka入门
概述 学习和使用kafka不知不觉已经将近5年了,觉得应该总结整理一下之前的知识更好,所以决定写一系列kafka学习笔记,在总结的基础上希望自己的知识更上一层楼.写的不对的地方请大家不吝指正,感激万分 ...
- 《OD大数据实战》Kafka入门实例
官网: 参考文档: Kafka入门经典教程 Kafka工作原理详解 一.安装zookeeper 1. 下载zookeeper-3.4.5-cdh5.3.6.tar.gz 下载地址为: http://a ...
- kafka 入门笔记 #1
kafka 入门笔记(#1) 单机测试 下载版本,解压 tar -xzf kafka_2.11-0.10.1.1.tgz cd kafka_2.11-0.10.1.1 启动服务 Kafka用到了Zoo ...
- Kafka入门介绍
1. Kafka入门介绍 1.1 Apache Kafka是一个分布式的流平台.这到底意味着什么? 我们认为,一个流平台具有三个关键能力: ① 发布和订阅消息.在这方面,它类似一个消息队列或企业消息系 ...
- 超详细“零”基础kafka入门篇
1.认识kafka 1.1 kafka简介 Kafka 是一个分布式流媒体平台 kafka官网:http://kafka.apache.org/ (1)流媒体平台有三个关键功能: 发布和订阅记录流,类 ...
- Kafka入门 --安装和简单实用
一.安装Zookeeper 参考: Zookeeper的下载.安装和启动 Zookeeper 集群搭建--单机伪分布式集群 二.下载Kafka 进入http://kafka.apache.org/do ...
- 项目17-超详细“零”基础kafka入门篇
分类: Linux服务篇,Linux架构篇 1.认识kafka 1.1 kafka简介 Kafka 是一个分布式流媒体平台 kafka官网:http://kafka.apache.org/ (1) ...
- 转 Kafka入门经典教程
Kafka入门经典教程 http://www.aboutyun.com/thread-12882-1-1.html 问题导读 1.Kafka独特设计在什么地方?2.Kafka如何搭建及创建topic. ...
- Kafka 入门和 Spring Boot 集成
目录 Kafka 入门和 Spring Boot 集成 标签:博客 概述 应用场景 基本概念 基本结构 和Spring Boot 集成 集成概述 集成环境 kafka 环境搭建 Spring Boot ...
- _00017 Kafka的体系结构介绍以及Kafka入门案例(0基础案例+Java API的使用)
博文作者:妳那伊抹微笑 itdog8 地址链接 : http://www.itdog8.com(个人链接) 博客地址:http://blog.csdn.net/u012185296 博文标题:_000 ...
随机推荐
- eclipse进行开发
最近在用eclipse进行开发的时候遇到了一个很奇怪的问题,其实这个问题很早以前就遇到了只是苦于一直没有需找到答案.直到今天又遇到了,才觉得这真是个很实用很使用的功能,所以分享给大家,希望对大家有帮助 ...
- PHP设计模式浅析
工厂模式 提到的最多, 用途也最广. 简单说就是: 定义一个用户创建对象的接口. 把创建对象的过程封装起来. 工厂类是指包含一个专门用来创建其他对象的方法的类,工厂类在多态性编程实践中是至关重要的,它 ...
- ArrayList源代码深入剖析
第1部分 ArrayList介绍ArrayList底层采用数组实现,它的容量能动态增长.它继承于AbstractList,实现了List, RandomAccess, Cloneable, java. ...
- zip文件解压或压缩
<span style="font-size:18px;">/** * lsz */ public final class ZipUtil { /** * 解压zip文 ...
- WinCE NAND flash - FAL
http://blog.csdn.net/renpine/article/details/4572347 http://msdn.microsoft.com/en-US/library/ee48203 ...
- Hibernate个人总结
编写Hibernate第一个程序 Hibernate是目前最流行的持久层框架,专注于数据库操作.使用Hibernate框架能够使开发人员从繁琐的SQL语句和复杂的JDBC中解脱出来.Hibernate ...
- Hive简介
实验简介 我们本节课程主要介绍 Hive 的相关知识,将会涉及以下内容: Hive 的定义 Hive 的体系结构 Hive 与关系数据库的区别 Hive 的应用场景 Hive 的存储 一.什么是 Hi ...
- Angularjs checkbox的ng属性
angularjs 默认给 input[checkbox] 元素定制了一些属性,如: <input type="checkbox" ng-mudel="name&q ...
- Netfilter&iptables:如何理解连接跟踪机制?
如何理解Netfilter中的连接跟踪机制? 本篇我打算以一个问句开头,因为在知识探索的道路上只有多问然后充分调动起思考的机器才能让自己走得更远.连接跟踪定义很简单:用来记录和跟踪连接的状态. 问:为 ...
- POI根据EXCEL模板,修改内容导出新EXCEL (只支持HSSF)
package excelPoiTest; import java.io.File; import java.io.FileInputStream; import java.io.FileOutput ...