文档章节

Apache Kafak概念

ZH-JSON
 ZH-JSON
发布于 06/18 19:08
字数 1611
阅读 11
收藏 0

Kafak是基于发布订阅的消息系统。是一个分布式,可分区,冗余备份的持久化的消息系统。主要用户处理活跃的流式数据。

几个重要基本的概念:

1.Topic :主题,特指Kafak处理的消息源的不同分类。

2.Partition: Topic物理上的分组,一个Topic可以分为多个partition.每个Partition都有一个有序的队列。Partition中的每个消息都会分配一个有序的id(offset).

      replicas:Partition的副本集,保证partition的高可用。

      leader:repliocas中的一个角色,producer和consumer只和Leader交互。

      followers:replicas中的一个角色,从leader中的复制数据,作为副本,一旦leader挂掉,从他的followers中选出一个新的leader继续提供服务。

3.Message:消息,通信的基本单位,每个Producer可以向一个Topic发送消息    

4.Producer:消息和数据的生产者

5.Consumer:消息和数据的消费者

6.Broker :缓存代理,kafak集群中一台或者多台机器统称broker。

7.Zookeeper:通过Zookeeper来存储进群的topic,partition等信息。

Kafak为什么要将topic进行分区

1.Topic是逻辑概念,面向的是producer和consumer,而partition是物理概念。如果Topic不进行分区,而将Topic内所有的消息都存储在一个broker,那么关于该Topic的所有读写都将由一个borker处理,吞吐量很容易有瓶颈。

2.有了Partition概念以后,假设一个topic被分为10个partition,kafak会根据一定算法将10个Partition尽可能分配到不同的broker.

3.当partition发布消息时,producer客户端可以采用random,key-hash轮询等算法选定partition

4.当consumer消费消息时候,Consumer客户端可以采用range,轮询等算法分配partition,从而在不同的broker拉取对应的Partition的leader分区。

所以,在partition机制可以极大的提高系统的吞吐量,并且使得系统具有良好的水平扩展能力。

Kafak的消息发送和消费的基本流程

1.Producer:根据指定的partition方法(random,hash等),将消息发送给指定topic的partition.

     producer采用push进行模式将消息发布到Broker,每条消息将append到partition中,属于顺序写磁盘。Producer会将消息发送到到broker时候,会根据分区算法将其存储到哪一个partition。

     写入流程:

     1.Producer先从zk中找到partition的leader。

     2.producer将数据发送给leader。

     3.leader将消息写入本地log。

     4.followers从leader中pull消息,写入本地log向leader发送ack。

     5.leader收到所有的ISR中的replicas的cas后,增加HW,并像producer发送ack。

  Producer的消费发送模式:通过 producer.type进行配置

     1.默认同步sync。 可以保证消息的可靠性

     2.可以设置成为异步async。可以是producer以batch的形似push数据。这样极大提高了Brokder性能。

2.Kafak集群:接收到producer发送过来的消息,将其持久化到硬盘,并保留消息指定时长。

       物理上将Topic分为多个partition,每个partition物理上对应一个文件夹(文件夹存储改partition的所有消息和索引文件)

3.Consumer:从kafak集群pull数据,并控制获取消息的offset.至于消费的进度,可手动或者自动提交给kafak集群。pull模式可以自主控制消费的速率,同时Consumer可以控制消费方式,可批量消费也可以逐条消费。同时还能选择不同的提交方式。

       一个消息只能被group内的一个comsumer所消费,且consumer消费消息时不关注offset,最后一个offset有zk保存。下次消费时,该group中的Consumer将从offset记录的位置开始消费。

     注意:1.如果消费线程大于Partition数量,有些线程将收不到消息。

              2.如果partition数量大于消费线程数,那么一个线程将会接收多个partition的消息。

              3.如果一个消费线程消费多个partition,则无法保证你接受到消息的顺序,而一个partition内的消息是有序的。

         

Kafak的数据存储模型

       Kafak的每个topic下面的所有消息都是以Partition的方式存储在多个节点上。同时在kafak的机器上,每个partition其实会对应一个日志目录,在目录下面上会对应多个日志分段(LogSegment)。

       LogSegment文件由两部分组成,分别为.index文件和.log文件,分别用来存储索引和数据。这两个文件的命名规则为:Partition全局的第一个segment从0开始,后续每个segment文件为上一个segment文件最后最后一条消息的offset值。

