kafka笔记整理

目录

1.什么是kafka

2.kafka与传统消息系统的区别

3.kafka与activemq的区别

4.kafka的架构模型

5.kafka的组件介绍

6.kafka存储文件


1.什么是kafka

  • Apache Kafka是一个开源消息系统,由Scala写成。
  • Kafka是一个分布式消息队列。
  • Kafka对消息保存时根据Topic(主题)进行归类,发送消息者称为Producer,消息接受者称为Consumer,此外kafka集群有多个kafka实例组成,每个实例(server)称为broker。
  • 无论是kafka集群,还是producer和consumer都依赖于zookeeper集群保存一些meta信息,来保证系统可用性。

2.kafka与传统消息系统的区别

1)在架构模型方面:RabbitMQ遵循AMQP协议,RabbitMQbrokerExchange,Binding,queue组成,其中exchangebinding组成了消息的路由键;客户端Producer通过连接channelserver进行通信,Consumerqueue获取消息进行消费(长连接,queue有消息会推送到consumer端,consumer循环从输入流读取数据),rabbitMQbroker为中心;有消息的确认机制;kafka遵从一般的MQ结构,producerbrokerconsumer,以consumer为中心,消息的消费信息保存在客户端consumer上,consumer根据消费的点,从broker上批量pull数据;无消息确认机制。

2)在吞吐量上:kafka具有高的吞吐量,内部采用消息的批量处理,zero-copy机制,数据的存储和获取是本地磁盘顺序批量操作,具有O(1)的复杂度,消息处理的效率很高。rabbitMQ在吞吐量方面稍逊于kafka,他们的出发点不一样,rabbitMQ支持对消息的可靠的传递,支持事务,不支持批量的操作;基于存储的可靠性的要求存储可以采用内存或者硬盘。

3)在可用性方面:rabbitMQ支持mirorqueue,主queue失效,miror queue接管。kafkabroker支持主备模式。

4)在集群负载均衡方面:kafka采用zookeeper对集群中的brokerconsumer进行管理,可以注册topiczookeeper上;通过zookeeper的协调机制,producer保存对应topicbroker信息,可以随机或者轮询发送到broker上;并且producer可以基于语义指定分片,消息发送到broker的某分片上。

3.kafka与activemq的区别

共同点:都有生产者和消费者两个组件,生产者发送消息给各自的服务器(发送消息时会定义一个topic)并进行存储。

不同点:activemq:消费者会提前订阅自己需要的topic,当该topic有了消息后,activemq服务器会发送消息给消费者,然后消费者再去服务器中拿到自己想要的数据。kafka:消费者(指定topic)会定时去kafka服务器中拿该topic中的数据。

4.kafka的架构模型

5.kafka的组件介绍

    Topic :消息根据Topic进行归类

    Producer:发送消息者

    Consumer:消息接受者

    broker:每个kafka实例(server)

    Zookeeper:依赖集群保存meta信息。

Topic:一类消息,每个topic将被分成多个partition(区),在集群的配置文件中配置。

partition:在存储层面是逻辑append log文件,包含多个segment文件。

Segement:消息存储的真实文件,会不断生成新的。

offset:每条消息在文件中的位置(偏移量)。offset为一个long型数字,它是唯一标记一条消息。

  • partition 
  1. 在存储层面是逻辑append log文件,每个partition有多个segment组成。
  2. 任何发布到此partition的消息都会被直接追加到log文件的尾部。
  3. 每个partition在内存中对应一个index列表,记录每个segment中的第一条消息偏移。这样查找消息的时候,先在index列表中定位消息位置,再读取文件,速度块。
  4. 发布者发到某个topic的消息会被均匀的分布到多个partition上,broker收到发布消息往对应partition的最后一个segment上添加该消息。
  1. 每个segment中存储多条消息,消息id由其逻辑位置决定,即从消息id可直接定位到消息的存储位置,避免id到位置的额外映射。
  2. 当某个segment上的消息条数达到配置值或消息发布时间超过阈值时,segment上的消息会被flush到磁盘,只有flush到磁盘上的消息订阅者才能订阅到
  3. segment达到一定的大小(可以通过配置文件设定,默认1G)后将不会再往该segment写数据,broker会创建新的segment。 
  • offset

offset是每条消息的偏移量。

