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同步数据,因为是新的磁盘,还没有任何数据,会自动重建。

水位

存储结构

待续。。。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值