Kafak如何读取offset数据

     如果我们要读取911条数据

      首先:第一步,找到他属于哪一段,根据二分查找找到属于他的文件,找到0000900.index和0000900.log之后。

      然后,去.index中查找(911-900)=11这个索引或者小于11最近的索引,在这里 通过二分查找我们找到的索引是[10,1367]       

      10表示,第10条消息开始。1367表示,在.log的第1367字节开始。

      然后,我们通过这条索引的物理位置1367,开始往后查找,直到找到911条数据。

      大多数情况下,只需按照顺序读即可。而在顺序读中,操作系统会对内存和磁盘之间添加page cahe,也就是我们平常见的预读操作,所以我们顺序读时候速度很快。但是Kafak有个问题,就是分区过多,那么日志分段也会很多,写的时候由于是批量写,其实就是会变成随机写了。

      为何不以partition为最小存储单位,可以想象当producer不停的发送消息,必然会引起partition文件的不同扩张,将对消息文件的维护以及已经消费的消息的清理带来严重的影响。

 

© 著作权归作者所有

ZH-JSON
粉丝 1
博文 41
码字总数 35464
作品 0
浦东
高级程序员
私信 提问
Flink消费kafka消息实战

版权声明:欢迎转载,请注明出处,谢谢。 https://blog.csdn.net/boling_cavalry/article/details/85549434 本次实战的内容是开发Flink应用,消费来自kafka的消息,进行实时计算; 环境情况 ...

博陵精骑
01/01
0
0
apache kafka技术分享系列(目录索引)

目录索引: Kafka使用场景 1.为何使用消息系统 2.我们为何需要搭建ApacheKafka分布式系统 3.消息队列中点对点与发布订阅区别 kafka开发与管理: 1)apachekafka消息服务 2)kafak安装与使用 ...

dannyhe
2015/09/06
453
1
kafka 中间件,新公司总会学很多东西,来小结下

一个Topic 下可以有好多Group, 每个Group分别可以开多个消费者,每个组的消费者不会重复收到消息,这个组是个整体,一起消费消息。 如果想同时收到消息,就开Group就行了。 消费kafak的时候...

uaisunshine
2016/03/22
187
3
kafak主节点cpu 内存持续飙高,不回收,最后服务挂掉问题?

kafak主节点cpu 内存持续飙高,不回收,最后服务挂掉问题? XmlIpcRegSvc->172.18.58.184:60686 (CLOSE_WAIT) 有很多这个样的端口关闭等待,这是应用连接端。为什么一直等待呢?内存也没有回...

rui1988221
2018/08/23
300
4
storm 读取不到对应的kafka数据

坑一:pom文件主要内容:注意里面 需要 使用 “exclusion”排除相关的依赖 坑二: input.getBinaryByField(“bytes”); 里面一定要写成bytes,这是上游kafkaSpout 传递过来,源码中也可以看到...

bymain
2018/05/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

js中的super小结

1.this和super的区别: this关键词指向函数所在的当前对象 super指向的是当前对象的原型对象 2.super的简单应用 const person = {name:'jack'}const man = {sayName(){retur...

Jack088
6分钟前
1
0
W3C标准及其规范

万维网联盟(外语缩写:W3C)标准不是某一个标准,而是一系列标准的集合。 网页主要由三部分组成:结构(Structure)、表现(Presentation)和行为(Behavior)。 对应的标准也分三方面:结构...

元歌
11分钟前
0
0
IT兄弟连 Java语法教程 流程控制语句 循环结构语句1

循环语句可以在满足循环条件的情况下,反复执行某一点代码,这段被重复执行的代码被称为循环体,当反复执行这个循环体时,需要在合适的时候把循环条件该为假,从而结束循环,否则循环将一直执...

老码农的一亩三分地
19分钟前
0
0
OSChina 周二乱弹 —— 你一辈子都不可能跟她这么亲近

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @tom_tdhzz :#今日歌曲推荐# 分享George Benson的单曲《Six Play》: 《Six Play》- George Benson 手机党少年们想听歌,请使劲儿戳(这里) ...

小小编辑
今天
853
11
优雅的关闭Spring Boot

优雅的关闭Spring Boot 1、实现 TomcatConnectorCustomizer 接口拿到Tomcat的连接获取 Tomcat连接池 2、实现 ApplicationListener<ContextClosedEvent> 监听服务器关闭事件,注册JVM钩子函数...

sowhat
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部