kafka (五)

消息:

最基本的数据单元,主要由key value 组成的,一串字节,

key: byte[],根据一定的策略将消息路由到指定分区中,保证同一个key消息全部写入同一分区中

key 可以是null

value: byte[]

Topic 与 分区 与 Log 与 Segment

(1) Topic:

(逻辑概念,同一个Topic不同的分区,分配到不同的broker主机上)

用于存储消息的逻辑概念,可以看做消息集合,每个Topic 可以有多个produce consumer

Topic 可以划分成多个分区(每个Topic必须至少有一个分区)

同一Topic 下不同的分区包含的消息是不同的

每个消息添加到分区时都会分配一个offset序号,它是消息在这个分区中的唯一编号

Kafka通过offset 保证消息的顺序性(不夸分区)

同一Topic多个分区内,kafka不保证消息的顺序性

(2) 分区

分区时kafka水平扩展的基础,可以通过增加服务器,并在其上分配Partition的方式来增加

Kafka的并行处理能力

分区在逻辑上对应着一个Log,当Producer写入分区时,实际上是写入到了分区对应的Log中

同一Topic 的不同分区会分配在不同的Broker上

(3) Log

Log是一个逻辑概念,可对应到磁盘上的一个文件夹,(分区逻辑上对应着一个Log)

Log 由多个Segment组成

(4) Segment

每个Segment对应一个日志文件与索引文件

为避免出现超大文件,每个文件的大小是有限制的,超过限制创建新的Segment

索引文件采用稀疏索引的方式,在运行时将内容映射到内存 ,提高索引数据

由于kafka采用顺序IO索引只向最新的Segment添加数据

(5) Broker

一个单独的kafka Server就是一个Broker,

broker主要工作是接受producer发送过来的消息,分配offset,之后保存到磁盘中

接受consumer或其它broker的请求,根据请求类型进行处理并返回响应

(6) 副本

每个Partition可以有多个副本,每个副本中包含的消息都是一致的(同一时刻,可能存在)

差异。

每个分区至少有一个副本

当分区中只有一个副本时就是Leader副本,没有foller副本

        

partition 存储相同topic下的不同数据内容

ISR集合 (In-Sync Replica)

ISR集合表示可用的消息量(alive),与Leader 所在副本相差不多的副本集合,

是整个Replica 副本集合的一个子集

可用的概念:

      (1) 副本所在节点必须维持与zk的连接

        (2) 副本replica 最后一条消息的offset 与 leader副本最后一条消息的offset之间差值不能超出指定阈值

        (3) ISR 集合的维护

不能超出指定阈值,不能断开与zk连接,发生宕机或GC卡死 时 replic副本被踢出ISR集合

HW & LEO

(1) HW (highWaterMark)

HW 也是由Leader 副本管理

HW 标记了一个特殊的offset ,当消费者处理消息时,只能拉取到HW之前的消息,之后的不可见

当ISR集合中所有副本都拉取到HW 标记的消息时 HW递增(消息的commit)

(2) LEO (Log End Offset)

是所有副本中都会有的一个offset标记,它指向追加到当前副本的最后一个消息的offset,

当生产者向Leader增加消息时,leader副本的LEO标记会递增,当follower副本拉取到消息时

follower副本的offset会递增

ISR集合就是为了解决同步复制与异步复制存在的缺陷

(HW 标记实时的offset,LEO 标记存量的 offset)

Cluster & Controller

        多个Broker 可以做成一个Cluster(集群) 对外提供服务,每个Cluster当中会选举出来一个Broker来担当Controller,(跟partition的leader差不多的概念)

        Controller 是从Kafka集群中选取一个的broker,负责管理topic分区和副本的状态的变化,以及执行重分配分区之类的管理任务。(以前提到的leader)

Controller 是kafka集群的指挥中心,其它Broker则听从Controller指挥实现相应的功能

Controller 负责管理分区的状态、管理每个分区的副本状态、监听Zookeeper中数据的变化等

Controller 也是一主多从的实现,所有的Broker都会监听 Controller leader的状态

当Leader Controller 出现故障时则重新选举新的Controller Leader

生产者

producer 主要作用是将消息推送(commit)到分区中

选择分区有多重方案:

        key的hash

        轮训

        加权

        (添加虚拟节点,灰度)

消费者

消费者(Consumer) 主要工作是从Topic中拉取消息,并对消息进行消费。

某个消费者消费到Partition的那个位置(Offset)的相关信息,是Consumer自己

维护的,避免了server维护Consumer消费位置的开销

consumer Group

        (1) 一个Consumer只能属于一个Consumer Group.

        (2)Consumer Group 保证其定阅的Topic的每个分区只被分配给此Consumer Group中的一个消费者处理处理。

        (3) 如果不同的Consumer Group订阅了同一个Topic 彼此之间不会干扰。

                这样实现了,一个消息可以被多个消费者同时消费的(广播)效果。

                在一个consomer group中 topic 分区是一一与consmer对应的

                如果要实现消息独占的效果,则需要把所有的consmer都纳入到同一个group组中

图例:展示 consumer group consumer 与分区的对应关系,与实现的模式效果

(1) Consumer1 Consumer2 分别对应Partition0 与 Partition1 (独占模式,只有一个group)

Partition2 与 Partition3 同时分配给了Consumer3

(partition 在同一group只能对应一个consumer ,同一group中consumer可以对应多个

partition)

(独占模式,只有一个group)

(3) Consumer4 宕机时,自动重新分配分区

(4) Consumer与分区的对应关系,不是partition越多越好,

当consumer 数量大于partition时,部分consumer分配不到分区

kafka 集群架构

逻辑描述:

        produce 发送消息后,根据路由规则将消息发送到指定分区的Leader副本所在的Broker上

在kafka服务端接受到消息后,会将消息追加到Log中保存,之后Follower副本会与Leader副本

进行同步,当ISR集合中所有副本都完成了此消息的同步后,则Leader副本的HW会增加,并

向生产者返回响应。

保留策略 与 日志压缩

(1)保留策略

        指定保留时间

        设置文件大小阈值(定期检查是否可删除)

(2) 日志压缩

        value的值不断变化,key只关心最新的value,kafka后台启一个线程定期将相同key的

        消息进行合并,只保留最新的Value值

  • 7
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值