Zookeeper基本原理

news2024/9/21 19:54:13

1.什么是Zookeeper?

        Zookeeper是一个开源的分布式协调服务器框架,由Apache软件基金会开发,专为分布式系统设计。它主要用于在分布式环境中管理和协调多个节点之间的配置信息、状态数据和元数据。

        Zookeeper采用了观察者模式的设计理念,其核心职责是存储和管理集群中共享的数据,并为各个节点提供一致的数据视图。在Zookeeper中,客户端(如分布式系统的各个节点)可以注册为“观察者”当这些共享数据发送变化时,Zookeeper会及时通知所有已经注册的观察者,从而使她们能够作出相应的反应或调整。

        Zookeeper时一个集中化的服务,用于在分布式系统中实现协调、配置管理、分布式锁、集群管理等功能,确保数据的一致性和可靠性。通过使用Zookeeper,分布式系统中的各个组件能够以一种有序,可控的方式协同工作,从而提高系统的整体稳定性和可用性。

2.zookeeper在分布系统中的角色是? 

2.1. 统一命名服务

        Zookeeper的统一命名服务类似于域名解析系统。如图所示,假设一个客户端(Client1)需要访问百度,它不直接使用某个特定的IP地址(因为一个服务可能对应多个ip地址,而且这些ip地址可能都是动态变化)。相反,Zookeeper可以通过一个逻辑名称(如www.baidu.com)来统一管理这些ip地址,并将她们映射到实际的服务器节点上。

大致流程:

        所有的服务(如百度的多个服务器节点)都会在 Zookeeper 上进行注册。这些服务在注册时会在 Zookeeper 的一个特定目录节点(如/service/www.baidu.com)下创建相应的子节点,并将其 IP 地址(如192.168.30.11、192.168.30.12等)作为子节点的数据存储在zookeeper中。Zookeeper会将所有注册的服务信息存储在统一的命名空间中。

        当一个客户端(Client1)需要访问百度时,它不会直接请求具体的 IP 地址。相反,客户端先向 Zookeeper 查询 www.baidu.com 的节点信息。

        Zookeeper 会将与 www.baidu.com 关联的所有 IP 地址(例如 192.168.30.11192.168.30.12192.168.30.13)作为一个列表返回给客户端。客户端从返回的列表中可以选择一个可用的 IP 地址来访问。

        客户端使用从 Zookeeper 获取的 IP 地址列表,随机选择一个或按某种策略选择一个合适的 IP 地址,建立实际的连接请求。这允许客户端访问百度的服务而不必关心底层的实际 IP 地址。

        如果百度的某个服务器节点发生变化(例如新增或删除某个 IP 地址),Zookeeper 会自动更新它的命名服务节点。客户端每次请求时,都会得到一个最新的可用 IP 地址列表,从而实现负载均衡和高可用性。

2.2.统一配置管理

        在分布式系统(如Kafka、HDFS等)中,所有节点通常需要保持相同或兼容的配置,以确保系统的稳定运行。然而,如果需要手动逐一更新每个节点的配置文件,这将非常麻烦且容易出错。为了解决这个问题,我们可用使用Zookeeper的统一配置管理服务。

大致流程:

        在分布式集群中,首先你需要将想要同步的配置文件上传到zookeeper的特定节点(如图中/Configuration)。这个节点将作为统一的配置存储位置,保存最新版本的配置文件内容。

        集群中的每个服务器(客户端)会连接到Zookeeper,并向该配置节点(如/Configuration)注册一个Watch(监听器)。当客户端注册成功后,Zookeeper会将当前配置节点的状态返回给客户端,以确保客户端获取到最新的配置文件。

        所有注册的客户端持续监控Zookeeper中配置节点的变化。一旦配置文件在Zookeeper中被修改,所有监听该节点的客户端都会收到Zookeeper发送的通知。

        Zookeeper在检测到配置节点发送变化时,会立即通知所有注册的客户端。客户端接收到通知后,会立刻知道配置文件已发生更改,准备进行更新操作。客户端接收到通知后,会立刻知道配置文件已发生更改,准备进行更新操作。

        每个客户端在收到通知后,主动向Zookeeper请求最新的配置数据(Config Data),并下载该数据。客户端将从 Zookeeper 获取的最新配置数据应用到本地。

        客户端使用从 Zookeeper 下载的新配置数据,更新本地的配置文件。完成配置更新后,客户端可以选择重新加载或重启服务以使新的配置生效。

        通过这种方式,所有客户端都能够保持与 Zookeeper 中配置文件的一致性,从而确保整个分布式集群中的配置文件同步一致。

