Apache Kafak概念

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文件的不同扩张,将对消息文件的维护以及已经消费的消息的清理带来严重的影响。

 

转载于:https://my.oschina.net/u/3126880/blog/3063515

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值