zookeeper使用和原理探究(一)

  • 时间:
  • 浏览:1
  • 来源:神彩大发快3_彩神大发快3官方

//删除/root/childone你许多节点,第十个 参数为版本,-1搞笑的话直接删除,无视版本

zk.delete("/root/childone", -1);

(1) 每个节点在zookeeper中叫做znode,可是我我其有1个多多多唯一的路径标识,如/SERVER2节点的标识就为/APP3/SERVER2

(2) Znode还须要有子znode,可是我我znode里还须要存数据,可是我我EPHEMERAL类型的节点还太多再 了有子节点

(3) Znode中的数据还须要有多个版本,比如某1个多多多路径下存有多个数据版本,这麼 查询你许多路径下的数据就须要带上版本。

(4) znode 还须可是我我临九时点,一旦创建你许多 znode 的客户端与服务器抛弃联系,你许多 znode 也将自动删除,Zookeeper 的客户端和服务器通信采用长连接最好的依据,每个客户端和 服务器通过心跳来保持连接,你许多连接请况称为 session,不可能 znode 是临九时点,你许多 session 失效,znode 也就删除了

(5) znode 的目录名还须要自动编号,如 App1 不可能 发生,再创建搞笑的话,不可能 自动命名为 App2

(6) znode 还须要被监控,包括你许多目录节点中存储的数据的修改,子节点目录的变化等,一旦变化还须要通知设置监控的客户端,你许多功能是zookeeper对于应用最重要的形态学 ,通过你许多形态学 还须要实现的功能包括配置的集中管理,集群管理,分布式锁等等。

//修改节点/root/childone下的数据,第1个多多多参数为版本,不可能 是-1,那会无视被修改的数据版本,直接改掉

zk.setData("/root/childone","childonemodify".getBytes(), -1);

zookeeper安装和使用

zookeeper的安装基本上还须要按照 http://hadoop.apache.org/zookeeper/docs/current/ zookeeperStarted.html 你许多页面上的步骤完成安装,这里主要介绍下部署1个多多多集群的步骤,不可能 你许多官方页面似乎讲得并后会 非常完整版(Running Replicated Zookeeper)。

最后几行唯一须要注意的地方可是我我 server.X 你许多数字可是我我对应 data/myid中的数字。你在十个 server的myid文件中分别写入了1,2,3,这麼 每个server中的zoo.cfg都配server.1,server.2,server.3就OK了。不可能 在同一台机器上,上端连着的1个多多多端口十个 server后会 要一样,可是我我端口冲突,其中第1个多多多端口用来集群成员的信息交换,第十个 端口是在leader挂掉时专门用来进行选举leader所用。

zookeeper介绍

zookeeper是1个多多多为分布式应用提供一致性服务的软件,它是开源的Hadoop项目中的1个多多多子项目,可是我我根据google发表的论文来实现的,接下来亲戚亲戚朋友首先来安装使用下你许多软件,可是我我再来探索下其中比较重要一致性算法。

//在root下面创建1个多多多childone znode,数据为childone,不进行ACL权限控制,节点为永久性的

zk.create("/root/childone","childone".getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);

这麼 ,首先亲戚亲戚朋友随便打个命令,不可能 zookeeper不认识,他会给出命令的help,如下图



ls(查看当前节点数据),

ls2(查看当前节点数据太多再 看得人更新次数等数据) ,

create(创建1个多多多节点) ,

get(得到1个多多多节点,中有 数据和更新次数等数据),

set(修改节点)

delete(删除1个多多多节点)

//取得/root节点下的子节点名称,返回List<String>

zk.getChildren("/root",true);

接下来就还须要使用了,亲戚亲戚朋友还须要先通过 zookeeper自带的客户端交互系统进程来简单感受下zookeeper到底做许多你许多事情。进入zookeeper-3.3.2/bin(十个 server中任意1个多多多)下,./zkCli.sh –server 127.0.0.1:2182,我连的是开着2182端口的机器。

