对于Zookeeper的一些理解

简介: 该文档介绍了如何使用ZooKeeper实现统一配置、命名服务和分布式锁以及集群管理。首先,为了解决多个系统重复配置的问题,提出了抽取公共配置到`common.yml`并存储在ZooKeeper中的方法,系统通过监听ZNode变化实时更新配置。接着,详细说明了配置管理的实现步骤,包括在服务器端将配置同步到ZooKeeper,以及客户端监听配置变更。此外,还解释了命名服务如何根据名称获取服务地址,并以域名访问为例进行了说明。最后,讨论了ZooKeeper实现的两种分布式锁策略,并阐述了其在集群管理中的应用,如检测节点状态变化和选举Master节点。

实现统一配置

实现思路

  • 比如我们现在有三个系统A、B、C,他们有三份配置,分别是ASystem.yml、BSystem.yml、CSystem.yml,然后,这三份配置又非常类似,很多的配置项几乎都一样。
  • 此时,如果我们要改变其中一份配置项的信息,很可能其他两份都要改。并且,改变了配置项的信息很可能就要重启系统。于是,我们希望把ASystem.yml、BSystem.yml、CSystem.yml相同的配置项抽取出来成一份公用的配置common.yml,并且即便common.yml改了,也不需要系统A、B、C重启。

实现方法

我们可以将common.yml这份配置放在ZooKeeper的Znode节点中,系统A、B、C监听着这个Znode节点有无变更,如果变更了,及时响应。

实现步骤

配置管理中心实现:

  1. 导入zkClient对应的jar。
  2. 实现工具类方法,完成从数据库加载配置、将配置文件保存到数据库、配置文件同步到zookeeper。
/**
   * 配置文件同步到zookeeper
   */
  public void syncConfigToZk(){
    ZkClient zk = new ZkClient("localhost:2181");
    if(!zk.exists("/zkConfig")){
      zk.createPersistent("/zkConfig",true);
    }
    zk.writeData("/zkConfig", config);
    zk.close();
  }
  1. 具体的代码是实现,将上面的1、2进行代码实现。运行就可以实现同步配置信息到zookeeper了,

客户端实现:

  1. 监听zookeeper中zkConfig对应的zoNode节点。
private Config config;
  public Config getConfig() {
    ZkClient zk = new ZkClient("localhost:2181");
    config = (Config)zk.readData("/zkConfig");
    System.out.println("加载到配置:"+config.toString());
    
    //监听配置文件修改
    zk.subscribeDataChanges("/zkConfig", new IZkDataListener(){
      @Override
      public void handleDataChange(String arg0, Object arg1)
          throws Exception {
        config = (Config) arg1;
        System.out.println("监听到配置文件被修改:"+config.toString());
      }
 
      @Override
      public void handleDataDeleted(String arg0) throws Exception {
        config = null;
        System.out.println("监听到配置文件被删除");
      }
      
    });
    return config;
  }

统一命名服务

命名服务功能主要是根据指定名字来获取资源或服务的地址、提供者信息,利用zookeeper我们可以创建唯一标识路径,这个路径可以作为一个名字,指定集群中的集群,提供的服务的地址或者一个远程对象。这个路径就好比是一个仓库,这个仓库的地址是唯一的,这些仓库里面存了一些东西,当我们来到这个仓库,我们就能取到仓库里的东西。

比如说,现在我有一个域名www.liancan.com,而这个域名下有多台机器:

192.168.0.91

192.168.0.93

192.168.0.94

192.168.0.95

通过访问 www.liancan.com 就可以访问到我的机器,而不是通过 IP 去访问,如下图所示:

分布式锁

实现分布式锁有两种,一种是保持独占,一种是控制时序。

  1. 第一种方式
  1. 我们将zookeeper上的节点看成一把锁,通过createznode的方式来实现,所有客户端都去创建/distribute_lock节点,最终成功创建的那个客户端就拥有了这把锁。用完删掉自己创建的节点就释放锁。
  2. 缺点:
  1. 注意:不适用于客户端数量很大的情况,当一个客户端拥有第一把锁之后,所有的客户端都要去监听节点,节点的释放也会通知所有的客户端,这样会出现羊群效应。
  1. 第二种方式
  1. 假设/distribute_lock已经预先存在,所有的客户端都在它下面创建临时顺序编号目录节点,编号最小的获取锁
  2. 没有获取到锁的客户端就监听编号比自己小的前一个节点,因为节点是有顺序的,很容易找到自己创建的前一个节点。
  3. 当监听到前一个节点删除节点,即释放锁,该客户端就会获得锁。
  4. 这样避免所有的客户端只需要监听一个节点和节点删除需要通知所有客户端的情况。
  5. 实现思路:
  1. 客户端 A 拿到 /distribute_lock 节点下的所有子节点,经过比较,发现自己(id_001),是所有子节点最小的。所以得到锁。
  2. 客户端 B 拿到 /distribute_lock 节点下的所有子节点,经过比较,发现自己(id_002),不是所有子节点最小的。所以监听比自己小的节点 id_001 的状态。
  3. 客户端 C 拿到 /distribute_lock 节点下的所有子节点,经过比较,发现自己(id_003),不是所有子节点最小的。所以监听比自己小的节点 id_002 的状态。
  4. 等到客户端 A 执行完操作以后,将自己创建的节点 id_001 删除。通过监听,客户端 B 发现 id_001 节点已经删除了,发现自己已经是最小的节点了,于是顺利拿到锁。

