• KAFKA总结


    1. kafka是什么,主要应用在哪里

    Kafka 是⼀个分布式流式处理平台。这到底是什么意思呢?

    • 流平台具有三个关键功能:
      1. 消息队列:发布和订阅消息流,这个功能类似于消息队列,这也是 Kafka 也被归类为消息队列的原因。
      2. 容错的持久⽅式存储记录消息流: Kafka 会把消息持久化到磁盘,有效避免了消息丢失的⻛险。
      3. 流式处理平台: 在消息发布的时候进⾏处理, Kafka 提供了⼀个完整的流式处理类库。
    • Kafka 主要有两⼤应⽤场景:
      1. 消息队列 :建⽴实时流数据管道,以可靠地在系统或应⽤程序之间获取数据。
      2. 数据处理: 构建实时的流数据处理程序来转换或处理数据流。

    2. kafka的优势

    • 极致的性能与生态系统的兼容性
    • 高吞吐量、低延迟:kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒,每个topic可以分多个partition, consumer group 对partition进行consume操作。
    • 可扩展性:kafka集群支持热扩展
    • 持久性、可靠性:消息被持久化到本地磁盘,并且支持数据备份防止数据丢失
    • 容错性:允许集群中节点失败(若副本数量为n,则允许n-1个节点失败)
    • 高并发:支持数千个客户端同时读写

    3. 队列模型,kafka的消息模型

    • 队列模型
      使⽤队列(Queue)作为消息通信载体,满⾜⽣产者与消费者模式,⼀条消息只能被⼀个消费者使⽤(消息最有一次性,消费了就没有了),未被消费的消息在队列中保留直到被消费或超时。无法做到不同的客户端重复消费。

    • kafka:发布-订阅模型
      使⽤主题(Topic) 作为消息通信载体,类似于⼴播模式;发布者发布⼀条消息,该消息通过主题传递给所有的订阅者, 在⼀条消息⼴播之后才订阅的⽤户则是收不到该条消息的。若只有一个消费者,则和队列模型类似。

    4.kafka的设计架构

    4.1 简单架构如下

    4.2 Kafka 架构分为以下几个部分

    • Producer:消息生产者,就是向 kafka broker 发消息的客户端。
    • Consumer:消息消费者,向 kafka broker 取消息的客户端。
    • Topic:可以理解为一个队列,一个 Topic 又分为一个或多个分区。
    • Consumer Group:这是 kafka 用来实现一个 topic 消息的广播(发给所有的 consumer)和单播(发给任意一个 consumer)的手段。一个 topic 可以有多个 Consumer Group。
    • Broker:一台 kafka 服务器就是一个 broker。一个集群由多个 broker 组成。一个 broker 可以容纳多个 topic。
    • Partition:为了实现扩展性,一个非常大的 topic 可以分布到多个 broker上,每个 partition 是一个有序的队列。partition 中的每条消息都会被分配一个有序的id(offset)。将消息发给 consumer,kafka 只保证按一个 partition 中的消息的顺序,不保证一个 topic 的整体(多个 partition 间)的顺序。
    • Offset:kafka 的存储文件都是按照 offset.kafka 来命名,用 offset 做名字的好处是方便查找。例如你想找位于 2049 的位置,只要找到 2048.kafka 的文件即可。

    备注:

    1. Topic 是逻辑上的概念,而 Partition 是物理上的概念,每个 Partition 对应于一个 log 文件,该 log 文件中存储的就是 Producer 生产的数据
    2. Producer 生产的数据会不断追加到该 log 文件末端,且每条数据都有自己的 Offset
    3. 消费者组中的每个消费者,都会实时记录自己消费到了哪个 Offset,以便出错恢复时,从上次的位置继续消费

    5.kafka的分区

    • 分区原因
      方便在集群中扩展,每个 Partition 可以通过调整以适应它所在的机器,而一个 Topic 又可以有多个 Partition 组成,因此可以以 Partition 为单位读写了。
      可以提高并发,因此可以以 Partition 为单位读写了。

    • 分区的原则
      我们需要将 Producer 发送的数据封装成一个 ProducerRecord 对象。

    • 分区可以减少吗
      我们可以使用 bin/kafka-topics.sh 命令对 Kafka 增加 Kafka 的分区数据,但是 Kafka 不支持减少分区数。
      Kafka 分区数据不支持减少是由很多原因的,比如减少的分区其数据放到哪里去?是删除,还是保留?删除的话,那么这些没消费的消息不就丢了。如果保留这些消息如何放到其他分区里面?追加到其他分区后面的话那么就破坏了 Kafka 单个分区的有序性。如果要保
      证删除分区数据插入到其他分区保证有序性,那么实现起来逻辑就会非常复杂。

    6. 副本机制的了解

    kafka的分区有副本(replica)的概念,有一个leader和多个follow,生产者和消费者都之和leader交互,当leader挂掉以后,会重新从其他的副本中选取出一个新的leader

    • 好处
      1.Kafka 通过给特定 Topic 指定多个 Partition, ⽽各个 Partition 可以分布在不同的 Broker上, 这样便能提供⽐较好的并发能⼒(负载均衡)。
      2.Partition 可以指定对应的 Replica 数, 这也极⼤地提⾼了消息存储的安全性, 提⾼了容灾能⼒,不过也相应的增加了所需要的存储空间。

    7.如何保证消费的顺序性

    7.1 kafka如何保证消息的顺序性
    kafka 中的每个 partition 中的消息在写入时都是有序的,而且单独一个 partition 只能由一个消费者去消费,可以在里面保证消息的顺序性。但是分区之间的消息是不保证有序的。

    7.2 如何保证消费的顺序性
    1.一个Topic对应一个patition,太暴力,效率低,不支持
    2.发送消息的时候指定key/partiton,对于同一类型的key,保存在同一个partition中,因为partition才能够真正保证消息的顺序性

    8.如何保证消息不丢失

    • 生产者丢消息
      通过判断生产者的发送结果是否发生成功,设置重试间隔和重试次数

    • 消费者丢消息
      消费者拉取了分区的消息后,消费者会自动提交offset,这时候挂了,便会丢失数据
      手动提交也会有问题,如果消费者已经消费了数据,但是还没有提交数据就挂了,这时相同的数据可能会被重复消费
      大多数情况下还是会选择手动提交,选择手动提交,那么就要解决重复消费的问题,见下面

    • kafka弄丢了消息(leader挂了)
      acks = all,⽣产者(Producer) 很重要的⼀个参数,all 代表则所有副本都要接收到该消息之后该消息才算真正成功被发送
      replication.factor 》=3,保证每个分区至少有三个副本
      min.insync.replicas> 1,消息⾄少要被写⼊到 2 个副本才算是被成功发送。 min.insync.replicas 的默认值为 1 ,在实际⽣产中应尽量避免默认值 1。
      ⼀般推荐设置成 replication.factor =min.insync.replicas + 1

    9.如何保证消息不被重复消费

    • 多线程消费模式下数据的重复消费
      把这些线程放到一个消费者组,逻辑上一个消费者组对应一个消费者,一个Topic只能被一个消费者消费一次,消费者组内的多线程分别消费不同的partition即可

    • 原因

      • 原因1:强行kill线程,导致消费后的数据,offset没有提交。
      • 原因2:设置offset为自动提交,关闭kafka时,如果在close之前,调用 consumer.unsubscribe() 则有可能部分offset没提交,下次重启会重复消费。
      • 原因3(重复消费最常见的原因):消费后的数据,当offset还没有提交时,partition就断开连接。比如,通常会遇到消费的数据,处理很耗时,导致超过了Kafka的session timeout时间(0.10.x版本默认是30秒),那么就会re-blance重平衡,此时有一定几率offset没提交,会导致重平衡后重复消费。
      • 原因4:当消费者重新分配partition的时候,可能出现从头开始消费的情况,导致重发问题。
      • 原因5:当消费者消费的速度很慢的时候,可能在一个session周期内还未完成,导致心跳机制检测报告出问题。

    10.ZK在kafka中的作用

    11. 请简述下你在哪些场景下会选择 Kafka?

    日志收集:一个公司可以用Kafka可以收集各种服务的log,通过kafka以统一接口服务的方式开放给各种consumer,例如hadoop、HBase、Solr等。
    消息系统:解耦和生产者和消费者、缓存消息等。
    用户活动跟踪:Kafka经常被用来记录web用户或者app用户的各种活动,如浏览网页、搜索、点击等活动,这些活动信息被各个服务器发布到kafka的topic中,然后订阅者通过订阅这些topic来做实时的监控分析,或者装载到hadoop、数据仓库中做离线分析和挖掘。
    运营指标:Kafka也经常用来记录运营监控数据。包括收集各种分布式应用的数据,生产各种操作的集中反馈,比如报警和报告。
    流式处理:比如spark streaming和 Flink

    12. 请谈一谈 Kafka 数据一致性原理

    一致性就是说不论是老的 Leader 还是新选举的 Leader,Consumer 都能读到一样的数据。

    • 假设分区的副本为3,其中副本0是 Leader,副本1和副本2是 follower,并且在 ISR 列表里面。虽然副本0已经写入了 Message4,但是 Consumer 只能读取到 Message2。因为所有的 ISR 都同步了 Message2,只有 High Water Mark 以上的消息才支持 Consumer 读取,而 High Water Mark 取决于 ISR 列表里面偏移量最小的分区,对应于上图的副本2,这个很类似于木桶原理。

    • 这样做的原因是还没有被足够多副本复制的消息被认为是“不安全”的,如果 Leader 发生崩溃,另一个副本成为新 Leader,那么这些消息很可能丢失了。如果我们允许消费者读取这些消息,可能就会破坏一致性。试想,一个消费者从当前 Leader(副本0) 读取并处理了 Message4,这个时候 Leader 挂掉了,选举了副本1为新的 Leader,这时候另一个消费者再去从新的 Leader 读取消息,发现这个消息其实并不存在,这就导致了数据不一致性问题。

    • 当然,引入了 High Water Mark 机制,会导致 Broker 间的消息复制因为某些原因变慢,那么消息到达消费者的时间也会随之变长(因为我们会先等待消息复制完毕)。延迟时间可以通过参数 replica.lag.time.max.ms 参数配置,它指定了副本在复制消息时可被允许的最大延迟时间。

    13. ISR、OSR、AR 是什么?

    ISR:In-Sync Replicas 副本同步队列
    OSR:Out-of-Sync Replicas
    AR:Assigned Replicas 所有副本
    ISR是由leader维护,follower从leader同步数据有一些延迟,超过相应的阈值会把 follower 剔除出 ISR, 存入OSR(Out-of-Sync Replicas )列表,新加入的follower也会先存放在OSR中。AR=ISR+OSR。

  • 相关阅读:
    linux下python3环境安装(源码编译的方式安装)
    windows下docker安装(windows上安装docker比较鸡肋不推荐,还是建议在linux等系统上安装)
    序列化器嵌套的使用
    采用自定义模型字段代替序列化器嵌套的使用来返回我们想要的数据
    xadmin后台的安装及配置使用
    ORACLE检查找出损坏索引(Corrupt Indexes)的方法详解
    OGG相关操作
    ESXi挂载NFS共享存储
    第4步:创建RAC共享磁盘组
    Zabbix Server 配置微信报警
  • 原文地址:https://www.cnblogs.com/cherrie-lin/p/14097668.html
Copyright © 2020-2023  润新知