2.3.统一集群管理

        Zookeeper的统一集群管理通过在节点下为每个客户端创建对应的子节点来监控和管理客户端的状态。这使得分布式集群中的客户端可以实时了解其他客户端的状态,确保系统的高可用性和可靠性。Zookeeper 通过统一管理这些节点,简化了分布式集群的管理和维护工作。

大致流程:

        每个客户端(Client1,Client2等)在启动时,会向Zookeeper注册自身的信息。Zookeeper注册自身的信息。Zookeeper 会在指定的节点路径下(如/GroupManager)为每个客户端创建一个子节点(如/GroupManager/client1)这些节点表示每个客户端的存在。

        每个客户端节点(如 /client1)不仅表示客户端的存在,还可以存储关于客户端的状态信息(如是否在线、负载情况等)。Zookeeper 可以通过这些节点持续监控每个客户端的状态。

        一旦客户端注册成功,Zookeeper 将持续监控这些客户端节点的状态。如果某个客户端的状态发生变化,例如下线或失效,Zookeeper 会更新节点信息,并通知其他相关的客户端。

        其他客户端(如 Client2)可以通过 Zookeeper 访问这些节点,获取关于目标客户端的最新状态信息。客户端通过读取 Zookeeper 中的这些节点,能够判断目标客户端的当前状态,从而决定是否发起进一步的操作或访问。

        当 Zookeeper 监测到某个客户端的状态发生变化时,会通知所有注册的其他客户端,告知其目标客户端状态的变化。客户端在收到通知后,可以立即采取相应措施,例如重新选择一个可用的客户端进行交互。

2.4.服务器动态上下线

大致流程:

        当服务器1、服务器2、服务器3启动时,它们会向Zookeeper集群注册信息(如节点数),并在Zookeeper的特殊节点下创建相应的目录节点(临时节点)。这些节点用于记录各个服务器的状态和当前在线情况。

        客户端(Client1、Client2)可以从Zookeeper集群中获取当前在线的服务器列表,并通过监听机制监控这些服务器节点的状态。当客户端注册监听器后,Zookeeper会实时更新客户端关于服务器上下线的动态。

        当服务器1下线时,Zookeeper会自动删除其在集群中的临时节点(对应服务器1的信息消失)。因为Zookeeper支持分布式的强一致性,因此这个删除操作会立即通知到所有注册监听该节点的客户端。

        收到通知的客户端(Client1、Client2)会了解到服务器1已下线,无法再向服务器1发送请求,并可以选择重新分配请求到其他在线的服务器(服务器2或服务器3)。

2.5.软负载均衡

大致流程:

        各个服务器在启动时会向Zookeeper注册自己,Zookeeper在/service节点下为每个服务器创建一个子节点,这些子节点存储每台服务器的访问信息。例如,图片中服务器192.168.30.11注册在Zookeeper中,并记录了其访问次数。

        当客户端(如Client1)需要访问某个服务时,它首先会查询Zookeeper中的/service节点,获取所有已注册服务器的列表和相关信息(如访问次数、服务器IP等)

        Zookeeper并不直接进行硬件级的负载均衡,而是基于软负载均衡策略。Zookeeper可以将各个服务器的负载信息(如访问次数等)提供给客户端。客户端根据这些信息,选择负载较小的服务器进行访问。例如,当客户端发现192.168.30.11和其他服务器的负载较高时,它可以选择负载相对较低的服务器,如192.168.30.13

        Zookeeper在服务节点的上下线或负载变化时会通知客户端,这使得客户端可以动态地调整访问目标服务器,避免过载。

3.集群模式(Leader-Follower模型)

