分布式协同是分布式应用中不可缺少的,通常担任协调者的角色,或者说是将多机协同的职责从分布式应用中独立出来,以减少系统的耦合性和增强扩充性。Apache的Zookeeper, google的Chubby都是分布式协同的实现者。fourinone实际上可以单独当做Zookeeper用,它使用最少的代码实现了Zookeeper的所有功能,并且力图做到功能更强但是使用更简洁。

分布式协同是分布式运用中不行短少的,一般担任和谐者的人物,或许说是将多机协同的责任从分布式运用中独立出来,以削减体系的耦合性和增强扩充性。Apache的Zookeeper, google的Chubby都是分布式协同的完结者。fourinone实际上能够独自作为Zookeeper用,它运用最少的代码完结了Zookeeper的一切功用,而且力求做到功用更强可是运用更简练。

一、完结原理

fourinone对分布式协同的完结, 是经过树立一个domain,node两层结构的节点信息去完结,domain能够是分类或许包,node能够是具体特点,domain和node都是自己依据需求规划命名,比方能够将domain命名为“a.b.c...”表明一个树型类目。

一个domain下能够有很多个node,每个node只指定一个domain,能够经过domain回来它下面一切的node。

domain不需求独自树立,一般在树立node时,假如不存在domain会主动创立。

假如domain下没有node了,该domain会主动删去。

假如删去domain,该domain下面node也都会删去。

每个node下能够寄存一个值,能够是恣意目标。

一切的节点信息寄存在parkserver里,parkserver供给协同者的功用。如下图所示:

fourinone分布式和谐规划解析  分布式 云计算 分布式协同 第1张

从上图能够看到,其他分布式进程能够经过parkserver的用户接口ParkLocal,对节点进行增加、修正、删去、指定心跳、指定权限等操作,而且结合parkserver供给同步备份、领导者推举、过期时刻设置等功用,共同来完结很多分布式协同功用,比方:

1、分布式装备,多个机器的运用共用一个装备信息,而且挂掉能够领导者推举,具体见指南和demo

2、分布式锁,多个机器竞赛一个锁,当某个机器开释锁或许挂掉,其他机器能够竞赛到锁继续,具体见指南和demo

3、集群办理,集群内机器能够相互感知和领导者推举,详见指南和demo#p#

二、中心API

ParkLocal中心api阐明:

//创立node,能够依据是否需求权限和心跳特点调用不同办法

public ObjectBean create(String domain, Serializable obj);//主动创立node

public ObjectBean create(String domain, String node, Serializable obj);

public ObjectBean create(String domain, String node, Serializable obj, AuthPolicy auth);

public ObjectBean create(String domain, String node, Serializable obj, boolean heartbeat);

public ObjectBean create(String domain, String node, Serializable obj, AuthPolicy auth, boolean heartbeat);

//更新node

public ObjectBean update(String domain, String node, Serializable obj);

//获取node

public ObjectBean get(String domain, String node);

//获取最新node,需求传入旧node进行对照

public ObjectBean getLastest(String domain, String node, ObjectBean ob);

//获取最新domain

public List get(String domain);

//获取最新domain下一切node,需求传入旧的node调集对照

public List getLastest(String domain, List oblist);

//删去node

public ObjectBean delete(String domain, String node);

//强行设置domain可删去

public boolean setDeletable(String domain);

//删去domain及下一切node

public List delete(String domain);

//增加node的事情监听

public void addLastestListener(String domain, String node, ObjectBean ob, LastestListener liser);

//增加domain的事情监听

public void addLastestListener(String domain, List oblist, LastestListener liser);#p#

三、权限机制:

public ObjectBean create(String domain, String node, Serializable obj, AuthPolicy auth);

经过上面办法创立node时,能够指定一个权限参数,有只读(AuthPolicy.OP_READ)、读写(AuthPolicy.OP_READ_WRITE)、一切(AuthPolicy.OP_ALL)三种特点,默以为AuthPolicy.OP_ALL

留心:这儿的权限特点是指创立进程对其他运用进程的权限束缚,而不包括它自己。也便是对node的创立进程来说,它具有对该node和domain一切操作权限(读写删,只需它不退出或许间断)

建造现在创立了一个domain为d,node为n的节点, 关于其他运用进程来说,操作权限如下表所示:

权限\其他进程

读(get)n 写(update)n 删(delete)n 删(delete)d

AuthPolicy.OP_READ

Yes No No No

AuthPolicy.OP_READ_WRITE

Yes Yes No No

AuthPolicy.OP_ALL

Yes Yes Yes No

从上表能够发现,当创立进程指定node的权限为AuthPolicy.OP_ALL时,其他运用进程能够删去该node,可是不能删去其domain,这是为什么呢?

