Kafka学习笔记--基础

参考:深入理解Kafka核心设计和实践原理
1、消息队列

消息队列有两种模式:点对点(P2P)模式和发布订阅(Pub/Sub)模式。点对点模式是基于队列的,消息的产生者发送消息到队列,消息的消费者才能够这个队列中接收消息。发布订阅模式定义了如何向一个内容节点发布和订阅消息,这个内容的节点就是topic。topic可以看做是一个消息传递的中介,生产者将消息发送到这个topic,消息的消费者从这个topic订阅消息,而topic使得消息的消费者和生产者之间相互解耦。

2、消息队列的作用

1、解耦:允许独立的扩展和修改两边的处理过程;
2、可扩展性:因为消息队列解耦的处理过程的作用,可以增大消息入队和处理的频率;
3、峰值处理能力:使用消息队列可以使得关键组件顶住突发的访问量,不会因为突发的超负荷访问量而导致宕机;
4、可恢复性:其中的一个处理进行挂掉,新加入队列的消息仍然可以在系统恢复后被消费;
5、顺序性:kafka可以保证一个partition内的消息是顺序被消费的;
6、缓冲:有助于控制和优化数据流经过系统的速度,解决生产者和消费者的处理速度的不同;
7、异步通信:允许将消息放入队列,不立即进行处理,只有在需要的时候进行消费即可。

3、kafka是什么?

kafka是一个分布式消息队列。kafka对消息保存时是根据topic进行归类,发送消息端为生产者(producer),消息接收端为消费者(consumer)。一般地,kafka集群是由多个kafka实例构成的,每个实例称为broker,可以理解为每个broker就是一个kafka集群的节点。

4、Kaka集群架构

在这里插入图片描述
Kafka详细架构:
在这里插入图片描述
名词解释:
1、producer:消息的生产者,用于向kafka 的broker发送消息。
2、consumer:消息的消费者,向kafka的broker拉取消息。
3、topic:理解为一个队列的名称。
4、consumer group: 消费者组。实现一个topic消息的广播和单播的方法。
广播:发送给所有的consumer
单播:发送给任意一个consumer
一个topic可以有多个消费者组,topic的消息会复制到所有的消费者组,但是每个partition只会把消息发送给该消费组的一个consumer。对于一个topic而言,一个消费者组只能有一个消费者消息这个topic,但是可以有多个不同的消费者组消费这个topic。
5、broker:一个kafka的服务器就是一个broker,即一个节点。一个broker可以有多个topic。
6、partition:一个topic可以分为多个partition,每个partition是一个有序的队列。partition中的每条消息都会被分配到一个有序的id。kafka值保证按一个partition中的顺序将消息发送飞consumer,不保证一个topic的整体的顺序。
7、offset:kafka存储文件时按照offset.kafka命名的。

5、kafka工作流分析
5.1 kafka生产过程分析:

写入方式:producer采用push模式将消息发布到broker中,每条数据都被append到partition中,属于顺序写入磁盘。
每个partition中的消息都是有序的,生产的消息被不断的append到partition的log上,其中的每一条消息都有一个唯一的offset值。
副本:replication。同一个partition可能会有多个replication。因为在没有replication的情况下,一旦broker宕机,broker上面的partition的数据都不能被消费了,且producer也不能将数据发送到partition上。同一个partition会有多个replication,在众多的replication中或选举出一个leader,producer和consumer只和这个leader进行交互,其他的replication将作为follower从这个leader上进行数据的同步。
注意:为了高可用,不能将同一个topic的相同partition放在一个broker上,因为一个这个broker挂了,那么这个partition上的数据将丢失。放在不同的broker上,即使一个broker挂了,数据仍然留有N个备份在不同的broker上,不会影响正在进行的业务处理。

5.2 kafka的数据写入:

在这里插入图片描述
1、producer现象总ZooKeeper的“/broker/…/state”节点中找到该partition的leader
2、producer将消息发送给该leader
3、leader将消息写入本地log中
4、follower从leader中pull消息,写入本地log后向leader发送ack
5、leader收到所有的ISR中的replication的ack后,增加高水位,并向producer发送ack。
名词:HW,高水位,highwatermask,标识一个特定消息的

6、消息在写入过程中数据的丢失问题

产生数据丢失的情况:一条数据刚写入leader得到partition后,还未及时同步到follower中,此时leader所在的broker宕机。由于具有高可用,就会在此partition中的follower中选举出一个新的leader对外提供服务,因此刚才丢失的数据就不能被写入了,就产生了数据丢失的问题。

kafka得到ISR机制:给每个partition维护一个ISR列表,与此leader保持数据同步的follower存在于此ISR列表中,一旦有个follower不能及时的与leader进行数据同步,则此follower被移出ISR列表中。

解决数据丢失的办法:
1、保证每个partition都至少有一个follower在此ISR列表中,保持与leader的数据同步;
2、每条数据的写入,必须保证至少leader和一个follower同步到该条数据;
3、如果不能同时满足上述两个条件,则producer一直重复写入,直到满足上述的条件。

7、kafka数据写入的设计

kafka是基于OS的页缓存技术实现文件高速写入的。页缓存实际是操作系统本身自带的一层缓存,存在于内存中的。kafka在数据写入文件的时候,首先将数据顺序append到OS cache中,由于是顺序写入,且只能是追加,同时是写入内存的,因此效率很高。将OS cache中的数据刷入到文件中是由OS自己决定的。
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值