3.1.第一次启动

        Zookeeper 集群中的每个服务器都有一个唯一的 myid(节点 ID),用来区分不同的节点。集群中的所有节点按顺序启动,每个节点都参与 Leader 选举。当服务器启动时,会进行一次Leader 选举。这次选举的目的是确定谁将成为集群的 Leader,负责处理所有的写操作和同步管理。选举过程中,节点会根据 myid 等投票规则来进行投票。(在选取中会遵循过半原则:在选举过程中,集群必须有超过半数的节点投票给同一个候选者,才会确认 Leader。因此,当启动到第三台服务器时(如图中的 server3),由于它得到了集群中过半节点的投票(3票中的2票或更多),server3 会成为集群的 Leader。)

        当 server4server5 启动时,它们虽然 myid 更大,但由于 Leader 选举已经完成,并且 Zookeeper 只会在 Leader 出现故障时重新触发选举,因此即便 server4server5 启动,它们仍然会作为 Follower 加入集群,不会改变已有的 Leader(即 server3)。

        如果 Leader(如 server3)发生故障或者下线,Zookeeper 会触发新的选举。此时,剩余的服务器将参与重新选举,新的 Leader 将根据当时在线的节点重新选出。在这种情况下,后启动的 server4server5 有可能成为新的 Leader,具体取决于选举结果。

        每次写操作都会由 Leader 处理,并为其分配一个唯一的事务 ID(zxid)。该 zxid 包含了时间戳和事务计数,用于确保集群内的操作顺序和一致性。所有的 Follower 节点都会遵循 Leader 的指令,确保数据的一致性。

3.2.非第一次启动

        Zookeeper 集群仍然是由上面 5 台服务器组成,当前 server3 是 Leader。当 server3Leader)和 server5 同时挂掉时,集群剩下的 server1server2server4 将会重新进行 Leader 选举。如下是 server1server2server4 具体的信息:

epochzxidsid
server111
server2182
server3174

        选举leader规则优先级如下:epoch>zxid>sid。所以server2被选为leader。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2113812.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

kaggle竞赛宝典 | Mamba模型综述!

本文来源公众号“kaggle竞赛宝典”,仅用于学术分享,侵权删,干货满满。 原文链接:Mamba模型综述! 型语言模型(LLMs),成为深度学习的基石。尽管取得了令人瞩目的成就,Tra…

物联网之PWM呼吸灯、脉冲、LEDC

MENU 前言原理硬件电路设计软件程序设计analogWrite()函数实现呼吸灯效果LEDC输出PWM信号 前言 学习制作呼吸灯,通过LED灯的亮度变化来验证PWM不同电压的输出。呼吸灯是指灯光在单片机的控制之下完成由亮到暗的逐渐变化,感觉好像是人在呼吸。 原理 脉冲宽…

【Unity小技巧】URP管线遮挡高亮效果

前言 在URP渲染管线环境下实现物体遮挡高亮显示效果,效果如下:Unity URP遮挡高亮 实现步骤 创建层级,为需要显示高亮效果的物体添加层级,比如Player 创建一个材质球,也就是高亮效果显示的材质球找到Universal Render…

固态硬盘装系统有必要分区吗?

前言 现在的新电脑有哪一台是不使用固态硬盘的呢?这个好像很少很少了…… 有个朋友买了一台新的笔记本电脑,开机之后,电脑只有一个分区(系统C盘500GB)。这时候她想要给笔记本分区…… 这个真的有必要分区吗&#xf…

springboot流浪天使乐园管理系统

基于springbootvue实现的流浪天使乐园管理系统(源码L文ppt)4-039 第4章 系统设计 4.1 总体功能设计 一般个人用户和管理者都需要登录才能进入流浪天使乐园管理系统,使用者登录时会在后台判断使用的权限类型,包括一般使用者…

【VUE】Vue 组件详解

📝个人主页🌹:个人主页 ⏩收录专栏⏪:VUE 🌹🌹期待您的关注 🌹🌹,让我们共同进步! 文章目录 一、Vue 组件的基础概念1.1 什么是组件?1.2 组件的作…

Unity教程(十五)敌人战斗状态的实现

Unity开发2D类银河恶魔城游戏学习笔记 Unity教程(零)Unity和VS的使用相关内容 Unity教程(一)开始学习状态机 Unity教程(二)角色移动的实现 Unity教程(三)角色跳跃的实现 Unity教程&…

u盘显示需要格式化才能用预警下的数据拯救恢复指南

U盘困境:需要格式化的紧急应对 在数字信息爆炸的时代,U盘作为便携的数据存储介质,承载着我们工作、学习乃至生活中的大量重要资料。然而,当U盘突然弹出“需要格式化才能用”的提示时,这份便捷瞬间转化为焦虑与不安。这…

MiniCPM-V: A GPT-4V Level MLLM on Your Phone

