zookeeper+kafka消息队列群集部署

一:消息队列

1:什么是消息队列

消息队列是一种软件系统组件,它允许在分布式系统中发送和接收消息。消息队列提供了一种异步通信模式,在这种模式下,发送方和接收方不需要同时在线。消息队列可以存储消息直到接收方准备好处理它们为止。

2:消息队列的特征

消息队列具有以下几个主要特征:

  • 异步通信:消息队列允许应用程序之间通过消息进行异步通信,这意味着发送者不必等待接收者完成处理就可以继续执行其他任务。
  • 解耦:消息队列将发送方与接收方分离,使得系统各部分可以在不影响彼此的情况下独立扩展或更改。
  • 可靠的消息传递:消息队列通常提供保证消息传递的服务级别协议(SLA),确保消息至少被传递一次,或者恰好被传递一次。
  • 持久性:即使接收方暂时不可用,消息也会被存储起来直至被成功消费。
  • 流量控制:消息队列可以帮助调节消息的流量,避免消费者被大量消息淹没。
  • 扩展性:消息队列支持水平扩展,可以通过增加更多的消费者来处理更多的消息。
  • 负载均衡:消息队列可以在多个消费者之间分发消息,从而实现负载均衡。
  • 容错性:消息队列能够处理失败的情况,并且可以配置为在发生故障时重试消息的传递。

3:为什么消息需要队列

消息队列的存在主要是为了克服分布式系统中的几个挑战:

  • 异步处理:有时接收方无法立即处理消息,例如当接收方处于高负载状态或正在进行长时间操作时。
  • 系统解耦:通过使用消息队列,可以将系统的不同部分隔离,这样每个部分都可以独立地开发、部署和维护。
  • 提高可伸缩性和性能:消息队列允许并行处理,因此可以显著提高系统的吞吐量。
  • 可靠性:消息队列确保消息不会丢失,即使在系统出现故障的情况下也能恢复消息处理。
  • 灵活的消息路由:消息可以根据不同的规则路由到不同的目的地,这有助于构建更复杂的业务逻辑。

二: Kafka基础与入门

1:kafka基本概念

Apache Kafka 是一个开源的流处理平台,最初由 LinkedIn 开发,后来捐赠给了 Apache 软件基金会。Kafka 被设计用来处理实时数据流,它能够以高吞吐量、低延迟的方式处理大量数据。Kafka 的核心功能包括消息发布/订阅、数据持久化、数据复制以及简单的数据流处理。

2: kafka角色术语

  • Broker:Kafka 集群中的单个服务器。每个 Broker 可以运行在一个单独的机器上,也可以运行在同一个机器上。Broker 负责接受来自 Producer 的消息、存储消息以及将消息发送给 Consumer。
  • Topic:消息类别,它是消息发布的目标。一个 Topic 可以被看作是一个逻辑上的消息队列。
  • Partition:一个 Topic 可以被分成多个 Partition,每个 Partition 是有序的、不可变的消息序列。Partition 允许一个 Topic 跨多个 Broker 分布,从而支持水平扩展。
  • Replica:每个 Partition 可以有多个副本(Replica)以实现冗余。这有助于提高系统的可用性和容错能力。
  • Leader:每个 Partition 有一个 Leader Broker,负责所有读写操作。Leader 是唯一的,而其他的 Replica 则是跟随 Leader 的 Follower。
  • Follower:每个 Partition 的其他副本被称为 Follower,它们复制 Leader 的数据。如果 Leader 失败,一个 Follower 可以被提升为新的 Leader。
  • Producer:向 Kafka 发布消息的应用程序。Producer 负责创建和发送消息到特定的 Topic。
  • Consumer:从 Kafka 订阅消息的应用程序。Consumer 读取消息并对其进行处理。
  • Consumer Group:一组 Consumer 可以组成一个 Consumer Group,组内的 Consumer 会自动分配 Topic 的 Partition 进行消费。这使得 Kafka 能够支持多个 Consumer 并行消费一个 Topic 的消息。

3:kafka拓扑架构

Kafka 的核心架构包括一个或多个 Kafka Broker 组成的集群,以及连接到这些 Broker 的 Producer 和 Consumer。Producer 将消息发布到特定的 Topic,而 Consumer 从这些 Topic 中订阅并消费消息。

  • Broker 集群:Kafka 集群由一个或多个 Broker 组成,每个 Broker 可以运行在一个单独的服务器上,也可以运行在同一台服务器上。
  • ZooKeeper:虽然不是必须的,但 Kafka 经常与 ZooKeeper 配合使用来管理集群的元数据和协调集群中的 Broker。

4:Topic和partition

  • Topic:Topic 是 Kafka 中的一个逻辑分类,它是消息的容器。一个 Topic 可以包含多个 Partition。
  • Partition:Partition 是 Topic 的物理分割,是消息的实际存储单元。每个 Partition 是一个有序的消息队列。通过分区可以实现水平扩展,即增加 Partition 数量可以提高 Kafka 的吞吐量。每个 Partition 都有唯一的标识符,并且可以独立于其他 Partition 存储在不同的 Broker 上。

