Apache Kafak概念

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

几个重要基本的概念:缓存

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

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

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

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

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

3.Message:消息,通讯的基本单位,每一个Producer能够向一个Topic发送消息    性能

4.Producer:消息和数据的生产者操作系统

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

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

7.zookeeper:经过Zookeeperl来存储进群的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从leaderpull消息,写入本地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文件的不一样扩张,将对消息文件的维护以及已经消费的消息的清理带来严重的影响。

相关文章
相关标签/搜索