MiniCPM-V: A GPT-4V Level MLLM on Your Phone 研究背景和动机 现有的MLLM通常需要大量的参数和计算资源,限制了其在实际应用中的范围。大部分MLLM需要部署在高性能云服务器上,这种高成本和高能耗的特点,阻碍了其在移动设备、离线和隐私保…

通信工程学习:什么是AM标准调幅

AM标准调幅 AM标准调幅,即Amplitude Modulation(振幅调制),是一种在电子通信中广泛使用的调制方法,特别是在无线电载波传输信息方面。以下是关于AM标准调幅的详细解释: 一、AM标准调幅的定义与原理 AM标准…

机器视觉硬件选型根据某项目相机镜头

一 项目总需求 1、大视野检测需求: (1)大视野: ①产品尺寸15.6寸屏幕,产品大小:350mm x 225mm; ②产品料盘尺寸大小:565mm x 425mm; ③工作距离:880mm;检测精度:500μm&#xff…

如何使用 ef core 的 code first(fluent api)模式实现自定义类型转换器?

如何使用 ef core 的 code first 模式实现自定义类型转换器 前言 1. 项目结构2. 实现步骤2.1 定义转换器2.1.1 DateTime 转换器2.1.2 JsonDocument 转换器 2.2 创建实体类并配置数据结构类型2.3 定义 Utility 工具类2.4 配置 DbContext2.4.1 使用 EF Core 配置 DbContext 的两种…

浅谈人工智能之基于AutoGen Studio+Ollama本地大模型构建AI Agent

浅谈人工智能之基于AutoGen Studio+Ollama本地大模型构建AI Agent 摘要 随着人工智能技术的飞速发展,大型语言模型已成为推动创新应用的关键力量。然而,云服务的使用虽然便捷,但面临着数据安全、延迟及成本等挑战。为解决这些问题,越来越多的开发者选择在本地部署大模型。…

python学习11-Pytorch张量与数据处理1

ndarray 首先,我们介绍n维数组,也称为张量(tensor)。 使用过Python中NumPy计算包的读者会对本部分很熟悉。 无论使用哪个深度学习框架,它的张量类(在MXNet中为ndarray, 在PyTorch和TensorFlow中…

数据集 CrowdPose 多人姿态估计 深度学习 >> DataBall

数据集 CrowdPose 多人姿态估计 深度学习 CrowdPose 数据集 这是一个用于探讨在拥挤场景中的多人姿态估计的图像数据集。该数据集包括 2 万张图像和标注有 14 个关键点的 8 万个人体姿势,其中测试集包括 8,000 张图像。 article{li2018crowdpose, title{CrowdPose…

mysql-PXC实现高可用

mysql8.0使用PXC实现高可用 什么是 PXC PXC 是一套 MySQL 高可用集群解决方案,与传统的基于主从复制模式的集群架构相比 PXC 最突出特点就是解决了诟病已久的数据复制延迟问题,基本上可以达到实时同步。而且节点与节点之间,他们相互的关系是…

数据预处理与协同过滤推荐算法——从数据清洗到个性化电影推荐

推荐系统在现代应用中占据了重要地位,尤其在电影、音乐等个性化内容推荐中广泛使用。本文将介绍如何使用数据预处理、特征工程以及多种推荐算法(包括协同过滤、基于内容的推荐、混合推荐等)来实现电影推荐系统。通过Pandas、Scikit-learn、Te…

研1日记5

x torch.tensor(x),numpy 转tensor 三维矩阵相加 screen -S pid 进入之前创建好的screen transpose()只能一次操作两个维度;permute()可以一次操作多维数据,且必须传入所有维度数, transpose()中的dim没有数的大小区分;permut…

Redis 分布式锁:线程安全在分布式环境中的解决方案

Redis 分布式锁:线程安全在分布式环境中的解决方案 一 . 分布式锁二 . 分布式锁的实现策略2.1 引入 setnx2.2 引入过期时间2.3 引入校验 ID2.4 引入 lua 脚本2.5 引入看门狗2.6 引入 redlock 算法 Hello , 大家好 , 这个专栏给大家带来的是 Redis 系列 ! 本篇文章给…

Flutter 中的低功耗蓝牙概述

随着智能设备数量的增加,控制这些设备的需求也在增加。对于多种使用情况,期望设备在需要进行控制的同时连接到互联网会受到很大限制,因此是不可行的。在这些情况下,使用低功耗蓝牙(也称为 Bluetooth LE 或 BLE&#xf…