5:Producer生产机制

  • Producer 向 Kafka 发送消息,它可以指定消息发送到哪个 Topic 以及具体的 Partition。
  • Producer 通常使用轮询或哈希算法来决定消息发送到哪个 Partition。
  • Producer 在发送消息之前可以设置一些配置选项,如消息压缩、消息确认等。例如,Producer 可以选择等待 Broker 的确认来确保消息被正确接收,或者选择批量发送消息以减少网络传输次数。
  • Producer 还可以设置消息的 Key,这会影响消息如何被分配到 Partition。如果没有指定 Key,则通常根据消息值的哈希值来确定 Partition。

6:Consumer消费机制

  • Consumer 从 Kafka 订阅消息,通常属于某个 Consumer Group。
  • Consumer 可以通过拉取(Pull)的方式来获取消息,也可以通过推送(Push)方式由 Broker 推送消息。Kafka 采用的是 Pull 模型。
  • Consumer 可以通过设置偏移量(Offset)来记录其在 Partition 中的位置,以便于追踪消费进度。偏移量是由 Consumer 控制的,它可以自由选择从何处开始消费。
  • Consumer Group 内的 Consumer 会自动分配 Topic 的 Partition 进行消费,确保每个 Partition 至少被组内的一个 Consumer 消费。如果 Consumer Group 中的 Consumer 数量多于 Partition 数量,则多余的 Consumer 会处于空闲状态。
  • Consumer 还可以通过设置不同的消费策略来处理失败的消息,例如重新消费或跳过。

三: zookeeper概念介绍

1: zookeeper应用举例

ZooKeeper 是一个分布式协调服务,它提供了简单的 API 来解决分布式环境中的复杂问题。以下是一些 ZooKeeper 的典型应用场景:

  • 配置管理:ZooKeeper 可以作为中心化的配置管理器,允许分布式系统中的组件安全地存储和访问配置信息。
  • 命名服务:ZooKeeper 可以用于分配全局唯一的名字,例如在分布式系统中为服务实例分配唯一 ID。
  • 分布式锁:ZooKeeper 提供了实现分布式锁的基础结构,使得多个进程可以在分布式环境中同步共享资源。
  • 集群管理:ZooKeeper 可以帮助管理集群成员的状态,例如检测节点是否仍然活跃。
  • 负载均衡:ZooKeeper 可以用来实现基于客户端查询的负载均衡策略,通过动态更新服务列表来调整客户端的请求分发。
  • 队列管理:ZooKeeper 可以用来实现两种类型的队列:同步队列和屏障队列。
  • 选举服务:ZooKeeper 可以用来选举集群中的领导者,这对于需要单一决策者的系统尤其有用。

2: zookeeper的工作原理是什么?

ZooKeeper 的工作原理基于一个简单的客户端-服务器模型,其中服务器节点称为"Server",客户端节点称为"Client"。ZooKeeper 通过一系列的机制实现了数据的一致性和可靠性:

  • Zab 协议 :ZooKeeper 使用 Zab 协议来保证数据的一致性。Zab 协议有两种模式:崩溃恢复模式和广播模式。
    • 崩溃恢复模式:在这种模式下,ZooKeeper 会选举出一个新的领导者。
    • 广播模式:一旦选举出领导者后,ZooKeeper 就进入广播模式,在此模式下,所有更新都通过领导者进行同步。
  • 事务日志和快照:ZooKeeper 保存所有的事务请求记录在磁盘上,以确保数据的持久性。此外,还会定期创建数据的快照,以减少恢复时间。
  • 领导者选举:当集群中没有领导者时,ZooKeeper 会自动选举出一个领导者。选举过程确保只有一个领导者,并且所有 Server 都知道谁是领导者。

3: zookeeper集群架构

ZooKeeper 通常以集群的形式部署,以提高可用性和容错性。集群中的每个 Server 保持与其他 Server 的通信,并通过心跳检测来监控集群状态。以下是 ZooKeeper 集群的主要组成部分:

  • Server:ZooKeeper 集群中的单个节点。
  • Leader:集群中的一个特殊 Server,负责处理客户端的所有写请求,并将更新广播给其他 Server。
  • Follower:集群中的其他 Server,它们从 Leader 接收更新并将其应用到自己的状态机上。
  • Observer:可选角色,不参与选举过程,仅转发客户端请求至 Leader。
4:zookeeper的工作流程

