Kafka教程

1. kafka概况

  • 消息队列的好处:解耦,可恢复性,缓冲,峰值处理能力,异步通讯
  • 概念:Kafka 是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域。
  • 发布/订阅模式:消息生产者(发布)将消息发布到 topic 中,同时有多个消息消费者(订阅)消费该消息。和点对点方式不同,发布到 topic 的消息会被所有订阅者消费。
  • 基本框架:生产者,消费者,消费者组,Broker,Topic,分区,副本,leader,follower


    基本框架

2. kafka命令行(基于cdh)

  • 查看topic
    kafka-topics --list --zookeeper dataapply1:2181
  • 删除topic
    kafka-topics --delete --topic zsstest --zookeeper dataapply1:2181
  • 新建topic
    kafka-topics --create --zookeeper dataapply1:2181 --replication-factor 1 --partitions 1 --topic zsstest
  • 生产数据
    kafka-console-producer --broker-list dataapply1:9092 --topic zsstest1
  • 消费数据
    kafka-console-consumer --bootstrap-server dataapply1:9092 --topic zsstest1 --from-beginning
  • 修改分区
    kafka-topics --zookeeper dataapply1:2181 --alter --topic zsstest1 --partitions 6

3. Kafka架构原理

3.1 文件存储机制

每个 partition 对应于一个 log 文件,该 log 文件中存储的就是 producer 生产的数据。Producer 生产的数据会被不断追加到该 log 文件末端,且每条数据都有自己的 offset。为防止 log 文件过大导致数据定位效率低下,Kafka 采取了分片和索引机制,将每个 partition 分为多个 segment。每个 segment 对应两个文件——“.index”文件和“.log”文件。这些文件位于一个文件夹下,该文件夹的命名规则为:topic 名称+分区序号。例如:

00000000000000000000.index 00000000000000000000.log
00000000000000170410.index 00000000000000170410.log
00000000000000239430.index 00000000000000239430.log

文件存储

3.2 生产者

3.2.1 分区策略
  • 分区原因:方便在集群中扩展,可以提高并发
  • 分区原则:partition(指定分区)->key hash值(不指定分区,有key)->round-robin(无key)
3.2.2 数据可靠性

为保证 producer 发送的数据,能可靠的发送到指定的 topic,topic 的每个 partition 收到 producer 发送的数据后,都需要向 producer 发送 ack(acknowledgement 确认收到),如果 producer 收到 ack,就会进行下一轮的发送,否则重新发送数据。

  • ISR: Leader 维护了一个动态的 in-sync replica set (ISR),意为和 leader 保持同步的 follower 集合。当 ISR 中的 follower 完成数据的同步之后,leader 就会给 follower 发送 ack。如果 follower 长时间未向 leader 同步数据,则该 follower 将被踢出 ISR ,该时间阈值由 replica.lag.time.max.ms 参数设定。Leader 发生故障之后,就会从 ISR 中选举新的 leader。
  • acks 参数配置: acks:
    0:producer 不等待 broker 的 ack,这一操作提供了一个最低的延迟,broker 一接收到还没有写入磁盘就已经返回,当 broker 故障时有可能丢失数据;
    1:producer 等待 broker 的 ack,partition 的 leader 落盘成功后返回 ack,如果在 follower 同步成功之前 leader 故障,那么将会丢失数据;
    -1(all):producer 等待 broker 的 ack,partition 的 leader 和 follower 全部落盘成功后才返回 ack。但是如果在 follower 同步完成后,broker 发送 ack 之前,leader 发生故障,那么会造成数据重复。
  • 故障处理
    LEO:指的是每个副本最大的 offset;
    HW:指的是消费者能见到的最大的 offset,ISR 队列中最小的 LEO。
3.2.3 Exactly Once 语义

At Least Once + 幂等性 = Exactly Once
设置:ACK 级别设置为-1,Producer 的参数中 enable.idompotence 设置为 true 。
原理:Kafka 的幂等性实现其实就是将原来下游需要做的去重放在了数据上游。开启幂等性的 Producer 在初始化的时候会被分配一个 PID,发往同一 Partition 的消息会附带 Sequence Number。而Broker 端会对做缓存,当具有相同主键的消息提交时,Broker 只会持久化一条。 但是 PID 重启就会变化,同时不同的 Partition 也具有不同主键,所以幂等性无法保证跨分区跨会话的 Exactly Once。

3.3 消费者

  • 消费方法:consumer 采用 pull(拉)模式从 broker 中读取数据。 一个分区只能被同个消费者组种的一个消费者消费。不同消费者组互不影响
  • 分区分配策略:RangeAssignor(默认),RoundRobinAssignor,StickyAssignor
  • offset的维护:consumer 需要实时记录自己消费到了哪个 offset,以便故障恢
    复后继续消费。 consumer 默认将 offset 保存在 Kafka 一个内置的 topic 中,该 topic 为__consumer_offsets。

3.4 kafka效率高原因:

  • 顺序写:顺序写之所以快,是因为其省去了大量磁头寻址的时间
  • 零拷贝:Producer生产的数据持久化到broker,采用mmap文件映射,实现顺序的快速写入;Customer从broker读取数据,采用sendfile,将磁盘文件读到OS内核缓冲区后,直接转到socket buffer进行网络发送。

3.5 zookeeper的作用

Kafka 集群中有一个 broker 会被选举为 Controller,负责管理集群 broker 的上下线,所有 topic 的分区副本分配和 leader 选举等工作。 Controller 的管理工作都是依赖于 Zookeeper 的。

你可能感兴趣的:(Kafka教程)