由于domain下一般还有其他node,它们的权限并不都是AuthPolicy.OP_ALL,比方还有一个n1的node权限为AuthPolicy.OP_READ,依照正常操作,该运用进程无法删去n1,假定它能够删去domain,那么它最终直接删去了n1,所以产生了悖论,因而,为了防止危险,一切的运用进程只能依据权限删去node,可是无法删去domain。
从上表能够发现,当创立进程指定node的权限为AuthPolicy.OP_ALL时,其他运用进程能够删去该node,可是不能删去其domain,这是为什么呢?

不过你答应承当这样的删去危险,也能够在创立进程里强行指定该domain可删去,经过在domain创立后,调用:

public boolean setDeletable(String domain);

该办法只能被domain的创立进程调用,其他运用进程没有权限调用。

强行指定可删去后,其他进程能够直接删去该domain及所含node并疏忽成果。#p#

四、相关于zookeeper的优势

Zookeeper无疑是一款成功的开源产品,并具有广泛的信赖者和运用场景,和以往相同,老外作者在apache网站上发布了一款产品,咱们的工程师马上会谦虚的学习和忠心的保卫,而国产原创的产品往往会遭到各样质疑,由于咱们的原创更多是抄袭和偷工减料,咱们的国产更多是结构集成而不是架构规划,所以这种情感上的倾向性不是一天能改动。

做产品比照和罗列优势往往简单引起剧烈争辩,会被以为是在宣扬和引导产品运用,实际上在都能满意功用需求的情况下,挑选运用哪款产品更多的是个政治问题,而不是技能问题,领导毅力及工程师自身的了解程度和喜好等等都是决定因素。

这儿咱们仅仅从技能视点论述几点优势,Zookeeper做为一个chubby和paxos仿照品,缺少创新式的规划改善,它依然存在以下缺陷:

1、树型装备节点的繁琐杂乱,功用低下。为了确保这种结构,Zookeeper需求保持一套虚拟文件结构的开支,关于目录结构深的树节点,形成功用影响,而装备信息结构实际上往往不一定需求树结构。

2、“调查”(watch)机制的死板规划:zookeeper没有获取最新版别信息的办法支撑,它只能粗犷的在每次写入更新等办法时注册一个watch,当这些办法被调用后就回调,它不考虑信息内容是否改动,关于没有使信息内容产生改动的更新,zookeeper依然会回调,而且zookeeper的回调比较板滞,它只能用一次,假如信息继续改动,有必要又从头注册watch。而fourinone的事情处理则能够自在操控是否继续呼应信息改动。

3、领导者推举机制完结的过分约束,集群只要两个节点,zookeeper无法进行领导者推举,zookeeper的领导者推举有必要要奇数节点的古怪约束。别的,ZooKeeper的领导者推举完结尽管比原始的Paxos要简化,可是它依然存在领导者(Leader)、跟从者(Follower)、调查者(observer)、学习者 (Learner)等很多人物和跟从状况(Following)、寻觅状况(Looking)、调查状况(Observing)、领导状况 (Leading)等杂乱状况。相关于fourinone的领导者推举,zookeeper依然不行直观简练,难以用较少装备和代码演示。

4、Windows体系上简直不支撑,需求装置linux壳,而且仅主张用于学习研讨。Fourinone支撑windows、linux集群混合运用。

Fourinone提出一种新的分布式协同体系规划,在满意zookeeper一切功用下,并克服了以上缺陷,提出了新的装备结构、改动事情机制、简化的领导者推举完结,能更好的满意分布式和谐需求。#p#

五、演示demo

下面是一个操作节点的演示demo,请留心各自节点的权限规模,程序阐明:

