9. Kafka

9.1 消息中间件MQ

什么是消息中间件:

消息中间件关注数据的发送和接收,主要解决的是分布式系统之间的消息传递问题。通过提供 消息传递 和 消息排队 模型,可以在分布式架构下扩展进程间的通信。

常见的消息中间件:

ActiveMQ,RabbitMQ,RocketMQ,Kafka,Redis

消息中间件的术语:

  • Broker:消息服务器,提供核心服务
  • Producer:消息生产者
  • Consumer:消息消费者
  • Topic:主题,发布/订阅模式下的消息统一汇集地
  • Queue:队列,P2P模式下的消息队列

消息中间件的工作模式:

  • 点对点模式(P2P):一对一,消费者主动拉取数据
  • 发布订阅模式(Pub/Sub):一对多,数据生产后,订阅者主动拉取数据

在这里插入图片描述


9.2 Kafka 是什么

Kafka 是一种高吞吐量的分布式发布订阅消息系统,专用于超高吞吐量的实时日志采集、实时数据同步、实时数据计算等场景。

Kafka 的特点:

  • 对任意消息队列只能分区内有序而不能全局有序
  • 不停机扩展集群
  • 消息副本冗余
  • 实时数据管道
  • 使用 Scala 编写

9.3 Kafka 架构

在这里插入图片描述
Producer 提交数据流程:

  1. 用 key.hashCode % num_partitions,获得分区号
  2. 向 leader 中写入数据
  3. leader 向 follower 同步数据

Kafka 的消费者如何消费数据:

消费者每次消费数据的时候,消费者都会记录消费的物理偏移量(offset)的位置

等到下次消费时,他会接着上次位置继续消费

Topic:

  • Topic 是发布消息的类别名称,有多少个日志类型就有多少个 Topic
  • 发布和订阅必须指定 Topic
  • Topic 副本的数量不大于 Broker 个数,即不能多于服务器的数量。

Producer:

  • Producer 直接发送消息到 Broker 上对应的 Leader Partition
  • Producer 客户端根据分区策略知道消息被推送到哪些 Partition。

Consumer:

  • 每个 Partition 只能由 同一消费组(Consumer Group)内 的 一个 Consumer 来消费,Consumer Group 的作用是为了实现多个 Consumer 并行消费一个 Topic
  • 每个 Consumer 可以消费多个分区
  • 消费过的数据仍然会保留在 Kafka 中

9.4 为什么一个 Topic 要分成多个 Partition

如左图所示,如果 Topic A 不划分成多个 Partition,那么集群中会把 Topic A 的整份副本保留在各个 broker 上。那么,当consumer 需要消费 Topic A 时,就只能同时去单个 broker 上消费整个 Topic A,其他 broker 就只能啥也不干

如右图所示,如果将 Topic A 划分成两个分区 P1 和 P2,那么,当 consumer 需要消费 Topic A 时,可以从 broker1 上消费 分区 P1 的数据,从 broker2 上消费分区 P2 的数据,这样就可以实现 并行 读取, 同时 从多个 broker 上的不同 Partition 上读数据

在这里插入图片描述


9.5 Kafka 如何处理旧数据

无论消息是否被消费,Kafka 都会保留所有消息,有两种策略可以删除旧数据:

  • 基于时间:log.retention.hours=168
  • 基于大小:log.retention.bytes=1073741824

因为 Kafka 读取特定消息的时间复杂度为 O(1),即与文件大小无关,所以这里删除过期文件与提高 Kafka 性能无关。


9.5 副本同步

ISR(In-Sync Replicas)即副本同步队列。ISR 中包括一个分区中的 leader 和 follower,ISR 中的 follower 都是与 leader 同步的,相反,不在 ISR 中的 follower 都是与 leader 不同步的。

设置 ISR 的目的是为了在 broker 宕掉之后,重新选举 partition 的 leader 时从 ISR 列表中选择,也就是说当 leader 发生故障时,只有在 ISR 列表中的 follower 才有资格被选举为新的 leader。

在这里插入图片描述

上图中,Follower1 与 Follower2 中的消息条数明显少于 Leader,但并不一定与Leader 不同步。

ISR 是一个动态调整的集合。follower 的工作就是不断从 leader 处拉取消息副本,然后写入到自己的提交日志中。 如果这个同步过程的速度持续慢于 leader 消息的写入速度,那么在一定时间间隔后,此 follower 就会被认为是和 leader 不同步的,因此 kafka 会将该 follower 踢出 ISR。但如果该 follower 后面慢慢追上了 leader 的进度,那么它是能够重新加回 ISR 的。


9.6 Kafka 容灾

Kafka 容灾指当 Broker 宕机时的恢复机制。在 Kafka 集群中会有一个或者多个 Broker,其中有一个 Broker 会被选举为控制器(Kafka Controller),它负责管理整个集群中所有分区和副本的状态。

  • 当某个分区的 Leader 出现故障时,由控制器负责为该分区选举新的 Leader 。
  • 当检测到某个分区的 ISR 集合发生变化时,由控制器负责通知所有 Broker 更新其元数据信息。

Kafka 中的控制器选举的工作依赖于 ZooKeeper,成功竞选为控制器的 Broker 会在 ZooKeeper 中创建临时节点。


9.7 Zookeeper 在 Kafka 中的作用

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值