kafka原理解析之-整体架构

kafka整体架构

先上一个整体架构图,如下图。
在这里插入图片描述
图一:集群整体架构,P代表partition的leader, r代表partition的follower

对各个组件说明如下:

  • Broker: Kafka服务器节点就是被称为Broker,Broker主要负责创建并存储Topic,存储Producer所发布的消息,记录消息处理的过程,现是将消息保存到内存中,然后持久化到磁盘。

  • Topic: 就是数据主题,是数据记录发布的地方,可以用来区分业务系统,同一个Topic的消息可以分布在一个或多个Broker上,一个Topic包含一个或者多个Partition分区,数据被存储在多个Partition中。

  • Partition: 一个Topic在Broker中被分为1个或者多个Partition。分区才是真正存储数据的单元。每个partition中的数据使用多个segment文件存储。partition中的数据是有序的,不同partition间的数据丢失了数据的顺序。在需要严格保证消息的消费顺序的场景下,需要将partition数目设为1。
    如果某topic有N个partition,集群有N个broker,那么每个broker存储该topic的一个partition。
    如果某topic有N个partition,集群有(N+M)个broker,那么其中有N个broker存储该topic的一个partition,剩下的M个broker不存储该topic的partition数据。
    如果某topic有N个partition,集群中broker数目少于N个,那么一个broker存储该topic的一个或多个partition。在实际生产环境中,尽量避免这种情况的发生,这种情况容易导致Kafka集群数据不均衡。
    每个partition有多个副本(replication-factor设置):

  • Leader 每个partition多个副本中有且仅有一个作为Leader,Leader是当前负责数据的读写的partition。

  • Follower leader的备份,follwers只需被动的同步leader上的数据。当leader宕机了,followers中的一台服务器会自动成为新的 leader。每台 server 都会成为某些分区的 leader 和某些分区的 follower,因此集群的负载是平衡的。

  • Producer: 消息和数据的生产者,主要负责生产Push消息到指定Broker的Topic中。生产者负责将记录分配到topic的哪一个
    partition(分区)中。可以使用循环的方式来简单地实现负载均衡,也可以根据某些语义分区函数(例如:记录中的key)来完成。

  • Consumer: 消息和数据的消费者,主要负责主动到已订阅的Topic中拉取消息并消费 消费者使用一个 消费组 (Consumer
    Group)名称来进行标识,发布到topic中的每条记录被分配给订阅消费组中的一个消费者实例.消费者实例可以分布在多个进程中或者多个机器上,如下图所示:

    在这里插入图片描述
    图二:消费者用消费组标识

    如果所有的消费者实例在同一消费组中,消息记录会负载平衡到每一个消费者实例.
    如果所有的消费者实例在不同的消费组中,每条消息记录会广播到所有的消费者进程.

  • Offset: 分区中的每一个记录都会分配一个id号来表示顺序,我们称之为offset,offset用来唯一的标识分区中每一条记录。在每一个消费者中唯一保存的元数据是offset(偏移量)即消费在log中的位置.偏移量由消费者所控制:通常在读取记录后,消费者会以线性的方式增加偏移量,但是实际上,由于这个位置由消费者控制,所以消费者可以采用任何顺序来消费记录。例如,一个消费者可以重置到一个旧的偏移量,从而重新处理过去的数据;也可以跳过最近的记录,从"现在"开始消费。

    在这里插入图片描述
    图三:offset在partition示意图

  • ZooKeeper: ZooKeeper负责维护整个Kafka集群的状态,存储Kafka各个节点 的信息及状态,实现Kafka集群的高可用,协调Kafka的工作内容。

    Broker和Consumer有使用到ZooKeeper,而Producer并没有使用到ZooKeeper,因为Kafka从0.8版本开始, Producer并不需要根据ZooKeeper来获取集群状态,而是在配置中指定多个Broker节点进行发送消息,同时跟指定 的Broker建立连接,来从该Broker中获取集群的状态信息,这是Producer可以知道集群中有多少个Broker是否在 存活状态,每个Broker上的Topic有多少个Partition,Prodocuer会将这些元信息存储到Producuer的内存中。如果Producoer像集群中的一台Broker节点发送信息超时等故障,Producer会主动刷新该内存中的元信息,以获取当 前Broker集群中的最新状态,转而把信息发送给当前可用的Broker,当然Prodocuer也可以在配置中指定周期性的去刷新Broker的元信息以更新到内存中。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值