kafka快速入门
2021-09-09 16:58:42 小德 kafka 访问次数 97


一、简介

    kafka是分布式的发布--订阅消息系统,分布式流处理平台,作为一个集群,运行在一台或者多态服务器上。每条记录包含一个key,一个value和一个timestamp.支持批量读写,并会对消息进行批量压缩,支持分区(在线分区,在线水平扩展),保证分区内的消息的顺序传输,而分区之间可以并发操作,支持多个副本等关键特性。

image.png

二、持久化

    分布式系统中,各个组件通过网络连接起来的,网络传输不可靠,避免数据丢失,将数据持久化到磁盘。避免数据增长过快,kafka提供日志清理,日志压缩,对过时,已处理完成的数据进行清除。kafka磁盘操作顺序读写,性能非常高。

    一次磁盘IO,需经过寻道,旋转,数据传输,顺序写,减少了磁盘寻道和旋转次数,磁头不再磁道上乱舞了,而是一路向前飞速前行。kafka的每个分区是有序的,新消息不断追加到Partition的末尾,Partition是逻辑概念,划分为多个segment,每个segment对应一个物理文件,kafka对segment追加,就是顺序写。Kafka是一个quque,FIFO。对比Redis  hashMap 无序的 随机读写。

三、扩展与容灾

    kafka的每个Topic有多个partition,每个分区有多个副本,实现消息的冗余,每个分区数据不同,类似数据库水平分区。同一分区的不同副本 保存的是相同的消息,副本之间一主多从关系,leader副本负责处理读写请求,Follower副本与leader副本进行消息同步,leader GG 选举Follower副本作为Leader.

    消费端多个consumer加入到一个ConsumerGroup 中,在消费组中,每个分区只分配给一个consumer,当一个comsumer下线时通过Rebance操作将下线的consumer的任务分配给其他connsumer处理,当新增一个consumer时也会Rebance. 一个Consumer Group 可以订阅不同的Topic ,每个consumer 可以处理多个分区。

    Consumer Group中的消费者数量一般不多于分区的数量。

四、核心概念

    Topic 用于存储消息的逻辑概念,看做消息集合,可以有多个Topic可以有多个生产者向其中push消息,也可以有多个消费者消费消息,每个topic至少有一个分区,可以有 多个分区,每个消息被添加到一个分区时,会分配一个offset作为分区内的唯一编号,保证顺序性,同一个Topic 不同的分区会分配在不同的borker.

    保留策略:一种是根据消息时间保留,一种是根据topic存储的数据的大小。kafka启动一个后台线程定期检查是否可以删除消息。日志压缩:kafka启动一个后台线程,定期将相同的key的消息进行合并,保留最新的value值

    broker 一个单独的broker就是一个Kafka server,接受生产者发过来的消息,分配offset,之后保存磁盘,一个一个broker独占你一个物理服务器

    ISR  可用的副本集合:满足条件  1 、副本所有节点与Zookeeper保持连接;副本最后一个消息的offset与Leader副本的最后消息offset差不能超过阈值。Follower副本延迟过高,会被踢出去,Leader宕机会重新选举Leader.

    Cluster,多个broker组成一个Cluster集群对外提供服务。每个Cluster会有一个Broker担任Controller,是集群的指挥中心,负责管理分区的状态,分区的副本状态,监听zookeeper的数据变化,一主多从的状态,所有broker都会监听Controller Leader的状态。

     

 image.png

    五、总结性能

        1、零拷贝网络和磁盘

        2、网络模型

        3、优秀的数据结构 二分查找offset

        4、partition并行扩展

        5、数据批量传输

        6、数据压缩

        7、顺序读写磁盘

        8、无锁轻量级offset

   六、如何保证不丢消息

        1、生产端:做好try  catch 无论同步或异步 Broker 返回失败 重试 多次失败 报警 保证生产端不丢消息

        2、储存消息:消息刷盘后再给生产者响应  集群 多副本 配置至少两台机器写入成功算成功

        3、消费消息: 消费者执行完业务逻辑后再给broker发送消费成功

   七、消息堆积:Topic的队列数和消费者数量