另外有1个多多多应用场景可是我我集群选master,一旦master挂掉太多再 马还须要从slave中选出1个多多多master,实现步骤和前者一样,可是我我机器在启动的如果在APP1SERVERS创建的节点类型变为EPHEMERAL_SEQUENTIAL类型,这麼 每个节点会自动被编号,这一

[java]

zk.create("/testRootPath/testChildPath1","1".getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL_SEQUENTIAL);

// 创建1个多多多子目录节点

zk.create("/testRootPath/testChildPath1","1".getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL);

亲戚亲戚朋友默认规定编号最小的为master,全都有当亲戚亲戚朋友对/APP1SERVERS节点做监控的如果,得到服务器列表,假若所有集群机器逻辑认为最小编号节点为master,这麼 master就被选出,而你许多master宕机的如果,相应的znode会消失,可是我我新的服务器列表就被推送到客户端,可是我我每个节点逻辑认为最小编号节点为master,这麼 就做到动态master选举。

通过上述命令实践,亲戚亲戚朋友还须要发现,zookeeper使用了1个多多多这一 文件系统的树形态学 ,数据还须要挂在某个节点上,还须要对你许多节点进行完整版。另外亲戚亲戚朋友还发现,当改动1个多多多节点的如果,集群中活着的机器后会 更新到一致的数据。

System.out.println(zk.getChildren("/testRootPath", false));

[/java]

打印结果:[testChildPath2, testChildPath1, testChildPath4, testChildPath3]

标红的有有几个配置应该官网讲得很清楚了,可是我我须要注意的是clientPort你许多端口不可能 你是在1台机器上部署多个server,这麼 每台机器后会 不同的clientPort,比如我server1是2181,server2是2182,server3是2183,dataDir和dataLogDir也须要区分下。

//取得/root/childone节点下的数据,返回byte[]

zk.getData("/root/childone", true, null);

这麼 首先进入data目录,创建1个多多多myid的文件,上端写入1个多多多数字,比如我你许多是server1,这麼 就写1个多多多1,server2对应myid文件就写入2,server3对应myid文件就写个3

可是我我每个文件夹上端解压1个多多多zookeeper的下载包,可是我我还建了有有几个文件夹,总体形态学 如下,最后那个是下载过来压缩包的解压文件

data dataLog logs zookeeper-3.3.2

System.out.println(zk.getChildren("/testRootPath", false));

[/java]

Zookeeper同样很容易实现你许多功能,比如我在zookeeper服务器端有1个多多多znode叫/APP1SERVERS,这麼 集群中每1个多多多机器启动的如果都去你许多节点下创建1个多多多EPHEMERAL类型的节点,比如server1创建/APP1SERVERS/SERVER1(还须要使用ip,保证不重复),server2创建/APP1SERVERS/SERVER2,可是我我SERVER1和SERVER2都watch /APP1SERVERS你许多父节点,这麼 也可是我我你许多父节点下数据不可能 子节点变化后会 通知对该节点进行watch的客户端。不可能 EPHEMERAL类型节点有1个多多多很重要的形态学 ,可是我我客户端和服务器端连接断掉不可能 session过期就会使节点消失,这麼 在某1个多多多机器挂掉不可能 断链的如果,其对应的节点就会消失,可是我我集群中所有对/APP1SERVERS进行watch的客户端后会 收到通知,可是我我取得最新列表即可。

总结

以下为主要的API使用和解释

[java]

//创建1个多多多Zookeeper实例,第1个多多多参数为目标服务器地址和端口,第十个 参数为Session超时时间,第1个多多多为节点变化时的回调最好的依据

ZooKeeper zk = new ZooKeeper("127.0.0.1:2181", 5000000,new Watcher() {

// 监控所有被触发的事件

public void process(WatchedEvent event) {

//dosomething

}

});

//创建1个多多多节点root,数据是mydata,不进行ACL权限控制,节点为永久性的(即客户端shutdown了可是我我会消失)

zk.create("/root", "mydata".getBytes(),Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);

Zookeeper很容易实现你许多集中式的配置管理,比如将APP1的所有配置配置到/APP1 znode下,APP1所有机器一启动就对/APP1你许多节点进行监控(zk.exist(“/APP1”,true)),可是我我实现回调最好的依据Watcher,这麼 在zookeeper上/APP1 znode节点下数据发生变化的如果,每个机器后会 收到通知,Watcher最好的依据不可能 被执行,这麼 应用再取下数据即可(zk.getData(“/APP1”,false,null));