集群管理

在分布式环境中,掌握集群中每个节点的状态,zookeeper做集群管理可以实现检测是否有机器加入或退出,还可以用来选举集群的master。

只要客户端 A 挂了,那/GroupMember/A这个节点就会删除,通过监听 GroupMember 下的子节点,客户端 B 和客户端 C 就能够感知到客户端 A 已经挂了(新增也是同理)

相关文章
|
存储 索引
数据结构各结构特点(数组、链表、栈、队列、树)(上)
数据结构各结构特点(数组、链表、栈、队列、树)
672 0
|
5月前
|
人工智能 Linux API
一人=一个团队:阿里云/本地OpenClaw保姆级零基础部署+免费Coding Plan API /Skill配置,告别重复劳动!
2026年,AI工具的进化已从“能说会道”迈入“落地干活”的新阶段,而OpenClaw(昵称“龙虾”)的爆火,正是这一趋势的核心标志。它既不是传统的对话式AI(如ChatGPT、豆包),也不是单一功能的AI Agent,而是更像一个7×24小时待命的“AI包工头”——你只需下达一个目标指令,它就会自动拆解任务、调用工具、协调流程,最终直接交付成果,彻底摆脱“逐个对接工具、手动监督环节”的低效模式。
804 2
|
5月前
|
缓存 NoSQL Java
高并发系统性能优化全链路实战:端到端榨干系统性能,百万 QPS 零卡顿
本文系统阐述高并发系统端到端全链路性能优化方法,涵盖接入层(HTTP/3、CDN、LVS)、网关层(Spring Cloud Gateway调优)、服务层(JDK21虚拟线程、线程池、Undertow、Protobuf)、缓存层(多级缓存、Caffeine、Redis)、数据库(索引/SQL/事务/连接池)及OS硬件层优化,并强调压测定位、避坑指南与闭环迭代。
918 3
|
8月前
|
存储 人工智能 BI
玄晶引擎AI手机双轨实践:基于阿里云生态的B/C端技术复用与落地
玄晶引擎依托阿里云,构建“云-边-端”协同架构,通过PAI、RPA等服务实现B端企业应用与C端个人助手的技术复用,形成“一套底座、双轨落地”的AI手机新范式,助力开发者高效降本、快速规模化。
670 12
|
Python
使用OpenPyXL库实现Excel单元格其他对齐方式设置
本文介绍了如何使用Python的`openpyxl`库设置Excel单元格中的文本对齐方式,包括文本旋转、换行、自动调整大小和缩进等,通过具体示例代码展示了每种对齐方式的应用方法,适合需要频繁操作Excel文件的用户学习参考。
919 85
使用OpenPyXL库实现Excel单元格其他对齐方式设置
|
11月前
|
算法 开发者 Python
2025年高教社杯B题——碳化硅外延层厚度的确定全国大学生数学建模(思路、代码、论文)
2025年高教社杯B题——碳化硅外延层厚度的确定全国大学生数学建模(思路、代码、论文)
712 0
|
11月前
|
存储 缓存 算法
硬盘性能提升100倍的秘密:看懂顺序I/O的魔力
本文介绍了I/O缓存的核心原理与实现机制,涵盖局部性原理、Page Cache工作机制及其写回策略,以及顺序I/O的性能优势。通过理解时间与空间局部性如何提升缓存效率,Page Cache如何利用内存优化磁盘I/O,以及顺序I/O相比随机I/O在不同存储介质上的性能差异,帮助读者深入理解系统I/O优化的关键技术。
330 0
|
Java 中间件 调度
【源码】【Java并发】从InheritableThreadLocal和TTL源码的角度来看父子线程传递
本文涉及InheritableThreadLocal和TTL,从源码的角度,分别分析它们是怎么实现父子线程传递的。建议先了解ThreadLocal。
592 4
【源码】【Java并发】从InheritableThreadLocal和TTL源码的角度来看父子线程传递
|
存储 Linux Shell
⭐⭐⭐【Shell 命令集合 磁盘管理 】Linux 挂载文件系统 mount使用教程
⭐⭐⭐【Shell 命令集合 磁盘管理 】Linux 挂载文件系统 mount使用教程
1180 0
|
机器学习/深度学习 人工智能 搜索推荐
底层技术大揭秘!AI智能导购如何重塑购物体验
双十一期间,淘宝内测AI助手“淘宝问问”,基于阿里通义大模型,旨在提升用户在淘宝上的商品搜索和推荐效率。该助手通过品牌推荐、兴趣商品推荐和关联问题三大板块,提供个性化购物体验。其背后采用多智能体架构,包括规划助理和商品导购助理,通过对话历史和用户输入,实现精准商品推荐。此外,文章还介绍了如何快速部署此解决方案,并探讨了其对现代购物体验的影响。