189 8069 5689

zookeeper在项目中的实际应用-创新互联

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

创新互联是专业的万安网站建设公司,万安接单;提供成都网站制作、成都做网站、外贸营销网站建设,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行万安网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!

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的节点数据改变时,从这个节点获取总服务器的网络地址数据,并改变当前的总服务器的网络地址。

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


网站名称:zookeeper在项目中的实际应用-创新互联
转载来源:http://cdxtjz.cn/article/cdheio.html

其他资讯