【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 ...
随机推荐
- Linux命令ln的使用
ln是linux中一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个链接,这个命令最常用的参数是-s,具体用法是:ln –s 源文件 目标文件. 当我们需要在不同的目录,用到相同的文件时, ...
- 1962-Fibonacci
描述 This is an easy problem.I think Fibonacci sequence is familiar to you.Now there is another one. H ...
- 修改tomcat的默认编码
在tomcat的安装路径下查找conf文件下的server.xml文件,修改此文件即可,修改内容如下: <Connector port="8080" protocol=&qu ...
- java:I/O 往原文件追加内容
原来txt内容: "我要添加内容" import java.io.*; class Test { public static void main(String[] args) { ...
- 去除右键菜单opendlg
环境:windows8.1专业版 未知文件类型,右键会多出一个opendlg的选项!下面是移除的方法: 将下面的内容复制到记事本,并另存为XXX .reg,导入注册表即可! Windows Reg ...
- Flash Builder 4.6 找不到所需的Adobe Flash Player
问题: 安装完Flash Builder 4.6 ,第一次运行项目,出现如下错误提示: “Flash Builder 找不到所需版本的 Adobe Flash Player.您可能需要安装该版本的 F ...
- Java汉字排序(2)按拼音排序
对于包含汉字的字符串来说,排序的方式主要有两种:一种是拼音,一种是笔画. 本文就讲述如何实现按拼音排序的比较器(Comparator). 作者:Jeff 发表于:2007年12月21日 11:27 最 ...
- 【转】Android设计中的.9.png
来源:http://isux.tencent.com/android-ui-9-png.html Android设计中的.9.png 注意:当使用9.png做TextView背景时,一定要设置内容区域 ...
- Poj2948Martian Mining(记忆化)
链接 这题意好难懂 看得迷迷糊糊 想的也迷迷糊糊 后来睡了会突然想到了..不就是类似以前的矩阵操作 从右下角记忆化 大的由小的推来 dp[i][j] = max(dp[i-1][j]+s1,dp ...
- git恢复被修改的文件
恢复到最后一次提交的改动: git checkout -- + 需要恢复的文件名 但是,需要注意的是,如果该文件已经 add 到暂存队列中,上面的命令就不灵光喽 需要先让这个文件取消暂存: git r ...