segment日志文件中保存了一系列"log entries"(日志条目),每个log entry格式为"4个字节的数字N表示消息的长度" + "N个字节的消息内容";

每个日志文件都有一个offset来唯一的标记一条消息,offset的值为8个字节的数字,表示此消息在此partition中所处的起始位置.

每个partition在物理存储层面,有多个log file组成(称为segment).

segment file的命名为"最小offset".log.例如"00000000000.log";其中"最小offset"表示此segment中起始消息的offset.

6.kafka存储文件

1.在kafka集群中,每个broker(一个kafka实例称为一个broker)中有多个topic,topic数量可以自己设定。在每个topic中又有多个partition,每个partition为一个分区。kafka的分区有自己的命名的规则,它的命名规则为topic的名称+有序序号,这个序号从0开始依次增加。
2.在每个partition中有可以分为多个segment file。当生产者往partition中存储数据时,内存中存不下了,就会往segment file里面存储。kafka默认每个segment file的大小是500M,在存储数据时,会先生成一个segment file,当这个segment file到500M之后,再生成第二个segment file 以此类推。每个segment file对应两个文件,分别是以.log结尾的数据文件和以.index结尾的索引文件。在服务器上,每个partition是一个文件夹,每个segment是一个文件。

        每个segment file也有自己的命名规则,每个名字有20个字符,不够用0填充。每个名字从0开始命名,下一个segment file文件的名字就是,上一个segment file中最后一条消息的索引值。在.index文件中,存储的是key-value格式的,key代表在.log中按顺序开始第条消息,value代表该消息的位置偏移。但是在.index中不是对每条消息都做记录,它是每隔一些消息记录一次,避免占用太多内存。即使消息不在index记录中,在已有的记录中查找,范围也大大缩小了。

7.consumer如何实现对数据的消费

消费者需要先指定消费哪个topic。在kafka中各个partition中已经存储了数据。由于之前存储是按照顺序存储的,各个segment file文件命名也时有一定规则的,这种存储规则使得查找文件会很快速。

      1,假设需要查找offest=12345的消息,通过二分查找法可以很快速的定位到该文件所在的.index和.log文件。这一步就查找到该消息所在的segment file文件。

      2,在该segment file文件中查找该消息。通过.index索引文件,快速的查找到该消息在.log中的位置,查找文件就完成了。

8. producer如何发送数据

producer需要指定数据到哪个topic,并且指定的分区,系统会自动均匀分配到各个broker里,而不会都存在一个或某几个broker里。那消息该发送到哪个broker上呢,一般有两种情况(可以自定义class去设置分区,在producer的实例,配置文件时,partitioner.class这个配置项指定对应的自己创建的分区类即可)


    Properties props = new Properties();
    props.put("metadata.broker.list", BROKER_LIST);
    props.put("serializer.class", StringEncoder.class.getName());
    props.put("partitioner.class", HashPartitioner.class.getName());

1、根据消息的key模与分区数,去指定该消息该去哪个分区

2、根据消息的发送顺序,去指定该消息该去哪个分区。例如第一条数据去topic-0,第二条数据去topic-1,以此类推

producer自身还分为两种:

1)同步producer:消息发送过去之后,只有成功之后才会发送下一条消息。不成功的话,会retry,3次不成功会catch异常,出现异常时,可以忽略,也可以手动操作,或者把这条数据存储到另一个存储里,下次再处理。

2)异步producer:不是马上就发,会先存储在query,达到要求后,再把query发送个broker。如果query满了,刚要发送时,此时出现阻塞来不及发送,此时如果有新的数据进来,会选择把新的数据丢掉(这个是可以设置的,也可以设置为等待)。

9.过期日志的处理方式

 kafka作为一个消息中间件,是需要定期处理数据的,否则磁盘就爆了。

1、处理的机制

      1)根据数据的时间长短进行清理,例如数据在磁盘中超过多久会被清理(默认是168个小时) 

       2)根据文件大小的方式给进行清理,例如数据大小超过多大时,删除数据(大小是按照每个partition的大小来界定的)。

2、删除过期的日志的方式

直接删除segment文件。后台会周期性的扫描,当满足设定的条件的数据就执行删除。如果设置是按照大小的方式,删除segment是按照segment存在顺序进行删除,即先删除存在最久的那个segment。
 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值