当前位置:   article > 正文

从Paxos到Zookeeper:分布性一致性原理与实践(Zookeeper典型应用场景)

从Paxos到Zookeeper:分布性一致性原理与实践(Zookeeper典型应用场景)

在上一章中,已经讲解了如何通过Zookeeper客户端来使用Zookeeper。

本章开始,将从实际的分布式应用场景出发,讲解如何使用Zookeeper去解决一些常见的分布式问题。

目录

一. 典型应用场景及实现

1. 数据发布/订阅

2. 负载均衡

3. 命名服务

4. 分布式协调/通知

5. 集群管理

6. Master选举

7. 分布式锁

二. Zookeeper在大型分布式系统中的应用

Kafka

1. Broker注册

2. Topic注册

 3. 生产者负载均衡

4. 消费者负载均衡

5. 消息分区与消费者的关系

6. 消息消费进度Offset记录

7. 消费者注册

小结


一. 典型应用场景及实现

Zookeeper是一个高可用的分布式数据管理与协调框架。基于对ZAB算法的实现,该框架能够更好地保证分布式环境中数据的一致性。本节将围绕数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master选举、分布式锁和分布式队列等方面来讲解Zookeeper的典型应用场景及实现。

1. 数据发布/订阅

  • 典型应用场景:
    • 配置中心:将配置数据存储在Zookeeper中,客户端订阅配置变化,当配置更新时,Zookeeper通知所有订阅的客户端。
  • 实现方式:
    • 节点存储配置数据:配置数据以节点的形式存储在Zookeeper中
    • Watcher机制:客户端对配置节点设置Watcher,当配置数据变化时,Watcher被触发,通知客户端更新配置。

2. 负载均衡

  • 典型应用场景
    • 动态服务注册和发现:在分布式系统中,服务器节点动态加入和退出,客户端需要实时感知可用服务器的节点并实现负载均衡
  • 实现方式
    • 服务注册:服务器节点启动时,在Zookeeper中创建临时节点,注册自己
    • 服务发现:客户端监控服务节点目录的变化,实时更新可用的服务器列表

3. 命名服务

  • 典型应用场景
    • 分布式系统中的资源命名:统一命名和管理分布式系统中的各种资源(如服务、节点、文件等)
  • 实现方式
    • 节点路径作为命名空间:将资源的名称映射到Zookeeper的节点路径,通过路径唯一标识资源

4. 分布式协调/通知

  • 典型应用场景
    • 任务协调:多个分布式任务需要协调运行和相互通知
  • 实现方式
    • 使用节点和Watcher实现协调:通过在Zookeeper中创建节点和设置Watcher,任务之间可以实现通知和同步。

5. 集群管理

  • 典型应用场景
    • 集群成员管理:在分布式系统中管理集群的成员,监控成员的加入和退出
  • 实现方式
    • 节点表示集群成员:每个集群成员在Zookeeper中创建一个临时节点,节点的存在表示成员的在线状态

6. Master选举

  • 典型应用场景
    • 分布式系统中的主节点选举:在分布式系统中动态选举一个主节点,负责协调和管理集群中的任务
  • 实现方式
    • 临时顺序节点:所有在Zookeeper中创建临时顺序节点,节点序号最小的成为Master

7. 分布式锁

  • 典型应用场景
    • 分布式系统中的资源锁定:在分布式锁中实现对共享资源的互斥访问
  • 实现方式
    • 临时顺序节点:客户端在Zookeeper中创建临时顺序节点,序号最小的节点获得锁。

二. Zookeeper在大型分布式系统中的应用

Zookeeper已经被广泛的应用在越来越多的大型分布式系统中,例如,Hadoop、Hbase和Kafka等开源系统。本节中,将围绕这些大型分布式系统的技术原理,介绍Zookeeper在其中的应用场景和具体的实现方式。

Kafka

Kafka主要用于实现低延迟的发送和收集大量的事件和日志数据--这些数据通常都是活跃的数据。Kafka在许多大数据架构中扮演者至关重要的角色,提供可靠的消息传递和数据流处理能力。

Kafka的核心概念

  • Producer:生产者负责生产信息并发布到Kafka的服务器上
  • Consumer:消费者负责消费Kafka服务器上的消息
  • Topic:主题是由用户定义并配置在Kafka服务端,用于建立生产者和消费者之间的订阅关系:生产者发送消息到Topic下,消费者从这个Topic下消费消息。
  • Partion:消息分区,一个Topic下会分为多个分区,例如“Kafka-Test”这个Topic可以分为10个分区,分别由两台服务器提供,呢么通常可以配置让每台服务器提供5个分区,假设服务器ID分别为0和1,那么所有的分区为0-0、0-1、0-2、0-3、0-4和1-0、1-1、1-2、1-3、1-4。消息分区机制和分区的数量与消费者的负载均衡有很大关系。
  • Broker:即Kafka的服务器,用于存储消息
  • Group:消息分组,用于归类同组消费者。Kafka中,多个消费者可以共同消费一个Topic下的消息,每个消费者消费其中的部分消息,这些消费者就组成了一个分组,拥有一个分组名称,通常也被称作消费者集群。
  • Offset:消息存储在Kafka的Broker上,消费者拉取消息数据的过程中需要知道消息在文件中的偏移量,这个偏移量就是Offset