ZooKeeper 的工作流程大致如下:

  1. 启动阶段

    • 所有的 Server 在启动时都会尝试建立与其他 Server 的连接。
    • Server 之间相互发送心跳包来维持连接。
  2. 选举阶段

    • 如果集群中没有 Leader 或者 Leader 失效,那么集群中的所有 Server 将进入选举阶段。
    • 每个 Server 都会投票给自己认为最合适的 Server 作为 Leader。
    • 当一个 Server 收集到足够多的票数(超过半数)时,它就会成为新的 Leader。
  3. 数据同步阶段

    • 新的 Leader 会通知所有的 Follower 进行数据同步。
    • Follower 会从 Leader 获取最新的数据状态,并更新自己的状态。
  4. 服务阶段

    • 一旦集群稳定下来,Leader 就开始接收客户端的请求。
    • 对于读请求,Leader 直接返回结果;对于写请求,Leader 会将请求广播给所有的 Follower。
    • Follower 更新自己的状态后,会向 Leader 发送确认信息。
    • 一旦收到足够的确认信息,Leader 就会将结果返回给客户端。

四: Zookeeper 在 Kafka 中的作用

Kafka 使用 ZooKeeper 来管理其集群的一些关键方面。虽然 Kafka 本身可以不依赖 ZooKeeper 运行,但在许多情况下,特别是在企业级部署中,ZooKeeper 仍然是 Kafka 集群的重要组成部分。下面是 ZooKeeper 在 Kafka 中的具体作用:

1 Broker注册

  • Broker 注册:当一个新的 Kafka Broker 加入集群时,它会在 ZooKeeper 中注册自己。这包括 Broker 的 ID 和主机地址等信息。ZooKeeper 作为集群的中央注册表,记录了所有 Broker 的信息。
  • Broker 状态监控:ZooKeeper 还负责监控 Broker 的状态。如果一个 Broker 下线,ZooKeeper 会检测到这一变化,并通知集群中的其他 Broker 进行相应的调整。

2 Topic注册

  • Topic 注册:当创建一个新的 Topic 时,Kafka 会在 ZooKeeper 中注册该 Topic 的元数据,包括 Topic 名称、Partition 数量、Replication 因子等信息。
  • Topic 配置管理:ZooKeeper 还负责存储 Topic 的配置信息,比如 Partition 的 Leader 信息和 Replica 分配。

3 生产者负载均衡

  • 生产者负载均衡:虽然生产者本身不直接依赖 ZooKeeper 来进行负载均衡,但是 Kafka 通过 ZooKeeper 管理的 Topic 和 Partition 信息间接支持了生产者的负载均衡。生产者可以根据 Topic 的 Partition 分配策略将消息均匀地分布到不同的 Partition 中,从而实现负载均衡。

4 消费者负载均衡

  • 消费者负载均衡:ZooKeeper 在 Kafka 中帮助实现消费者负载均衡。当新的 Consumer 加入 Consumer Group 时,ZooKeeper 会自动将 Topic 的 Partition 分配给不同的 Consumer,以确保每个 Partition 只被一个 Consumer 处理。这样可以有效地利用所有 Consumer 的处理能力。

5 分区 与 消费者 的关系

  • 分区与消费者的关系:ZooKeeper 负责维护 Partition 与 Consumer 之间的映射关系。在 Consumer Group 中,ZooKeeper 会确保每个 Partition 只被一个 Consumer 消费,并且会随着 Consumer 的加入或离开 Consumer Group 动态调整 Partition 的分配。

6 消息消费进度Offset 记录

  • Offset 记录:ZooKeeper 通常用于记录 Consumer Group 的消费进度,即 Offset。每个 Consumer Group 都有一个 Offset 存储在 ZooKeeper 中,记录了每个 Partition 的最后已消费的消息位置。当 Consumer 完成对一个 Partition 的消费时,它会将当前的 Offset 更新到 ZooKeeper 中。

7 消费者注册

  • 消费者注册:当一个 Consumer 加入 Consumer Group 时,它会在 ZooKeeper 中注册自己,并声明自己对哪些 Topic 的 Partition 感兴趣。ZooKeeper 会根据 Consumer 的声明和现有的 Partition 分配情况来进行负载均衡。
相关推荐
艾希逐月3 小时前
分布式唯一 ID 生成方案
分布式
齐木卡卡西在敲代码6 小时前
kafka的pull的依据
分布式·kafka
超级迅猛龙6 小时前
保姆级Debezium抽取SQL Server同步kafka
数据库·hadoop·mysql·sqlserver·kafka·linq·cdc
lllsure7 小时前
RabbitMQ 基础
分布式·rabbitmq
DN金猿10 小时前
rabbitmq发送的延迟消息时间过长就立即消费了
分布式·rabbitmq
ejinxian11 小时前
MySQL/Kafka数据集成同步,增量同步及全量同步
数据库·mysql·kafka
武子康13 小时前
大数据-74 Kafka 核心机制揭秘:副本同步、控制器选举与可靠性保障
大数据·后端·kafka
程序员不迷路13 小时前
Kafka学习
分布式·kafka
北i13 小时前
ZooKeeper 一致性模型解析:线性一致性与顺序一致性的平衡
分布式·zookeeper·云原生
IT技术小密圈13 小时前
图解分布式锁: 5分钟搞懂分布式锁
分布式·后端·面试