20# Apache Kafka 的学习笔记

 Kafka 相当厉害啊.

目录

Kafka

Kafka 怎么进行数据备份

备份是 0.8 版本后的功能.

一个备份数量为 n 的集群允许 n-1 个节点失效.

有一个节点作为 Leader 节点, 负责保存其他备份节点的列表, 并维持备份间状态同步.

Consumer 在 Leader 还是 Follower 中拿去数据

读写操作都来自 Leader, Follower 只负责数据备份和心跳检测 Leader 存活状态, 并及时顶替.

Kafka ISR 机制

Kafka 为了保持数据一致性而设计了 ISR 机制.

数据可靠主要是依赖于 Broker 中的 in-sync Replica 副本同步队列机制, 主要逻辑是制造冗余, 数据互备.

  1. Leader 会维护一个与其保持同步的 Replica 集合, 然后保证这组集合至少有一个存活, 并且消息 Commit 成功.

  2. Partition Leader 保持同步的 Partition Follower 集合, 当 ISR 中的 Partition Follower 完成数据的同步之后给 Leader 发送 ack.

  3. 如果 Partition Follower 长时间 (Replica.lag.time.max.ms) 未向 Leader 同步数据, 则该 Partition Follower 将被踢出 ISR.

  4. Partition Leader 发生故障之后, 就会从 ISR 中选举新的 Partition Leader.

  5. 当 ISR 中所有 Replica 都向 Leader 发送 ACK 时, Leader 执行 Commit.

Kafka 数据不丢失不重复

首先, Kafka 并不能完全的保证不丢失不重复.

0.11 版本前, Kafka 有两次消息传递: Producer 发送信息给 Kafka, Consumer 接受来自 Kafka 的信息.

两次传递都会影响最终结果, 且两次传递都是精确一次, 最终结果才是精确一次

  • Producer 传递消息的实现中指定了三个 ACK 值, 分别为
    1. -1 / ALL: Leader Broker 会等待消息写入且 ISR 同步后相应, 这种利用 ISR 实现可靠, 但吞吐量低.
    2. 0: Producer 不理会 Broker 的处理结果, 也不处理回调, 此时只保证高吞吐.
    3. 1: 即 Kafka 默认的 ACK 相应码, Leader Broker 写入数据便相应, 不等待 ISR 同步, 只要 Leader Broker 在线就不会丢失数据.

默认的 Producer 级别是 at least once.

  • Consumer 消息传递靠 Offset 保证. Consumer 实现中可以指定 Offset 行为, 即 enable.auto.commit, 实现效果也是 at least once.

Kafka 如何实现幂等性

0.11 版本后, Kafka 推出来 Idempotent Producer, 完成了幂等性和事务的支持.

在这个机制中, Producer 会发送多次同样的消息, 而 Broker 只会写入一次消息, Broker 执行了消息编号去重. 幂等保证了单一分区无重复消息.

在 Producer 里设置 true=enable.idempotent

多分区时, 为了保证同步写入的一致性, 引入事务理念, 要么全部写入, 要么全部回滚. 事务保证了多分区写入消息的完整性.

在 Producer 里设置 String something = transactional.id

此时的 Consumer 端没有 Kafka 自带的策略去支持 exactly once 消息模式, 所以需要手搓一个逻辑, 比如自己管理 offset 的提交.

Kafka 为什么速度快 - 页缓存技术

使用 Page Cache, 磁盘顺序写, 零拷贝的方式实现,

  • Kafka 在操作数据的时候会写入内存, 由操作系统决定何时把内存的数据写入磁盘.
  • 磁盘顺写, 即写入文件末尾保证写入速度.
  • Kafka 为了解决在应用内数据的通讯损耗, 引入了零拷贝技术, 即读操作的数据进入缓存后发送给网卡, 同时拷贝描述符而非数据给 Socket 缓存.

kafka 数据格式都是什么

Topic 主题, 然后主题进行分区, Topic 分为 Partition, Partition 包含 Message.

Kafka 如何清理过期数据

Kafka 的日志保存在 /kafka-logs 文件夹中, 默认七天清理, 当日志满足删除条件时, 会被标注为 "delete", 此时文件只是无法被索引, 文件本身不会被删除. 当超过 log.segment.delete.delay.ms 时间后, 文件会被文件系统删除.

kafka 的 Broker, partition, segment 都是啥

一个 Kafka 服务器也称为 Broker, 它接受生产者发送的消息并存入磁盘; Broker 同时服务消费者拉取分区消息的请求, 返回目前已经提交的消息.

每一个 Partition 最终对应一个目录, 里面存储所有的消息和索引文件.

Segment File 又由 index file 和 data file 组成, 他们总是成对出现, 后缀 ".index" 和 ".log" 分表表示 Segment 索引文件和数据文件.

kafka 一条 Message 中包含哪些信息

包含 Header 和 Body.

一个 Kafka Message 由一个固定长度的消息头 Header 和一个变长 Body 的消息体组成.

Header 由一个字节的 magic (文件格式信息) 和四个字节的 CRC32 校验码 (判断 Body 是否正常) 组成.

当 magic 为 1 时, 会在两者中添加一个字节的数据 attributes, 用于保存文件相关的信息, 比如是否压缩.

magic 为 0 时, 则 Body 直接由 N 个字节构成一个具体键值对形式的消息.

Kafka 蓄水池机制



评论

此博客中的热门博文

17# Apache Spark 的学习笔记 (WIP)

1# 失败的赛博空间匿名技术的思考