zookeeper 在项目中的实际应用

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介:

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


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

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

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


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

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

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

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

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

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



以下为项目中的实际应用


1.利用watcher机制

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

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


2.利用临时节点的特性

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

session断开,达到监控的目的


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

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

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


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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的节点数据改变时,从这个节点获取总服务器的网络地址数据,并改变当前的总服务器的网络地址。






      本文转自布拉君君 51CTO博客,原文链接:http://blog.51cto.com/5148737/1972492,如需转载请自行联系原作者



相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
29天前
|
人工智能 Serverless 测试技术
nacos常见问题之Serverless 应用引擎2.0不支持 MSE nacos如何解决
Nacos是阿里云开源的服务发现和配置管理平台,用于构建动态微服务应用架构;本汇总针对Nacos在实际应用中用户常遇到的问题进行了归纳和解答,旨在帮助开发者和运维人员高效解决使用Nacos时的各类疑难杂症。
23 0
|
1月前
|
消息中间件 分布式计算 负载均衡
ZooKeeper应用案例
【2月更文挑战第24天】
|
6月前
|
分布式计算 Java Hadoop
05分布式电商项目 - 注册中心 Zookeeper
05分布式电商项目 - 注册中心 Zookeeper
47 0
|
29天前
|
消息中间件 Cloud Native 网络安全
云原生最佳实践系列 3:基于 SpringCloud 应用玩转 MSE
该文档介绍了基于云原生应用的产品构建的微服务架构实践。
|
1月前
|
存储 负载均衡 Java
ZooKeeper 项目
ZooKeeper是一个分布式开源协调服务,主要用于分布式应用的协调和管理。【2月更文挑战第17天】
74 10
|
3月前
|
消息中间件 存储 Java
ZooKeeper 在 Kafka 中的应用
ZooKeeper 在 Kafka 中的应用
63 0
|
5月前
|
微服务
微服务轮子项目(39) -Zookeeper集群搭建
微服务轮子项目(39) -Zookeeper集群搭建
28 0
|
5月前
|
监控 Dubbo 应用服务中间件
启动Dubbo项目注册Zookeeper时提示zookeeper not connected异常原理解析
启动Dubbo项目注册Zookeeper时提示zookeeper not connected异常原理解析
241 0
|
6月前
|
存储 缓存 Java
详解Zookeeper(铲屎官)在众多中间件的应用和在Spring Boot业务系统中实现分布式锁和注册中心解决方案
`ZooKeeper `是一个**开放源码的分布式协调服务**,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终,将简单易用的接口和性能高效、功能稳定的系统提供给用户。 分布式应用程序可以基于` Zookeeper` 实现诸如**数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列**等功能。
22526 11
详解Zookeeper(铲屎官)在众多中间件的应用和在Spring Boot业务系统中实现分布式锁和注册中心解决方案
|
6月前
|
负载均衡 Java Nacos
Spring Boot项目可以与MSE微服务引擎中的Nacos进行集成
Spring Boot项目可以与MSE微服务引擎中的Nacos进行集成
78 1