• kafka使用经历总结


    近期面试遇上几个kafka的问题,结合之前使用情况,总结一下

    引言

    有句话是这么说的,世界上有三大发明:火、轮子、kafka,今天来简单聊一聊kafka

    一、使用经历和场景

    实时数据场景

    • 生产者:接触最多的就是flume收集数据写到kafka里,主要api日志和埋点日志等等
    • 生产者:还有就是binlog日志,用maxwell、canal、dataX、dts(阿里云产品)等工具进行收集
    • 消费者:比较通用的sparkSteaming、flink、storm
    • 消费者:支持直接对接某些大数据组件消费数据,比如Doris、Druid等

    临时队列

    • 实时数仓分层场景,数据经过elt、join等操作处理,再次吐到kafka中
    • 作为消息中间件,最大的作用是解耦,所以在和其他部门进行交互的时候,会将kafka作为消息存储的中间件,供双方使用
    • 延时队列的场景比较特殊,比如你希望kafka里的数据慢上5分钟,可以通过读取-等待-写入的方式,再将数据回流到kafka

    二、运维经历

    集群搭建

    搭建不再详细说明,注意几个点

    • 合理分配Xms和Xmx,防止频繁出现fullgc的情况
    • 合理指定生产着的吞吐量

    集群扩容

    扩容同样注意

    • 扩容后进行数据的rebalance,千万要控制集群间数据交换的流量大小,不要打满,导致正常业务读写出问题
    • 新增partition必然会导致下游消费多多少少的出问题。

    数据迁移

    当时做数据迁移比较简单,使用kafka没那么重,根据不同topic数据不同的迁移方案,作为临时使用和实时数据的,直接从生成者端切走了;需要读取较长时间段数据的,双生产者,直到在过期时间追平为止,需要注意的是依赖offset的会有很大影响

    三、面试问题及知识点

    kafka读取数据的几种方式?

    最新、最旧、指定offset、指定时间戳(0.9后的版本开始支持)

    如何保证数据一致性?

    首先了解ack的知识,ack=all、0、1

    如何保证从kafka中读出的数据是有序的?

    两种解决思路,1、将消息打到同一partition中;2、消费到消息后根据时间戳进行重排序

    offset回退问题

    之前用的版本是0.9.1,版本比较老,真实遇到过offset回退,主要原因是多副本间水位不一,遇上节点重新选举,才导致读到的offset回退,
    解决办法:看网上的给出的解决方案。auto.offset.reset参数设置为largest,尽量不要一次关闭所有broker;我们当时嫌kafka版本太低,直接升级到2.3.0,没再出现过这个问题

    某个borker磁盘坏了,如何恢复和保证正常使用?

    真实场景没遇到过,网上的方案

    1. 停止坏掉的机器,换上新的磁盘
    2. 执行一次脏选举 kafka-leader-election.sh --UNCLEAN
    3. 执行完毕之后,会从之前的Follower副本里面选出一个作为Leader
    4. 稍等片刻,等此节点掉出ISR列表之后,再重启这台机器。
    5. 重启之后,开始向Leader同步数据,因为是新的磁盘,还没有任何数据,会自动重建。

    水位

    存储结构

    待续。。。

  • 相关阅读:
    消息的并发处理
    unity基础学习二十,c#算法常用函数
    弹框处理秘籍:轻松掌握Alert、Confirm和Prompt弹出用法
    【单目3D目标检测】MonoGround论文精读与代码解析
    SpringBoot+Mybaits搭建通用管理系统实例八:系统权限控制实现
    【SemiDrive源码分析】【MailBox核间通信】52 - DCF Notify 实现原理分析 及 代码实战
    【微服务|Sentinel】热点规则|授权规则|集群流控|机器列表
    视频汇聚/视频云存储/视频监控管理平台EasyCVR分发rtsp流起播慢优化步骤详解
    使用HTML制作静态宠物网站——蓝色版爱宠之家(HTML+CSS)
    day17正则表达式作业
  • 原文地址:https://blog.csdn.net/jklcl/article/details/126837758