千家信息网

zookeeper 在项目中的实际应用

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,ZooKeeper所提供的服务主要是通过:数据结构Node+原语+watcher机制ZooKeeper是一个分布式小文件系统,通过选举算法和集群复制可以避免单点故障,由于是文件系统,所以即使所有的Zo
千家信息网最后更新 2026年11月02日zookeeper 在项目中的实际应用

ZooKeeper所提供的服务主要是通过:数据结构Node+原语+watcher机制


ZooKeeper是一个分布式小文件系统,通过选举算法和集群复制可以避免单点故障,

由于是文件系统,所以即使所有的ZooKeeper节点全部挂掉,数据也不会丢失,

重启服务器之后,数据即可恢复。


ZooKeeper所实现的一切功能,都是由ZK节点的性质和该节点所关联的数据实现的,

至于关联什么数据那就要看你干什么事了

① 集群管理:利用临时节点特性,节点关联的是机器的主机名、IP地址等相关信息,集群单点故障也属于该范畴。

② 统一命名:主要利用节点的唯一性和目录节点树结构。

③ 配置管理:节点关联的是配置信息。

④ 分布式锁:节点关联的是要竞争的资源。



以下为项目中的实际应用


1.利用watcher机制:

vqsapi 往6个接口发数据的时候,可以用zookeeper来监控目前存活的mongodb与api,

vqsapi 动态获取,往mongodb与api都存活的接口发数据


2.利用临时节点的特性

运维接口探测,可以每个服务器在zookeeper注册一个临时节点,当接口挂了时候,

session断开,达到监控的目的


3.利用节点唯一性的特性

分布式锁,同时操作同一资源,可能出现并发问题时候,上一把锁

因为原生的zookeeper 语句比较繁琐,难以理解,所以curator 框架很好的实现了,下面为加锁操作


String path = String.format(LockPathScheme.STRATEGY_MODEL_ROUTE, modelId, isp,province,value);                  //加锁操作       CuratorFramework curator = CuratorFrameworkFactory.builder().retryPolicy(new ExponentialBackoffRetry(10000, 3)).connectString(zookeeperserver).build();       curator.start();       InterProcessMutex lock = new InterProcessMutex(curator, path);       try {               boolean b = lock.acquire(3, TimeUnit.SECONDS);               if (!b) {                       resultMap.put("statusCode", 300);              resultMap.put("message", "记录正在被操作!");              return resultMap;           }           //加锁后,该干嘛干嘛了                resultMap = this.strategyRoute_dnspod_save_detail(request, id, modelId, modelName, category, province, isp, containCname, type, remark, node, value, ttl, weight, status,customerViewId);               return resultMap;                      }catch(Exception e){                       e.printStackTrace();                       resultMap.put("statusCode", 300);                   resultMap.put("message", "内部错误!");                   return resultMap;       }finally {                 //记得一定要释放锁               try{               lock.release();           }catch (Exception e){               System.out.println(path + "释放锁失败" + e);           }            CloseableUtils.closeQuietly(curator);       }




最后上一个非常完美的例子,很好的使用了zookeeper 框架的各种特性

转自 http://www.cnblogs.com/wuxl360/p/5817549.html


假设我们的集群有:


(1) 20个搜索引擎的服务器:每个负责总索引中的一部分的搜索任务。


① 搜索引擎的服务器中的15个服务器现在提供搜索服务。


② 5个服务器正在生成索引。


这20个搜索引擎的服务器,经常要让正在提供搜索服务的服务器停止提供服务开始生成索引,或生成索引的服务器已经把索引生成完成可以搜索提供服务了。


(2) 一个总服务器:负责向这20个搜索引擎的服务器发出搜索请求并合并结果集。


(3) 一个备用的总服务器:负责当总服务器宕机时替换总服务器。


(4) 一个web的cgi:向总服务器发出搜索请求。


使用Zookeeper可以保证:


(1) 总服务器:自动感知有多少提供搜索引擎的服务器,并向这些服务器发出搜索请求。


(2) 备用的总服务器:宕机时自动启用备用的总服务器。


(3) web的cgi:能够自动地获知总服务器的网络地址变化。


(4) 实现如下:


① 提供搜索引擎的服务器都在Zookeeper中创建znode,zk.create("/search/nodes/node1", "hostname".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateFlags.EPHEMERAL);


② 总服务器可以从Zookeeper中获取一个znode的子节点的列表,zk.getChildren("/search/nodes", true);


③ 总服务器遍历这些子节点,并获取子节点的数据生成提供搜索引擎的服务器列表;


④ 当总服务器接收到子节点改变的事件信息,重新返回第二步;


⑤ 总服务器在Zookeeper中创建节点,zk.create("/search/master", "hostname".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateFlags.EPHEMERAL);


⑥ 备用的总服务器监控Zookeeper中的"/search/master"节点。当这个znode的节点数据改变时,把自己启动变成总服务器,并把自己的网络地址数据放进这个节点。


⑦ web的cgi从Zookeeper中"/search/master"节点获取总服务器的网络地址数据,并向其发送搜索请求。


⑧ web的cgi监控Zookeeper中的"/search/master"节点,当这个znode的节点数据改变时,从这个节点获取总服务器的网络地址数据,并改变当前的总服务器的网络地址。


服务 服务器 节点 搜索 数据 引擎 搜索引擎 地址 索引 网络 关联 生成 接口 特性 集群 备用 监控 信息 分布式 时候 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 深圳九邦互联网科技有限公司 互联网科技资迅 互联网科技未来 善班互联网科技 深圳艾佳互联网科技 互联网金融科技委员会 重庆科技学院互联网 中正互联网科技招聘 互联网科技中介 河南猎农互联网科技有限公司 黑科技闪耀互联网之光 洛阳昕诺飞互联网科技有限公司 互联网科技人工智能实验室 华中科技大学互联网的牛人 众安科技工业互联网合作 电子商务与互联网科技的关系 云南省自由互联网科技有限公司 2021世界互联网领先科技成果发布 北京互联网科技类企业分布 平安好医生打造互联网科技医疗 智网互联网科技 金融科技和互联网金融 哈尔滨新华互联网科技 广州优美互联网科技 重庆威客帮互联网科技 徐州市互联网科技有限公司 华中科技大学互联网的牛人 领航科技大厦互联网公司 有人说阿里系是互联网科技企业 瑞安市蟠桃会互联网科技有限公司
0