1、 ParkServerDemo: 发动parkserver(它的IP端口现已在装备文件的PARK部分的SERVERS指定

2、 ParkSet:往parkserver里创立了d1n1、d2n2、d3n3、d4n4共4个节点,别离对应只读、读写,一切,一切+强行删去权限

3、 ParkGet:顺次对d1n1、d2n2、d3n3、d4n4进行读、写、删去、删去domain操作,调查成果输出,假如没有权限操作,parkserver会输出信息,而且操作回来的成果目标为空

发动指令和次序:

Javac –classpath fourinone.jar; *.java

Java –classpath fourinone.jar; ParkServerDemo

Java –classpath fourinone.jar; ParkSet

Java –classpath fourinone.jar; ParkGet

假如没有fourinone.jar,能够到以下地址下载:

http://www.skycn.com/soft/68321.html

下面是demo源码:

// ParkServerDemo

import com.fourinone.BeanContext;

public class ParkServerDemo{

public static void main(String[] args){

BeanContext.startPark();

}

}

// ParkSet

import com.fourinone.BeanContext;

import com.fourinone.ParkLocal;

import com.fourinone.ObjectBean;

import com.fourinone.AuthPolicy;

public class ParkSet{

public static void main(String[] args){

//获取parkserver用户接口

ParkLocal pl = BeanContext.getPark();

//在domain d1下创立节点node n1,指定权限为只读

ObjectBean d1n1 = pl.create("d1","n1","v1",AuthPolicy.OP_READ);

if(d1n1!=null)

System.out.println("d1n1 with AuthPolicy.OP_READ create success!");

//在domain d2下创立节点node n2,指定权限为读写

ObjectBean d2n2 = pl.create("d2","n2","v2",AuthPolicy.OP_READ_WRITE);

if(d2n2!=null)

System.out.println("d2n2 with AuthPolicy.OP_READ_WRITE create success!");

//在domain d3下创立节点node n3,指定权限为一切

ObjectBean d3n3 = pl.create("d3","n3","v3",AuthPolicy.OP_ALL);

if(d3n3!=null)

System.out.println("d3n3 with AuthPolicy.OP_ALL create success!");

//在domain d4下创立节点node n4,指定权限为一切,而且创立完结强行设置为其他进程可删去

ObjectBean d4n4 = pl.create("d4","n4","v4",AuthPolicy.OP_ALL);

if(d4n4!=null)

System.out.println("d4n4 with AuthPolicy.OP_ALL create success!");

boolean r = pl.setDeletable("d4");

if(r)

System.out.println("set d4 deletable!");

}

}

// ParkGet

import com.fourinone.BeanContext;

import com.fourinone.ParkLocal;

import com.fourinone.ObjectBean;

import java.util.List;

public class ParkGet{

public static void main(String[] args){

//获取parkserver用户接口

ParkLocal pl = BeanContext.getPark();

//获取节点d1n1,节点权限为AuthPolicy.OP_READ

ObjectBean d1n1 = pl.get("d1","n1");//获取节点

System.out.println("get d1n1:"+(String)d1n1.toObject());

d1n1 = pl.update("d1","n1","v1-update");//更新节点

if(d1n1!=null)

System.out.println("update node d1n1 success!");

else

System.out.println("update node d1n1 failure!");

List d1 = pl.delete("d1");//删去domain

if(d1!=null)

System.out.println("delete domain d1 success!");

else

System.out.println("delete domain d1 failure!");

d1n1 = pl.delete("d1","n1");//删去节点

if(d1n1!=null)

System.out.println("delete node d1n1 success!");

else

System.out.println("delete node d1n1 failure!");

//获取节点d2n2,节点权限为AuthPolicy.OP_READ_WRITE

ObjectBean d2n2 = pl.get("d2","n2");

System.out.println("get d2n2:"+(String)d2n2.toObject());

d2n2 = pl.update("d2","n2","v2-update");

if(d2n2!=null)

System.out.println("update node d2n2 success!");

else

System.out.println("update node d2n2 failure!");

List d2 = pl.delete("d2");

if(d2!=null)

System.out.println("delete domain d2 success!");

else

System.out.println("delete domain d2 failure!");

d2n2 = pl.delete("d2","n2");

if(d2n2!=null)

System.out.println("delete node d2n2 success!");

else

System.out.println("delete node d2n2 failure!");

//获取节点d3n3, 节点权限为AuthPolicy.OP_ALL

ObjectBean d3n3 = pl.get("d3","n3");

System.out.println("get d3n3:"+(String)d3n3.toObject());

d3n3 = pl.update("d3","n3","v3-update");

if(d3n3!=null)

System.out.println("update node d3n3 success!");

else

System.out.println("update node d3n3 failure!");

List d3 = pl.delete("d3");

if(d3!=null)

System.out.println("delete domain d3 success!");

else

System.out.println("delete domain d3 failure!");

d3n3 = pl.delete("d3","n3");

if(d3n3!=null)

System.out.println("delete node d3n3 success!");

else

System.out.println("delete node d3n3 failure!");

//获取节点d4n4,节点权限为AuthPolicy.OP_ALL

ObjectBean d4n4 = pl.get("d4","n4");

System.out.println("get d4n4:"+(String)d4n4.toObject());

d4n4 = pl.update("d4","n4","v4-update");

if(d4n4!=null)

System.out.println("update node d4n4 success!");

else

System.out.println("update node d4n4 failure!");

//由于创立进程现已强行指定该domain可删去setDeletable(d4),因而这儿能够删去掉

List d4 = pl.delete("d4");

if(d4!=null)

System.out.println("delete domain d4 success!");

else

System.out.println("delete domain d4 failure!");

d4n4 = pl.delete("d4","n4");//这儿删去节点会失利,由于上面现已删去了该domian下一切节点

if(d4n4!=null)

System.out.println("delete node d4n4 success!");

else

System.out.println("delete node d4n4 failure!");

}

}

转载请说明出处
知优网 » fourinone分布式和谐规划解析

发表评论

您需要后才能发表评论