kafka

作者: laowangv2 | 来源:发表于2020-11-17 22:21 被阅读0次

1. 概念

  1. AR、ISR、OSR
    • AR 所有副本
    • ISR 和leader副本保持一定程度同步的副本(包括leader),参数replica.lag.max.messagets(不好把握,已废弃)和replica.lag.time.max.ms(副本上一次追齐leader LEO的时间过去了多久)
    • OSR AR - ISR
  2. HW、LEO、LW
    • HW 所有ISR中最小的LEO
    • LEO 下一条写入的offset
    • LW AR中最小的logStartOffset
  3. ISR伸缩
    • 缩容 isr-expiration任务定时检测失效副本(功能失效和同步失效),isr-change-propagation通过zk将失效ISR同步给控制器
    • 扩容 追上leader的HW的副本就有资格进入ISR,扩容的步骤也依赖zk,类似缩容
  4. 为什么不支持读写分离
    kafka为啥需要读写分离呢?读写分离是为了降低主库的读负载,kafka的设计就是多个主,负载均衡。读写分离没什么实质的好处,还会带来主从同步期间的数据不一致问题。

2. 用途

3. 设计

3.1 主要优点

作为大型公司的统一实时消息系统,需要满足:

  • 吞吐量高

3.2 性能相关的设计

  1. 磁盘
    • 直接写入操作系统页缓存,而不是使用堆内缓存。好处:
      1. 省了堆缓存的内存容量
      2. 避免对象开销,java对象的开销大
      3. gc负担
      4. os管理,即使kafka挂了,os没挂,依旧可以使用
    • 追加写,可访问空间无限,同时避免多次磁盘寻址(对数级别,数据库不行,因为需要增删查改,消息队列只用顺序读写)
    • 读写空中接力
      如果producer的生产速度和consume的消费速度相差不大,写入和读取都在页缓存中进行,磁盘Io很少,效率很高
  2. 网络
    • 消息块,减少小型的IO,将多个消息打包
    • 零拷贝 sendfile + mmap
      linux下零拷贝实现的几种方式:
      • sendfile
        只能用于文件传套接字。只有一次cpu参与的拷贝,内核空间 -> socket 缓冲。借助硬件支持,可以把最后一次cpu拷贝也消除,直接从内核空间到网卡
      • mmap
        用户直接操作内核空间,跳过用户空间
      • 直接IO
        跨过内核,用户态直接访问硬件
      • splice
        描述符至少有一个是管道
      • 写时复制
      • 等等
  3. 压缩

3.3 交付语义

  • At most once
  • At least once
  • Exactly once
3.1. 如何实现不丢消息(At least oce)

前提条件:

  1. 已提交的消息,也就是收到ack的消息,至于是几个broker确认由自己决定,取决于对性能和可靠性的偏好
  2. 至少一个存储消息的broker存活

producer:

  • ack=all

consumer:

  • 先消费,后commit

broker:

  • unclean.leader.election.enable = false,禁止ISR以外的节点选为leader
  • replication.factor >= 3,至少三副本
  • min.insync.replicas > 1,写入大于1才认为已提交,acks=all时确认的最小个数,如果ack=all且ISR个数小于min.insync.replicas,写入报错
3.2. 如何实现正好一次(Exactly once)

前提:
版本>=0.11.0.0
kafka 保证的是其stream中的exactly once

  • 幂等producer
    解决了重复提交时的数据重复,实现了单session、单partition幂等。依靠的是pid+消息sequence
  • 事务性
    幂等没有解决的问题:1)跨partition幂等 2)跨session幂等,即producer挂了,pid会重新生成,也就无法保证幂等了
    同时,事务性保证了发送消息和提交commit操作的原子性,这就可以去实现stream操作的exactly once语义了
3.3. 消息有序

before 0.11.0.0
max.in.flight.requests.per.connection = 1
after
使用事务producer就可以

3.3. 日志格式

文件名:第一个offset.kafka


kafka log implementation

  • 两个刷盘配置,M条和S秒,保证最多丢失M条数据或者N秒数据

  • 客户端提供一个offset和最大块大小S来读,返回S位,S需要大于所有单条数据,如果不是会重试,翻倍S
    broker根据offset查找相应的文件,在文件中使用二分查找来找到对应的消息

3.4时间轮

一些延时操作的实现机制
https://zhuanlan.zhihu.com/p/121483218

相关文章

网友评论

      本文标题:kafka

      本文链接:https://www.haomeiwen.com/subject/qowqvktx.html