• Kafka学习


    一、消息队列作用:解耦、削峰、缓冲(生产速度和消费速度不一致)

    二、消息队列的两种模式:点对点模式(一对一)、发布订阅模式(一对多 1. 消费者主动拉取消息 2. 队列主动推消息)

    三、基础架构:

      A、生产者

      B、kafka

        Broker kafka的一个进程(集群的一个节点)--------------->>>Topic 主题,将数据分类   -------------------------->>>Partion 分区,负载均衡,提高了topic的负载能力-------------------->>>leader,负责业务-------------------------->>>follower,分区的副本,不能提供业务,只是备份

      C、消费者

        消费者组:

          1. 注意:同一个分区只能被同一个消费者组里的一个消费者消费,所有消费者里的消费者数量不能大于订阅主题的分区数量。

          2. 消费者组提高了消费能力

      D、zookeeper

        管理kafka集群的,记录消息消费位置(0.9版本之前是,0.9版本之后就存在本地了)

    四、安装kafaka

      A、下载并解压到置顶位置

    五、修改配置文件

      A、server.properties kafka服务端配置

        1. broker.id=0 broker的id,必须是唯一的整数

        2. delete.topic.enable=true 是否可以删除主题,默认是false

        3. log.dirs=/opt/soft/kafka_2.12-2.3.1/data kafka暂存数据目录

        4. log.retention.hours=168 数据保留时间(小时)

        5. zookeeper.connect=localhost:2181 zookeeper的连接地址

      B、常用命令

        1. kafka-server-start.sh 启动

        2. kafka-server-stop.sh 关闭命令

        3. kafka-console-consumer.sh 消费者端

        4. kafka-console.producer.sh 生产者端

        5. kafka-topics.sh 主题

    六、主题的增删改查

      1. kafka-topics.sh --list --zookeeper zookeeper节点ip:2181 (查看topic列表)

      2. kafka-topics.sh --create --zookeeper zookeeper节点ip:2181 --topic 主题名字 --partitions 分区数 --replication-factor 副本数  (创建主题)

      3. kafka-topics.sh --delete --zookeeper zookeeper节点ip:2181 --topic 主题名字 (删除主题)

      4. kafka-topics.sh --describe --zookeeper zookeeper节点ip:2181 --topic 主题名字 (主题详情)

    七、生产者端

      1. 启动生产者端:kafka-console-producer.sh --topic 主题名 --broker-list kafka集群节点ip:9092 

    八、消费者端

      1. 开启消费者端:kafka-console-consumer.sh --topic 主题名 --bootstrap-server kafka集群节点ip:9092 [--from-beginning]是否从头开始消费

    九、kafka架构深入

      1. topic是逻辑上的概念,partition是物理上的概念,每个partition对应一个log文件

      2. 数据可靠性保证

        消息发送给partition的leader,所有的follower都同步之后会发送ack

        ISR: leader维护了一个动态的in-sync replica set(ISR),意为和leader保持同步的follower集合。当ISR中的follower完成数据同步之后,leader就会给follower发送ack。如果follower长时间没有向leader同步数据,则该follower将被踢出ISR,该时间阈值由replica.time.max.ms参数设置。Leader发生故障之后,就会从ISR中选举新的leader。

      3. acks配置

        0: producer不等待broker的ack,这一操作提供了一个最低的延迟,broker一接收到还没有写入磁盘就已经返回,当broker故障时可能丢失数据。

        1: producer等待broker的ack,partition的leader落盘成功后返回ack,如果在follower同步成功前leader故障,可能丢失数据。

        -1(all): producer等待broker的ack,partition的leader和ISR中的follower全部落盘成功后才返回ack。但是如果在follower同步完成之后,broker发送ack之前,leader发生故障,那么会造成重复数据。

      4. 故障处理细节

        a. follower故障

          follower发生故障后会被临时踢出ISR,待该follower恢复后,follower会读取本地磁盘记录的上次的HW,并将log文件高于HW的部分截取掉,从HW开始向leader进行同步。等待该follower的LEO大于等于该partition的HW时,就可以重新加入ISR了。

        b. leader故障

          leader故障后从ISR中重新选取一个新的leader,之后为了保证多个副本之间的数据一致性,其余的follower会将各自的log文件高于HW的部分截取掉,然后从新的leader同步数据。

      5. exactly-once 精准一次性消费

        a. AtLeast Once + 幂等性 = Exactly Once

          要启用幂等性,只需要将Producer的参数中enable.idompotence设置为true即可。开启幂等性的producer在初始化的时候会被分配一个pid,发往同一partition的消息会附带sequence number。而broker端会对< pid, partition, sequence number>做缓存,当具有相同主键的消息提交时,broker只会持久化一条。

          注意:但是pid重启就会发生变化,同时不同的partition也具有不同的主键,所以幂等性无法保证跨分区跨会话的Exactly Once。

      6. 分区分配策略

        a. 两种分配策略(RoundRobin和Range)

          1) RoundRobin:轮询

            多个主题当做一个整体, 所以前提要多个消费者订阅的主题相同

          2) Range(默认)

            以单个主题来分

        b. 当消费者组数量变化的时候会重新分配

      7. offset是根据消费者组,分区,主题来确定的

      8. 高效读写数据

        a. 顺序写磁盘

          开辟了一个完整的区间,省去了大量磁头寻址的时间

        b. 零拷贝技术

          传统: 代码->操作系统->文件->操作系统->代码->操作系统->另一个文件

          零拷贝:代码->操作系统->文件->操作系统->另一个文件

      9. zookeeper在kafka当中的作用

        kafka集群中有一个broker会被选举为controller,负责管理集群broker的上下线、所有topic的分区副本分配和leader选举等工作。controller管理工作都是依赖zookeeper进行的。

      10. kafka事务

        事务可以跨会话,跨分区做到精准一次性。

        a. 生产者事务

          为了实现跨分区跨会话 的事务,需要引入一个全局唯一的TransactionID,并将Producer的Pid和transactionID进行绑定。这样当producer重启后就可以通过transactionID获取原来的pid。

          为了管理transactionID,kafka引入了一个新的组件transaction coordinator。 producer就是通过和transaction coordinator交互获取transactionID对应的任务状态。transaction coordinator还负责将所有事务写入kafka的一个内部topic,这样即使整个服务重启,由于事务状态得到保存,进行中的事务状态可以得到恢复,从而继续进行。

        b. 消费者事务

          对于consumer而言,事务的保证相对较弱,尤其无法保证commit的信息被精确消费。这是由于consumer可以通过offset访问任意信息,而且不同的segment file生命周期不同,同一事务的消息可能出现重启后被删除的情况。

      11. 消息发送流程

        main线程--->send方法(interceptors(拦截器)->serializer(序列化器)->partitioner(分区器))--->RecordAccumulator(记录累加器:待发送数据)--->send线程---->topic

  • 相关阅读:
    sublime text 配置本地静态服务器方法
    js中获得当前时间是年份和月份
    如何在Intellij IDEA中拉svn分支?
    快速上手seajs模块化以及案例
    webpack 配置多页面应用的一次尝试
    【Gitlab】gitlab-CI 持续集成以及runner的配置简版
    【vue】elementUI报错:_self.$scopedSlots.default is not a function
    【webpack】webpack多版本控制方案
    vuepress博客主题—vuepress-theme-reco
    reco-fetch
  • 原文地址:https://www.cnblogs.com/DjanFey/p/11822251.html
Copyright © 2020-2023  润新知