可是我我进入zookeeper-3.3.2/conf目录,这麼 不可能 是刚下过来,会有十个 文件,configuration.xml, log4j.properties,zoo_sample.cfg,这十个 文件亲戚亲戚朋友首不能自己做的可是我我在你许多目录创建1个多多多zoo.cfg的配置文件,当然你会把zoo_sample.cfg文件改成zoo.cfg,配置的内容如下所示:

zk.create("/testRootPath/testChildPath2","2".getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL_SEQUENTIAL);

本文来源于"阿里上端件团队播客",原文发表时间" 2010-12-21"

以上你许多例子可是我我简单的粗颗粒度配置监控,细颗粒度的数据还须要进行分层级监控,你许多切后会 还须要设计和控制的。

(2)集群管理 应用集群中,亲戚亲戚朋友常常须要让每1个多多多机器知道集群中(或依赖的许多某1个多多多集群)你许多机器是活着的,可是我我在集群机器不可能 宕机,网络断链等愿因 太多再 不出人工介入的请况下迅速通知到每1个多多多机器。

不可能 手头机器不够,全都有在一台机器上部署了十个 server,不可能 你手头也比较紧,也还须要这麼 做。这麼 我建了十个 文件夹,如下

server1 server2 server3

进入zookeeper-3.3.2/bin 目录中,./zkServer.sh start启动1个多多多server,这后会 报极少量错误?我觉得没你许多关系,不可能 现在集群只起了1台server,zookeeper服务器端起来会根据zoo.cfg的服务器列表发起选举leader的请求,不可能 连不上许多机器而报错,这麼 当亲戚亲戚朋友起第十个 zookeeper实例后,leader不可能 被选出,从而一致性服务开始英文还须要使用,这是不可能 3台机器假若有2台可用就还须要选出leader可是我我对外提供服务(2n+1台机器,还须要容n台机器挂掉)。



tickTime=5000

initLimit=5

syncLimit=2

dataDir=xxxx/zookeeper/server1/data

dataLogDir=xxx/zookeeper/server1/dataLog

clientPort=2181


server.1=127.0.0.1:2888:3888

server.2=127.0.0.1:2889:3889

server.3=127.0.0.1:2890:3890

zk.create("/testRootPath/testChildPath3","3".getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL);

// 创建1个多多多子目录节点

zk.create("/testRootPath/testChildPath4","4".getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL);

// 创建1个多多多子目录节点

zk.create("/testRootPath/testChildPath4","4".getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL_SEQUENTIAL);

//关闭session

zk.close();

[/java]

Zookeeper的主流应用场景实现思路除去官方示例)

zk.create("/testRootPath/testChildPath2","2".getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL);

zk.create("/testRootPath/testChildPath3","3".getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL_SEQUENTIAL);

通过java代码使用zookeeper

Zookeeper的使用主可是我我通过创建其jar包下的Zookeeper实例,可是我我调用其接口最好的依据进行的,主要的操作可是我我对znode的增完整版操作,监听znode的变化以及处里。

(1)配置管理

集中式的配置管理在应用集群中是非常常见的,一般商业公司结构后会 实现一套集中的配置管理中心,应对不同的应用集群对于共享个人所有配置的需求,可是我我在配置变更时太多再 通知到集群中的每1个多多多机器。

亲戚亲戚朋友初步使用了一下zookeeper可是我我尝试着描述了几种应用场景的具体实现思路,接下来的文章,亲戚亲戚朋友会尝试着去探究一下zookeeper的高可用性与leaderElection算法。

打印结果:[testChildPath500000000000, testChildPath50000000001, testChildPath50000000003, testChildPath50000000002]

[java]

zk.create("/testRootPath", "testRootData".getBytes(),Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);

zookeeper的数据模型

在简单使用了zookeeper如果,亲戚亲戚朋友发现其数据模型许多像操作系统的文件形态学 ,形态学 如下图所示