zookeeper使用和原理探究(一)

  • 时间:
  • 浏览:5
  • 来源:彩神大发11选5_神彩大发11选5官方

//关闭session

zk.close();

[/java]

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

zookeeper介绍

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

(1)配置管理

集中式的配置管理在应用集群中是非常常见的,一般商业公司内控 都会实现一套集中的配置管理中心,应对不同的应用集群对于共享每个人配置的需求,让你在配置变更时越多再还后能 通知到集群中的每一另一一一个多多 机器。



tickTime=2000

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

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

(2) Znode都须要有子znode,让你znode里都须要存数据,让你EPHEMERAL类型的节点没有有子节点

(3) Znode中的数据都须要有多个版本,比如某一另一一一个多多 路径下存有多个数据版本,没有查询你什儿 路径下的数据就须要带上版本。

(4) znode 都须之后临八时点,一旦创建你什儿 znode 的客户端与服务器拖累联系,你什儿 znode 也将自动删除,Zookeeper 的客户端和服务器通信采用长连接土最好的措施,每个客户端和 服务器通过心跳来保持连接,你什儿 连接情况汇报称为 session,让你 znode 是临八时点,你什儿 session 失效,znode 也就删除了

(5) znode 的目录名都须要自动编号,如 App1 让你处在,再创建的话,让你自动命名为 App2

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

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

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

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

让你进入zookeeper-3.3.2/conf目录,没有让你是刚下过来,会兩个文件,configuration.xml, log4j.properties,zoo_sample.cfg,什儿 个文件大家首没能做的之后在你什儿 目录创建一另一一一个多多 zoo.cfg的配置文件,当然你都须要把zoo_sample.cfg文件改成zoo.cfg,配置的内容如下所示:

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

[java]

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

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

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

public void process(WatchedEvent event) {

//dosomething

}

});

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

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

接下来就都须要使用了,大家都须要先通过 zookeeper自带的客户端交互系统进程池池来简单感受下zookeeper到底做你什儿 哪几种事情。进入zookeeper-3.3.2/bin(一个server中任意一另一一一个多多 )下,./zkCli.sh –server 127.0.0.1:2182,我连的是开着2182端口的机器。

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

让你每个文件夹里面解压一另一一一个多多 zookeeper的下载包,让你还建了有几个文件夹,总体价值形式如下,最后那个是下载过来压缩包的解压文件

data dataLog logs zookeeper-3.3.2

Zookeeper很容易实现你什儿 集中式的配置管理,比如将APP1的所有配置配置到/APP1 znode下,APP1所有机器一启动就对/APP1你什儿 节点进行监控(zk.exist(“/APP1”,true)),让你实现回调土最好的措施Watcher,没有在zookeeper上/APP1 znode节点下数据处在变化的从前,每个机器都会收到通知,Watcher土最好的措施让你被执行,没有应用再取下数据即可(zk.getData(“/APP1”,false,null));

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

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

[/java]

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

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

// 创建一另一一一个多多 子目录节点

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

zookeeper的数据模型

在简单使用了zookeeper从前,大家发现其数据模型你什儿 像操作系统的文件价值形式,价值形式如下图所示

总结

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

[/java]

另外有一另一一一个多多 应用场景之后集群选master,一旦master挂掉越多再还后能 马都须要从slave中选出一另一一一个多多 master,实现步骤和前者一样,之后机器在启动的从前在APP1SERVERS创建的节点类型变为EPHEMERAL_SEQUENTIAL类型,从前每个节点会自动被编号,相似

[java]

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

没有首先进入data目录,创建一另一一一个多多 myid的文件,里面写入一另一一一个多多 数字,比如我你什儿 是server1,没有就写一另一一一个多多 1,server2对应myid文件就写入2,server3对应myid文件就写个3

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

通过上述命令实践,大家都须要发现,zookeeper使用了一另一一一个多多 相似文件系统的树价值形式,数据都须要挂在某个节点上,都须要对你什儿 节点进行详细。另外大家还发现,当改动一另一一一个多多 节点的从前,集群中活着的机器都会更新到一致的数据。

打印结果:[testChildPath20000000000, testChildPath20000000001, testChildPath20000000003, testChildPath20000000002]

[java]

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

让你手头机器欠缺,所以在一台机器上部署了一个server,让你你手头也比较紧,也都须要没有做。没有我建了一个文件夹,如下

server1 server2 server3

// 创建一另一一一个多多 子目录节点

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

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

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

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

大家默认规定编号最小的为master,所以当大家对/APP1SERVERS节点做监控的从前,得到服务器列表,我希望所有集群机器逻辑认为最小编号节点为master,没有master就被选出,而你什儿 master宕机的从前,相应的znode会消失,让你新的服务器列表就被推送到客户端,让你每个节点逻辑认为最小编号节点为master,从前就做到动态master选举。

以上你什儿 例子之后简单的粗颗粒度配置监控,细颗粒度的数据都须要进行分层级监控,你什儿 切都会都须要设计和控制的。

(2)集群管理 应用集群中,大家常常须要让每一另一一一个多多 机器知道集群中(或依赖的你什儿 某一另一一一个多多 集群)哪几种机器是活着的,让你在集群机器让你宕机,网络断链等愿因越多再还后能 不在 人工介入的情况汇报下比较慢通知到每一另一一一个多多 机器。

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

// 创建一另一一一个多多 子目录节点

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

进入zookeeper-3.3.2/bin 目录中,./zkServer.sh start启动一另一一一个多多 server,这都会报几滴 错误?其实没哪几种关系,让你现在集群只起了1台server,zookeeper服务器端起来会根据zoo.cfg的服务器列表发起选举leader的请求,让你连不上你什儿 机器而报错,没有当大家起第一个zookeeper实例后,leader让你被选出,从而一致性服务开始都须要使用,这是让你3台机器我希望有2台可用就都须要选出leader让你对外提供服务(2n+1台机器,都须要容n台机器挂掉)。

zookeeper安装和使用

zookeeper的安装基本上都须要按照 http://hadoop.apache.org/zookeeper/docs/current/ zookeeperStarted.html 你什儿 页面上的步骤完成安装,这里主要介绍下部署一另一一一个多多 集群的步骤,让你你什儿 官方页面似乎讲得并都会非常详细(Running Replicated Zookeeper)。

没有,首先大家随便打个命令,让你zookeeper不认识,他会给出命令的help,如下图



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

ls2(查看当前节点数据不还后能 看了更新次数等数据) ,

create(创建一另一一一个多多 节点) ,

get(得到一另一一一个多多 节点,涵盖数据和更新次数等数据),

set(修改节点)

delete(删除一另一一一个多多 节点)

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

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

//删除/root/childone你什儿 节点,第一个参数为版本,-1的话直接删除,无视版本

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

通过java代码使用zookeeper

Zookeeper的使用主之后通过创建其jar包下的Zookeeper实例,让你调用其接口土最好的措施进行的,主要的操作之后对znode的增详细操作,监听znode的变化以及防止。

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

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

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

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