032. Kafka 优雅使用

1. Kafka 写入


1. Kafka 是基于磁盘的吗?Kafka 机器不需要消耗内存?
  • Kafka 也是用内存,使用的是操作系统的 page cache 内存。
2. page cache vs JVM 进程内 cache
  1. JVM 对象存储松散,通常使数据所占内存加倍,通过 OS 缓存二进制数据更紧凑。
  2. 用 JVM 内存 cache 数据,容易导致 GC,使用 page cache 缓存,不存在 GC 问题。
  3. 若 JVM 维护了进程内 cache,若要写磁盘,page cache 会再缓存一份,导致内存折半。
  4. 使用 JVM 进程内 cache,重启 broker 时需要重新加载数据(加载 10G 的数据,可能需要 10min),page cache 不需要重新加载。

2. Kafka 接收


1. push、pull 方式比较
方式优点缺点
push实时性客户端的压力是被动的(不能自己控制可以承受的压力大小),服务端有性能瓶颈(元信息数据保存在服务端)
pull客户端自己控制进度实时性不好

3. kafka 分段存储


image-20200706183701515

  • .index 为索引文件,.log 为数据文件
  • .index 文件中,第一个值表示 partition offset,第二个值表示 file offset。
  • 根据客户端传入的 offset,从 .index 文件中查找到对应的 file offset 范围,在 .log 文件中查询对应的数据。

4. Kafka 查询速度快的原因


1. 通过 page cache 实现

image-20200706183952025

  • 当读取文件 1,此时 page cache 会将数据加载到 3 个 page 中去(哪怕此时可能只用到其中一个 page 的数据)。
  • 假如 100ms 之后又来读取文件 1,此时数据在 page 中已经存在,我们称为命中,此时会直接返回 page 中的数据。
  • 返回数据之后,会加载更多的数据到 page 中去。
  • 假如第三次又读取文件 1,我们从 page 中返回数据,并且加载更多的数据到 page 中,此操作称为预读。
2. Kafka zero copy

image-20200706184124016

  • 图 1:数据会在 page cache、JVM 进程、socket 缓冲区进行三次数据拷贝。
  • 图 2:只会在 page cache 进行一次拷贝。
  • Kafka 通过 netty 实现 zero copy。

5. Kafka 在 PROD 的方案之:网卡流量激增方案


image-20200706184237887

  • 如果将 Kafka 机器放到了业务区,当大批量从 Kafka 集群抽取数据时,可能会把交换机的网卡带宽直接打满,此时业务区的其他系统将处于不可用状态。

  • 解决方案:使用多个网卡,业务系统和 Kafka 所使用网卡分离。

  • Kafka 的 server.properties 文件中不对 host.name、advertised.host.name 做配置,Kafka server 实例就会监听所有网卡。

6. Kafka 优化


producer
  • 写入数据:从以下几条考虑:

    • ack(0、1、All)
    • buffer(压测)
    • 数据类型(binary)
  • reties 参数:假如数据发送不成功,重试。 >= 2

broker
  • topic partition 个数 / replication 个数 考虑。

  • 写非常多的情况:

    • 看数据重要程度,replication 减少不了;如果不重要,考虑减少 replication 的个数。(reolication 个数增加,会降低写数据的效率,读不会受到影响)
    • 数据重要,增加 partition 个数。(不一定能起作用,假如机器数据固定,此时每台机器的效率已经达到最高,此时增加 partition 的个数也无法提高效率)
    • 增加机器。(多做测试)
consumer
  • consumer group:

    • 主要优化点在于 consumer 的个数(并发度),<= partition 个数。
    • timeout 时间、拉取数据的大小(吞吐量)。吞吐量越大,相对来说延迟越大,但消费能力越强。
数据消费 exactly-once
  • producer

    • ack=all
  • broker

    • replication:>=2
    • IRS: >=2 (Kafka 允许 follower 跟不上 leader 节奏,IRS 表示至少有多少个 follower 跟上了 leader 的节奏,假如设置为2,表示至少有一个 follower 跟上了 leader 的节奏。)
  • consumer

    • 使用 offset info 记录 partition、offset 的信息,保证了数据落地和 offset commit 的原子性。
    • 为了预防 producer 重复发送数据,导致数据重复消费,业务层添加唯一标识 message_id 进行重复过滤。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值