1. Broker注册

虽然Broker是分布式部署并且相互之间是独立运行的,但是还是需要有一个注册系统能够将整个集群中的Broker服务器都管理起来。在Kafka中,选择了Zookeeper来进行所有Broker的管理

可以通过Zookeeper上“Broker节点”的变化情况来动态表征Broker服务器的可用性。

1. 在Broker中会有一个专门用来进行Broker服务器列表记录的节点,我们称之为“Broker节点”。每个Broker服务器启动时,都会到Zookeeper上进行注册(即到Broker节点下创建属于自己的节点)。在Kafka中,我们使用一个全局唯一的数字来指代每一个Broker服务器(Broker ID)。创建完Broker节点后,每个Broker就会将自己的IP地址和端口等信息写入到该节点中去。

2. Broker创建的节点是一个临时节点,也就是说,一旦这个Broker服务器宕机或是下线后,对应的Broker节点也被删除了。

2. Topic注册

Topic信息以及其中的分区信息也是由Zookeeper维护的。

1. Broker服务器启动后,会到对应的Topic节点下注册自己的Broker ID,并写入针对该Topic的分区总数

例如,/brokers/topics/login/3 -> 2 这个节点表明,Broker ID为3的一个Broker服务器,对于“login”这个Topic的消息,提供了2个分区进行消息存储。分区节点也是一个临时节点

 3. 生产者负载均衡

Kafka支持传统的四层负载均衡,也支持使用Zookeeper方式来进行负载均衡。

1. 传统四层负载均衡

通常一个生产者只会对应单个Broker,该生产者生产出来的所有信息都发送给这个Broker。缺点在于这种方法无法做到真正的负载均衡,每个生产者与每个Broker的消息存储量都是不一样的。所以非常不均匀,无法做到动态的负载均衡。

2. 使用Zookeeper进行负载均衡

每当一个Broker启动时,会首先完成Broker的注册过程,并注册一些诸如“有哪些可订阅的Topic”的元数据信息。生产者可以通过这个节点的变化动态感知到Broker服务器列表的变更。

Kafka的生产者会对Zookeeper上的“Broker的新增与减少”、“Broker与Topic关联关系的变化”等事件注册Watcher监听,这样就可以实现一种动态的负载均衡机制了。

 此外,在这种模式下,还能够允许开发人员控制生产者根据一定的规则进行数据分区,而不仅仅是随机算法而已--即语义分区。

4. 消费者负载均衡

与生产者类似,消费者同杨需要进行负载均衡来实现多个消费者合理从对应Broker中接收消息。

5. 消息分区与消费者的关系

对于每一个消费者分组,Kafka都会为其分配一个全局唯一的Group ID,同一个消费者分组内部的所有消费者都共享该ID。同时,Kafka也为每个消费者分配一个Consumer ID。在Kafka的设计中,规定了每个消费者分区有且只能同时有一个消费者进行分区。因此需要将Consumer ID写入到消息对应分区的临时节点上。

6. 消息消费进度Offset记录

在消费者对指定消息分区进行消息消费的过程中,需要定时将分区消息的消费进度,即Offset记录到Zookeeper上去,以便在该消费者进行重启或是其他消费者重新接管该消息分区的消息消费后,能够从之前的进度开始继续进行消息的消费。Offset在Zookeeper上的记录由一个专门的节点负责,节点内容就是Offset值。

7. 消费者注册

消费者服务器在初始化启动时,加入消费者分组

(1) 每个消费者服务器在启动时,都回到Zookeeper指定节点下创建一个属于自己的消费者节点。完成该节点创建后,消费者会将自己的订阅的Topic信息写入该节点。(该节点也是一个临时节点,当消费者服务器故障或下线,其对应的消费者节点会被删除掉)

(2) 对消费者分组中消费者的变化注册监听

每个消费者都需要关注所属消费者分组中,消费者服务器的变化情况,即对/consumers/[group_id]/ids节点注册子节点变化的Watcher监听。一旦发现消费者新增或减少,就会触发消费者的负载均衡。

(3) 对Broker服务器的变化注册监听

Broker服务器列表发生变化,判断是否需要负载均衡

(4) 消费者负载均衡

如果组内的消费者服务器或Broker服务器发生变化,会触发消费者负载均衡。

小结

Kafka从设计之初就是一个大规模的分布式中间件,其服务端存在多个Broker,同时为了达到负载均衡,将每个Topic的消息分成了多个分区,并分布在不同的Broker上,多个生产者和消费者可以同时发送和接收消息。Kafka使用Zookeeper作为其分布式协调框架,很好的将消息生产、消息存储和消息消费的过程有机地结合起来。同时,借助Zookeeper,Kafka能够在保持包括生产者、消费者和Broker在内的所有组件无状态的情况下,建立起生产者和消费者的负载均衡。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/984235
推荐阅读
相关标签
  

闽ICP备14008679号