zookeeper概要介绍

来源:互联网

Zookeeper是Hadoop下的一个子项目,主要用来在分布式环境下提供分布式锁、配置管理、名字服务、群组服务。它具有很高的可用性、稳定 性、可靠性。它在分布式应用中像一把瑞士军刀,很多地方都用得着,像我们的DMS系统中就用它来提供分布式锁服务和动态配置服务。

Zookeeper就像google在云技术领域提供的四大金刚之chubby(分布式锁服务),采用了简化的praxos算法来确保 zookeeper集群节点的数据一致性。Zookeeper可以部署为standalone模式或quorum模式。Standalone模式就是只有 单个Zookeeper server提供服务,优点是部署简单,缺点是有单点故障,不能提供高负载,可靠性无法保证,一旦server当机,将不能提供服务,这种模式主要使用在 测试环境中,生产环境不建议采用这种模式。Quorum模式则正好相反,只要Quorum的成员有一半以上处于正常状态,就能对外提供服务,具有高可用 性,Quorum成员可以共同分担业务请求的负载。没有单点故障。下图是zookeeper的架构图。

zookeeper提供的简单接口:

Zookeeper查询命令

Zookeeper查询命令主要用来查询服务器端的数据,不会更改服务器端的数据。所有的查询命令都可以即刻从client连接的server立即返回,不需要leader进行协调,因此查询命令得到的数据有可能是过期数据。但由于任何数据的修改,leader都会将更改的结果发布给所有的Follower,因此一般说来,Follower的数据是可以得到及时的更新。这些查询命令包括以下这些命令:

1. exists:判断指定path的node是否存在,如果存在则返回true,否则返回false.

2. getData:从指定path获取该node的数据

3. getACL:获取指定path的ACL。

4. getChildren:获取指定path的node的所有孩子结点。

所有的查询命令都可以指定watcher,通过它来跟踪指定path的数据变化。一旦指定的数据发生变化(create,delete,modified,children_changed),服务器将会发送命令来回调注册的watcher. Watcher详细的讲解将在Zookeeper的Watcher中单独讲解。

Zookeeper修改命令

Zookeeper修改命令主要是用来修改节点数据或结构,或者权限信息。任何修改命令都需要提交到leader进行协调,协调完成后才返回。修改命令主要包括:

1. createSession:请求server创建一个session

2. create:创建一个节点

3. delete:删除一个节点

4. setData:修改一个节点的数据

5. setACL:修改一个节点的ACL

6. closeSession:请求server关闭session

任何修改命令都需要leader协调。 在leader的协调过程中,需要3次leader与Follower之间的来回请求响应。并且在此过程中还会涉及事务日志的记录,更糟糕的情况是还有take snapshot的操作。因此此过程可能比较耗时。但Zookeeper的通信中最大特点是异步的,如果请求是连续不断的,Zookeeper的处理是集中处理逻辑,然后批量发送,批量的大小也是有控制的。如果请求量不大,则即刻发送。这样当负载很大时也能保证很大的吞吐量,时效性也在一定程度上进行了保证。

配置与安装

Zookeeper代码依赖简单,仅仅依赖于log4j。部署也非常简单,只需要在官网(http://hadoop.apache.org/zookeeper/)上下载包,解压到安装目录,修改配置文件,拷贝一份zoo-sample.cfg将其修改如下:

Config代码

1 #snapShot存放路径

2 dataDir=data

3 #transaction log 存放路径

4 dataLogDir=dataLog

5 #接收客户端请求的server端口,默认为

6 clientPort=2181

7 #代表1 tickTime多少毫秒,默认为2000毫秒

8 tickTime=2000

9 #初始化leader的时间,如果超过initLimit时间还没有收到大多数Follower的newLeader响应,则重新与各follower连接。

10 initLimit=5

11 #follower与leader之间的超时时间

12 syncLimit=5

13 #0:LeaderElection;1:AuthFastLeaderElection 非授权模式 2:AuthFastLeaderElection 授权模式 3:FastLeaderElection

14 electionAlg=0

15 #允许同一个client向server提交了请求,但还未返回的最大请求数

16 maxClientCnxns=100

17 #server.servrId=host:port:port

18 server.1=localhost:2881:3881

19 server.2=localhost:2882:3882

20 server.3=localhost:2883:3883

21 server.4=localhost:2884:3884

22 server.5=localhost:2885:3885

23

24 #group与weight跟大多数同意的策略相关,大多数同意策略为让所有组有超过一半权重的server已经确认过,则可以通过,

25 #如果没有指定server的权重,则默认为1,group中一定要包含所有的server,遗漏或多余都不行,当然可以不配,如果不配

26 #则weight也不需要配置

27 #group.groupId=serverId1:serverId2:serverId3:serverIdn

28 group.1=1:3:5

29 group.2=2:4

30

31 #weight.serverId=长整型数

32 weight.1=2

33 weight.2=3

34 weight.5=4

以上是集群环境下3.2.2版本的服务器端配置文件。在集群环境下每个server需要一个标识server编号的标识文件,这个标识文件需要放在data目录下,比如dataDir目录是/home/joe/zookeeper/data,则这个文件应该在data目录下,文件内容非常简单,就是一个数字编号,对应配置文件中指定的server.number,这个编号不能搞错,他们是通过这个编号来标识不同server的。配置文件准备就绪后,切换到zookeeper的安装目录/bin,你会看到一些zk*.sh. 比如zkCleanup.sh zkCli.sh zkEnv.sh zkServer.sh。可以检查一下shell脚本来搞清该脚本的用途。zkServer.sh就是用来启动zookeeper server的。zkClearnup.sh是用来清除哪些不再使用的日志文件和snapshot文件。启动脚本zkServer.sh start。正常情况就可以看到以下信息,代表你的集群环境配置好了。恭喜你,让我们一起zookeeper使用里程吧。

参考文章:

发表评论