初识原理系列之Kafka

做个初识原理系列

就当做复习和巩固之前的知识吧

基本框架


对应概念

1.producer

  消息生产者,发布消息到 kafka 集群的终端或服务。

2.broker

  kafka 集群中包含的服务器。

3.topic

  每条发布到 kafka 集群的消息属于的类别,即 kafka 是面向 topic 的。

4.partition

  partition 是物理上的概念,每个 topic 包含一个或多个 partitionkafka 分配的单位是 partition

5.consumer

  从 kafka 集群中消费消息的终端或服务。

6.Consumer group

  high-level consumer API 中,每个 consumer 都属于一个 consumer group,每条消息只能被 consumer group 中的一个 Consumer 消费,但可以被多个 consumer group 消费。

7.replica

  partition 的副本,保障 partition 的高可用。

8.leader

  replica 中的一个角色, producer consumer 只跟 leader 交互。

9.follower

  replica 中的一个角色,从 leader 中复制数据。

10.controller

  kafka 集群中的其中一个服务器,用来进行 leader election 以及 各种 failover

12.zookeeper

  kafka 通过 zookeeper 来存储集群的 meta 信息。


框架的流程解释

1.图中Brokers部分,有4个框,每个框代表一个broker,而在众多的broker中会有一个leader,称之为controller,也就是图中的第二个框。那么controller有什么用呢,它负责管理整个集群中分区和副本的状态,比如partitionleader 副本故障,由controller 负责为该partition重新选举新的leader 副本;当检测到ISR列表发生变化,有controller通知集群中所有broker更新其MetadataCache信息;或者增加某个topic分区的时候也会由controller管理分区的重新分配工作。

2.再具体看到每一个框中的内容,即一个brokerbroker中会放置多个partition分区,这些分区属于的topic的都是不一样的。一个topic会有一个或多个分区,每个分区为了保证数据的高可用性,会建立多个副本,这时候多个副本就会放在不同的broker中。例如图中123个框中,都存在了Topic1-part1这个分区。然而消息如何写入分区呢,总不能每个副本都写一次吧,这样会很慢,因此在几个副本中会选出一个leader,写消息只会写入leader所在的分区,其他的称为followerfollower为了起到副本的作用,会把leader的数据copy过来。所以上图基本能看明白了。

leader选举机制

        如果某个分区所在的服务器除了问题,不可用,kafka会从该分区的其他的副本中选择一个作为新的Leader。之后所有的读写就会转移到这个新的Leader上。现在的问题是应当选择哪个作为新的Leader。显然,只有那些跟Leader保持同步的Follower才应该被选作新的Leader

        Kafka会在Zookeeper上针对每个Topic维护一个称为ISRin-sync replica,已同步的副本)的集合,该集合中是一些分区的副本。只有当这些副本都跟Leader中的副本同步了之后,kafka才会认为消息已提交,并反馈给消息的生产者。如果这个集合有增减,kafka会更新zookeeper上的记录。

      如果某个分区的Leader不可用,Kafka就会从ISR集合中选择一个副本作为新的Leader

      显然通过ISRkafka需要的冗余度较低,可以容忍的失败数比较高。假设某个topicf+1个副本,kafka可以容忍f个服务器不可用。


Propagate 消息

        Producer在发布消息到某个Partition时,先通过ZooKeeper找到该PartitionLeader,然后无论该TopicReplication Factor为多少(也即该Partition有多少个Replica),Producer只将该消息发送到该PartitionLeaderLeader会将该消息写入其本地Log。每个Follower都从Leader pull数据。这种方式上,Follower存储的数据顺序与Leader保持一致。Follower在收到该消息并写入其Log后,向Leader发送ACK。一旦Leader收到了ISR中的所有ReplicaACK,该消息就被认为已经commit了,Leader将增加HW并且向Producer发送ACK

      为了提高性能,每个Follower在接收到数据后就立马向Leader发送ACK,而非等到数据写入Log中。因此,对于已经commit的消息,Kafka只能保证它被存于多个Replica的内存中,而不能保证它们被持久化到磁盘中,也就不能完全保证异常发生后该条消息一定能被Consumer消费。但考虑到这种场景非常少见,可以认为这种方式在性能和数据持久化上做了一个比较好的平衡。


复制机制

        Kafka的复制机制既不是完全的同步复制,也不是单纯的异步复制。事实上,完全同步复制要求所有能工作的Follower都复制完,这条消息才会被认为commit,这种复制方式极大的影响了吞吐率(高吞吐率是Kafka非常重要的一个特性)。而异步复制方式下,Follower异步的从Leader复制数据,数据只要被Leader写入log就被认为已经commit,这种情况下如果Follower都复制完都落后于Leader,而如果Leader突然宕机,则会丢失数据。而Kafka的这种使用ISR的方式则很好的均衡了确保数据不丢失以及吞吐率。Follower可以批量的从Leader复制数据,这样极大的提高复制性能(批量写磁盘),极大减少了FollowerLeader的差距。



topic存储

partition
        topic物理上的分组,一个topic可以分为多个partition,每个partition是一个有序的队列。
      在Kafka文件存储中,同一个topic下有多个不同partition,每个partition为一个目录,partiton命名规则为topic名称+有序序号,第一个partiton序号从0开始,序号最大值为partitions数量减
        每个partiton只需要支持顺序读写就行了,segment文件生命周期由服务端配置参数决定。
        这样做的好处就是能快速删除无用文件,有效提高磁盘利用率。
      每个partion(目录)相当于一个巨型文件被平均分配到多个大小相等segment(段)数据文件中。但每个段segment file消息数量不一定相等,这种特性方便old segment file快速被删除。

segment file
组成:
      由2大部分组成,分别为index filedata file,此2个文件一一对应,成对出现,后缀”.index”和“.log”分别表示为segment索引文件、数据文件.
文件命名规则:
        partion全局的第一个segment0开始,后续每个segment文件名为上一个segment文件最后一条消息的offset值。数值最大为64long大小,19位数字字符长度,没有数字用0填充
      其中.index索引文件存储大量元数据,.log数据文件存储大量消息,索引文件中元数据指向对应数据文件中message的物理偏移地址。他们两个是一一对应的,对应关系如下


message

        segment data file由许多message组成,message物理结构如下 




关于zookeeper

        zookeeper是用来协调kafka的,具体怎么协调,了解了zookeeper的运行机制就知道了




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值