zoukankan      html  css  js  c++  java
  • kafka学习笔记

    kafka学习笔记

    • kafka基本概念1
      1.代理(broker):一般一个服务器部署一个broker
      2.生产者:通过消息的key hash之后取模运算得到分区索引
      3.消费者:消费的时候需要设置消费组名,如果不设置会自动生成
      4。消费者组:为了可以多线程消费消息,一般一个消费者对应一个线程,在设置的时候,线程数应该小于等于分区数,如果大于会造成线程浪费

    • kafka基本概念2
      1.主题:区分不同的业务,如用户充值记录放在主题A,用户登陆数据在主题B
      2.分区:一个分区只对应一个代理节点,一个代理节点可以管理多个分区
      3.副本:一般副本数为3即可

      4.记录

    • kafaka特性
      1.异步生产数据,从0.8.2起
      2.偏移量转移:从zookeeper转移到kakfa自身的_comsumer_offers,该内部主题的数据外界无法直接获取
      3.安全机制:通过ssl和sasl安全机制进行身份确认
      4.连接器:增加一个Connect模块
      5.机架感知:使用机架感知让kafka备份数据分布到不同的机架上
      6.数据流: 可以将kafka集群中的数据进行流处理后再重新写回到kafka中
      7.时间戳:生产者会自动给消息加上时间戳
      8.消息语义:

    • 元数据存储结构

    • 控制器启动顺序

    • 选举过程

    • zab协议
      https://www.cnblogs.com/stateis0/p/9062133.html

    • 创建主题
      ./kafka-topics.sh --create --zookeeper 192.168.20.20:2181,192.168.20.21:2181,192.168.20.22:2181 --replication-factor 3 --partitions 6 --topic ip_login

    • 查看主题
      ./kafka-topics.sh --describe --zookeeper 192.168.20.20:2181,192.168.20.21:2181,192.168.20.22:2181 --topic ip_login

    • 查看全部主题
      ./kafka-topics.sh --describe --zookeeper 192.168.20.20:2181,192.168.20.21:2181,192.168.20.22:2181

    • 查看所有主题名称
      ./kafka-topics.sh --list --zookeeper 192.168.20.20:2181,192.168.20.21:2181,192.168.20.22:2181

    • 查看正在同步的主题
      ./kafka-topics.sh --describe --zookeeper 192.168.20.20:2181,192.168.20.21:2181,192.168.20.22:2181 --under-replicated-partitions

    • 查看不可用分区
      kafka-topics.sh --describe --zookeeper 192.168.20.20:2181,192.168.20.21:2181,192.168.20.22:2181 --unavailable-partitions

    • 修改配置

    创建: kafka-topics.sh --create --zookeeper 192.168.20.20:2181,192.168.20.21:2181,192.168.20.22:2181 --replication-factor 1 --partitions 1 --topic user_order2 --config max.message.bytes=102400
    修改: kafka-topics.sh --alter --zookeeper 192.168.20.20:2181,192.168.20.21:2181,192.168.20.22:2181 -topic user_order2 --config max.message.bytes=204800
    
    • 删除主题
      kafka-topics.sh --zookeeper 192.168.20.20:2181,192.168.20.21:2181,192.168.20.22:2181 -delete --topic user_order2
    • 删除流程
    • 增加分区
      kafka-topics.sh --partitions 6 --alter --zookeeper 192.168.20.20:2181,192.168.20.21:2181,192.168.20.22:2181 --topic user_order2
    • 修改副本数
      kafka-topics.sh --partitions 6 --alter --zookeeper 192.168.20.20:2181,192.168.20.21:2181,192.168.20.22:2181 --topic user_order2
    • 生产者
      kafka-console-producer.sh --broker-list 192.168.20.23:9092,192.168.24.21:9092,192.168.20.25:9092 --topic test_topic
    • 启动消费者
      kafka-console-consumer.sh --bootstrap-server 192.168.20.23:9092,192.168.24.21:9092,192.168.20.25:9092 --topic test_topic
    • 总结一下,对于如何保证 Kafka 中消息消费的顺序,有了下面两种方法:
    1. 1 个 Topic 只对应一个 Partition。
      2.(推荐)发送消息的时候指定 key/Partition。

    kafka总结

    1. Kafka的用途有哪些?使用场景如何?

    总结下来就几个字:异步处理、日常系统解耦、削峰、提速、广播
    如果再说具体一点例如:消息,网站活动追踪,监测指标,日志聚合,流处理,事件采集,提交日志等

    2. Kafka中的ISR、AR又代表什么?ISR的伸缩又指什么

    ISR:In-Sync Replicas 副本同步队列
    AR:Assigned Replicas 所有副本
    ISR是由leader维护,follower从leader同步数据有一些延迟(包括延迟时间replica.lag.time.max.ms和延迟条数replica.lag.max.messages两个维度, 当前最新的版本0.10.x中只支持replica.lag.time.max.ms这个维度),任意一个超过阈值都会把follower剔除出ISR, 存入OSR(Outof-Sync Replicas)列表,新加入的follower也会先存放在OSR中。AR=ISR+OSR。

    3. Kafka中的HW、LEO、LSO、LW等分别代表什么?

    HW:High Watermark 高水位,取一个partition对应的ISR中最小的LEO作为HW,consumer最多只能消费到HW所在的位置上一条信息。
    LEO:LogEndOffset 当前日志文件中下一条待写信息的offset
    HW/LEO这两个都是指最后一条的下一条的位置而不是指最后一条的位置。
    LSO:Last Stable Offset 对未完成的事务而言,LSO 的值等于事务中第一条消息的位置(firstUnstableOffset),对已完成的事务而言,它的值同 HW 相同
    LW:Low Watermark 低水位, 代表 AR 集合中最小的 logStartOffset 值

    4. Kafka中是怎么体现消息顺序性的?

    kafka每个partition中的消息在写入时都是有序的,消费时,每个partition只能被每一个group中的一个消费者消费,保证了消费时也是有序的。
    整个topic不保证有序。如果为了保证topic整个有序,那么将partition调整为1.

    5. Kafka中的分区器、序列化器、拦截器是否了解?它们之间的处理顺序是什么?

    拦截器->序列化器->分区器 https://blog.csdn.net/threeaspects/article/details/108130254

    6. Kafka生产者客户端的整体结构是什么样子的?

    https://blog.csdn.net/LeoHan163/article/details/105902707

    7. Kafka生产者客户端中使用了几个线程来处理?分别是什么?

    2个,主线程和Sender线程。主线程负责创建消息,然后通过分区器、序列化器、拦截器作用之后缓存到累加器RecordAccumulator中。Sender线程负责将RecordAccumulator中消息发送到kafka中.

    9. Kafka的旧版Scala的消费者客户端的设计有什么缺陷?
    10. “消费组中的消费者个数如果超过topic的分区,那么就会有消费者消费不到数据”这句话是否正确?如果不正确,那么有没有什么hack的手段?

    不正确,通过自定义分区分配策略,可以将一个consumer指定消费所有partition。

    11. 消费者提交消费位移时提交的是当前消费到的最新消息的offset还是offset+1?

    offset+1

    12. 有哪些情形会造成重复消费?

    消费者消费后没有commit offset(程序崩溃/强行kill/消费耗时/自动提交偏移情况下unscrible)

    13. 哪些情景下会造成消息漏消费?

    消费者没有处理完消息 提交offset(自动提交偏移 未处理情况下程序异常结束)

    14. KafkaConsumer是非线程安全的,那么怎么样实现多线程消费?

    1.在每个线程中新建一个KafkaConsumer
    2.单线程创建KafkaConsumer,多个处理线程处理消息(难点在于是否要考虑消息顺序性,offset的提交方式)

    15. 简述消费者与消费组之间的关系

    消费者从属与消费组,消费偏移以消费组为单位。每个消费组可以独立消费主题的所有数据,同一消费组内消费者共同消费主题数据,每个分区只能被同一消费组内一个消费者消费。

    16. 当你使用kafka-topics.sh创建(删除)了一个topic之后,Kafka背后会执行什么逻辑?

    创建:在zk上/brokers/topics/下节点 kafkabroker会监听节点变化创建主题
    删除:调用脚本删除topic会在zk上将topic设置待删除标志,kafka后台有定时的线程会扫描所有需要删除的topic进行删除

    17. topic的分区数可不可以增加?如果可以怎么增加?如果不可以,那又是为什么?

    可以

    18. topic的分区数可不可以减少?如果可以怎么减少?如果不可以,那又是为什么?

    不可以 https://blog.csdn.net/u013256816/article/details/82804564

    19. 创建topic时如何选择合适的分区数?

    根据集群的机器数量和需要的吞吐量来决定适合的分区数

    20. Kafka目前有哪些内部topic,它们都有什么特征?各自的作用又是什么?

    __consumer_offsets 以下划线开头,保存消费组的偏移

    21. 优先副本是什么?它有什么特殊的作用?

    优先副本 会是默认的leader副本 发生leader变化时重选举会优先选择优先副本作为leader

    22. Kafka有哪几处地方有分区分配的概念?简述大致的过程及原理

    创建主题时
    如果不手动指定分配方式 有两种分配方式
    消费组内分配

    23. 简述Kafka的日志目录结构

    https://www.bbsmax.com/A/MAzAYpjyz9/

    24. Kafka中有哪些索引文件?

    如上

    25. 如果我指定了一个offset,Kafka怎么查找到对应的消息?

    1.通过文件名前缀数字x找到该绝对offset 对应消息所在索引文件
    2.offset-x为在文件中的相对偏移
    3.通过index文件中记录的索引找到最近的消息的位置
    4.从最近位置开始逐条寻找
    https://www.pianshen.com/article/1541533485/

    26. 如果我指定了一个timestamp,Kafka怎么查找到对应的消息?

    原理同上 但是时间的因为消息体中不带有时间戳 所以不精确

    27. 聊一聊你对Kafka的Log Retention的理解

    kafka留存策略包括 删除和压缩两种
    删除: 根据时间和大小两个方式进行删除 大小是整个partition日志文件的大小
    超过的会从老到新依次删除 时间指日志文件中的最大时间戳而非文件的最后修改时间
    压缩: 相同key的value只保存一个 压缩过的是clean 未压缩的dirty 压缩之后的偏移量不连续 未压缩时连续

    28. 聊一聊你对Kafka的Log Compaction的理解

    针对每个消息的 key 进行整合,对于有相同 key 的不同 value 值,只保留最后一个版本。

    29. 聊一聊你对Kafka底层存储的理解(页缓存、内核层、块层、设备层)

    保存在磁盘,基于磁盘的顺序写。 采用页缓存、零拷贝技术。

    30. 聊一聊Kafka的延时操作的原理

    延迟操作包括延迟拉取、延迟数据删除、延迟生产等。 每个延迟操作会被放到一个延迟操作管理器当中,每一个延迟操作管理器会配备一个定时器,定时器底层数据是基于时间轮实现。

    31. 聊一聊Kafka控制器的作用

    它负责管理整个集群中所有分区和副本的状态。当某个分区的 leader 副本出现故障时,由控制器负责为该分区选举新的 leader 副本。当检测到某个分区的 ISR 集合发生变化时,由控制器负责通知所有broker更新其元数据信息。当使用 kafka-topics.sh 脚本为某个 topic 增加分区数量时,同样还是由控制器负责分区的重新分配。

    32. 消费再均衡的原理是什么?(提示:消费者协调器和消费组协调器)

    https://blog.csdn.net/Sampson_Hugo/article/details/103288465?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~sobaiduend~default-1-103288465.nonecase&utm_term=kafka消费再均衡&spm=1000.2123.3001.4430
    33. Kafka中的幂等是怎么实现的
    pid+序号实现,单个producer内幂等 https://www.jianshu.com/p/4761ad7bcde3
    33. Kafka中的事务是怎么实现的(这题我去面试6家被问4次,照着答案念也要念十几分钟,面试官简直凑不要脸。实在记不住的话…只要简历上不写精通Kafka一般不会问到,我简历上写的是“熟悉Kafka,了解RabbitMQ….”)
    34. Kafka中有哪些地方需要选举?这些地方的选举策略又有哪些?
    35. 失效副本是指什么?有哪些应对措施?
    36. 多副本下,各个副本中的HW和LEO的演变过程
    37. 为什么Kafka不支持读写分离?
    38. Kafka在可靠性方面做了哪些改进?(HW, LeaderEpoch)
    39. Kafka中怎么实现死信队列和重试队列?
    40. Kafka中的延迟队列怎么实现(这题被问的比事务那题还要多!!!听说你会Kafka,那你说说延迟队列怎么实现?)
    41. Kafka中怎么做消息审计?
    42. Kafka中怎么做消息轨迹?
    43. Kafka中有哪些配置参数比较有意思?聊一聊你的看法
    44. Kafka中有哪些命名比较有意思?聊一聊你的看法
    45. Kafka有哪些指标需要着重关注?
    生产者关注MessagesInPerSec、BytesOutPerSec、BytesInPerSec 消费者关注消费延迟Lag
    46. 怎么计算Lag?(注意read_uncommitted和read_committed状态下的不同)
    参考 如何监控kafka消费Lag情况
    47. Kafka的那些设计让它有如此高的性能?
    零拷贝,页缓存,顺序写
    48. Kafka有什么优缺点?
    49. 还用过什么同质类的其它产品,与Kafka相比有什么优缺点?
    50. 为什么选择Kafka?
    吞吐量高,大数据消息系统唯一选择。
    51. 在使用Kafka的过程中遇到过什么困难?怎么解决的?
    52. 怎么样才能确保Kafka极大程度上的可靠性?
    53. 聊一聊你对Kafka生态的理解
    confluent全家桶(connect/kafka stream/ksql/center/rest proxy等),开源监控管理工具kafka-manager,kmanager等

  • 相关阅读:
    HTML5小时钟
    简单画板
    li样式不显示使用overflow:hidden导致Li前面点、圈等样式不见
    Dede 列表页 缩略图 有显示无则不显示
    CSS3的position:sticky介绍
    json 包含字段及函数的写法
    PHP+Ajax 异步通讯注册验证
    find命令结合cp bash mv 命令使用的4种方式
    markdown完整语法规范3.0+编辑工具介绍
    几款 ping tcping 工具总结
  • 原文地址:https://www.cnblogs.com/Baronboy/p/13971388.html
Copyright © 2011-2022 走看看