zookeeper使用总结文档初级.docx
- 文档编号:24599226
- 上传时间:2023-05-29
- 格式:DOCX
- 页数:25
- 大小:46.77KB
zookeeper使用总结文档初级.docx
《zookeeper使用总结文档初级.docx》由会员分享,可在线阅读,更多相关《zookeeper使用总结文档初级.docx(25页珍藏版)》请在冰豆网上搜索。
zookeeper使用总结文档初级
Zookeeper使用总结
2015年5月
李梁
前言
1.阅读对象
本手册面向对zookeeper技术感兴趣的读者,是使用当中的总结,希望能帮到你们。
目录
第1章zookeeper概述2
1.1zookeeper介绍2
1.2zookeeper特性2
第2章zookeeper安装和配置3
2.1.1zookeeper安装3
2.1.2zookeeper配置3
2.1.2.1单机模式3
2.1.2.2伪集群模式3
2.1.2.3集群模式4
第3章ZookeeperCAPI简介6
3.1Watches6
3.1.1监视函数原型7
3.2常用API7
3.2.1.1zookeeper_init7
3.2.1.2zookeeper_close8
3.2.1.3zoo_create8
3.2.1.4zoo_wexists9
3.2.1.5zoo_set10
3.2.1.6zoo_get10
3.2.1.7zoo_state10
第4章客户端CAPI编译12
4.1Linux平台编译12
4.2Window平台编译12
第5章zookeeper客户端命令13
5.1命令行工具的常用操作13
5.2ZooKeeper常用四字命令13
第6章zookeeper使用常见问题15
第7章附录16
7.1zookeeper初始化、销毁函数16
7.2zookeeper辅助函数16
7.3zookeeper同步接口17
7.4zookeeper异步接口18
7.5zookeeperCAPI总览20
第1章zookeeper概述
1.1zookeeper介绍
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。
它是一个为分布式应用提供一致性服务的软件,提供的功能包括:
配置维护、名字服务、分布式同步、组服务等。
系统模型如图1-1:
图11
1.2zookeeper特性
●简单:
本质上是一个小型分布式文件系统,其数据结构就是znode树,对znode的读写是原子的。
尽量保证单个znode在1MB一下,通常几K。
●可靠:
可以运行在一组服务器上,数据在每台server上都有备份,避免单点失效。
●快速:
数据全部加载到内存中,读写比例为10:
1时性能最佳(读是局部性的,写需要由leader通知给所有server)。
在更新内存中的znode之前会先序列到磁盘,服务重启后数据可以恢复。
●松耦合:
Watcher机制使得各客户端与服务器的交互变得松耦合,每个客户端无需知晓其他客户端的存在,就可以和其他客户端进行数据交互。
第2章zookeeper安装和配置
2.1.1zookeeper安装
下载zookeeper安装包,解压到相应目录即可。
2.1.2zookeeper配置
zookeeper配置有三种模式:
单机模式、伪集群模式,集群模式。
2.1.2.1单机模式
进入zookeeper目录下的conf子目录,创建zoo.cfg
配置如下:
tickTime=2000
dataDir=/Users/zookeeper/data
dataLogDir=/Users/zookeeper/logs
clientPort=4180
参数说明:
tickTime:
zookeeper中使用的基本时间单位,毫秒值
dataDir:
数据目录.可以是任意目录
dataLogDir:
log目录,同样可以是任意目录.如果没有设置该参数,将使用和dataDir相同的设置
clientPort:
监听client连接的端口号
zookeeper的单机模式已经配置完成.启动server只需运行脚本。
Server启动之后,就可以启动client连接server了。
2.1.2.2伪集群模式
所谓伪集群,是指在单台机器中启动多个zookeeper进程,并组成一个集群.以启动3个zookeeper进程为例.
将zookeeper的目录拷贝2份:
|--zookeeper0
|--zookeeper1
|--zookeeper2
配置如下
tickTime=2000
initLimit=5
syncLimit=2
dataDir=/Users//zookeeper0/data
dataLogDir=/Users/zookeeper0/logs
clientPort=4180
server.0=127.0.0.1:
8880:
7770
server.1=127.0.0.1:
8881:
7771
server.2=127.0.0.1:
8882:
7772
新增了几个参数,其含义如下:
initLimit:
zookeeper集群中的包含多台server,其中一台为leader,集群中其余的server为follower.initLimit参数配置初始化连接时,follower和leader之间的最长心跳时间.此时该参数设置为5,说明时间限制为5倍tickTime,即5*2000=10000ms=10s。
syncLimit:
该参数配置leader和follower之间发送消息,请求和应答的最大时间长度.此时该参数设置为2,说明时间限制为2倍tickTime,即4000ms.
server.X=A:
B:
C其中X是一个数字,表示这是第几号server.A是该server所在的IP地址.B配置该server和集群中的leader交换消息所使用的端口.C配置选举leader时所使用的端口.由于配置的是伪集群模式,所以各个server的B,C参数必须不同。
参照zookeeper0/conf/zoo.cfg,配置zookeeper1/conf/zoo.cfg,和zookeeper2/conf/zoo.cfg文件.只需更改dataDir,dataLogDir,clientPort参数即可.
在之前设置的dataDir中新建myid文件,写入一个数字,该数字表示这是第几号server.该数字必须和zoo.cfg文件中的server.X中的X一一对应.
/Users/apple/zookeeper0/data/myid文件中写入0,/Users/apple/zookeeper1/data/myid文件中写入1,/Users/apple/zookeeper2/data/myid文件中写入2.
分别进入/Users/apple/zookeeper0/bin,/Users/apple/zookeeper1/bin,/Users/apple/zookeeper2/bin三个目录,启动server.
任意选择一个server目录,启动客户端:
2.1.2.3集群模式
集群模式的配置和伪集群基本一致,由于集群模式下,各server部署在不同的机器上,,因此各server的conf/zoo.cfg文件可以完全一样。
下面是一个示例:
tickTime=2000
initLimit=5
syncLimit=2
dataDir=/home/zookeeper/data
dataLogDir=/home/zookeeper/logs
clientPort=4180
server.43=10.1.39.43:
2888:
3888
server.47=10.1.39.47:
2888:
3888
server.48=10.1.39.48:
2888:
3888
示例中部署了3台zookeeperserver,分别部署在10.1.39.43,10.1.39.47,10.1.39.48上。
需要注意的是,,各server的dataDir目录下的myid文件中的数字必须不同。
10.1.39.43server的myid为43,10.1.39.47server的myid为47,10.1.39.48server的myid为48。
第3章ZookeeperCAPI简介
ZookeeperCAPI的声明和描述在include/zookeeper.h中可以找到,另外大部分的ZookeeperCAPI常量、结构体声明也在zookeeper.h中,如果如果你在使用CAPI是遇到不明白的地方,最好看看zookeeper.h,或者自己使用doxygen生成ZookeeperCAPI的帮助文档。
3.1Watches
Zookeeper中最有特色且最不容易理解的是监视(Watches)。
Zookeeper所有的读操作getData(),getChildren(),和 exists() 都可以设置监视(watch),监视事件可以理解为一次性的触发器,官方定义如下:
awatcheventisone-timetrigger,senttotheclientthatsetthewatch,whichoccurswhenthedataforwhichthewatchwassetchanges。
对此需要作出如下理解:
∙(一次性触发)One-timetrigger
当设置监视的数据发生改变时,该监视事件会被发送到客户端,例如,如果客户端调用了getData("/znode1",true)并且稍后/znode1节点上的数据发生了改变或者被删除了,客户端将会获取到/znode1发生变化的监视事件,而如果/znode1再一次发生了变化,除非客户端再次对/znode1设置监视,否则客户端不会收到事件通知。
∙(发送至客户端)Senttotheclient
Zookeeper客户端和服务端是通过socket进行通信的,由于网络存在故障,所以监视事件很有可能不会成功地到达客户端,监视事件是异步发送至监视者的,Zookeeper本身提供了保序性(orderingguarantee):
即客户端只有首先看到了监视事件后,才会感知到它所设置监视的znode发生了变化(aclientwillneverseeachangeforwhichithassetawatchuntilitfirstseesthewatchevent).网络延迟或者其他因素可能导致不同的客户端在不同的时刻感知某一监视事件,但是不同的客户端所看到的一切具有一致的顺序。
∙(被设置watch的数据)Thedataforwhichthewatchwasset
这意味着znode节点本身具有不同的改变方式。
你也可以想象Zookeeper维护了两条监视链表:
数据监视和子节点监视(datawatchesandchildwatches)getData()andexists()设置数据监视,getChildren()设置子节点监视。
或者,你也可以想象Zookeeper设置的不同监视返回不同的数据,getData()和exists()返回znode节点的相关信息,而getChildren()返回子节点列表。
因此,setData()会触发设置在某一节点上所设置的数据监视(假定数据设置成功),而一次成功的create()操作则会出发当前节点上所设置的数据监视以及父节点的子节点监视。
一次成功的delete()操作将会触发当前节点的数据监视和子节点监视事件,同时也会触发该节点父节点的childwatch。
Zookeeper中的监视是轻量级的,因此容易设置、维护和分发。
当客户端与Zookeeper服务器端失去联系时,客户端并不会收到监视事件的通知,只有当客户端重新连接后,若在必要的情况下,以前注册的监视会重新被注册并触发,对于开发人员来说这通常是透明的。
只有一种情况会导致监视事件的丢失,即:
通过exists()设置了某个znode节点的监视,但是如果某个客户端在此znode节点被创建和删除的时间间隔内与zookeeper服务器失去了联系,该客户端即使稍后重新连接zookeeper服务器后也得不到事件通知。
3.1.1监视函数原型
typedefvoid(*watcher_fn)(zhandle_t*zh,inttype,intstate,constchar*path,void*watcherCtx);
监视函数原型的各个参数解释如下:
zh
zookeeper句柄(handle)
type
事件类型(eventtype).*_EVENT常量之一.
state
连接状态(connectionstate).状态值为*_STATE常量之一.
path
触发监视事件的znode节点的路径,若为NULL,则事件类型为ZOO_SESSION_EVENT
watcherCtx
监视器上下文(watchercontext).
3.2常用API
3.2.1.1zookeeper_init
ZOOAPIzhandle_t*zookeeper_init(constchar*host,watcher_fnfn,intrecv_timeout,constclientid_t*clientid,void*context,intflags);
功能:
创建一个句柄(handle)和一个响应(response)这个句柄的会话(session)。
参数:
host:
zookeeper主机列表,用逗号间隔。
fn:
用于监视的回调函数。
clientid:
之前建立过连接,现在要重新连的客户端(client)ID。
如果之前没有,则为0.
context:
暂时用不到,忽略。
flags:
设置为0,zookeeper开发团队保留以后使用。
3.2.1.2zookeeper_close
ZOOAPIintzookeeper_close(zhandle_t*zh);
功能:
关闭句柄,释放资源。
参数:
zh:
zookeeper句柄。
返回值:
ZOK表示成功
ZBADARGUMENTS表示输入参数无效
ZMARSHALLINGERROR-failedtomarshallarequest;possibly,outofmemory
ZOPERATIONTIMEOUT-failedtoflushthebufferswithinthespecifiedtimeout.
ZCONNECTIONLOSS-anetworkerroroccuredwhileattemptingtosendrequesttoserver
ZSYSTEMERROR--asystem(OS)erroroccured;it'sworthcheckingerrnotogetdetails
3.2.1.3zoo_create
ZOOAPIintzoo_create(zhandle_t*zh,constchar*path,constchar*value,intvaluelen,
conststructACL_vector*acl,intflags,char*path_buffer,intpath_buffer_len);
功能:
创建一个同步的zookeeper节点。
参数:
zh:
zookeeper的句柄,由zookeeper_init得到。
path:
节点名称,就是一个类似于文件系统写法的路径。
value:
欲存储到该节点的数据。
如果不存储数据,则设置为NULL。
valuelen:
欲存储的数据的长度。
如果不存储数据,则设置为-1.
acl:
初始的ACL节点,ACL不能为空。
比如设置为&ZOO_OPEN_ACL_UNSAFE。
flags:
一般设置为0。
path_buffer:
将由新节点填充的路径值。
可设置为NULL。
path_buffer_len:
path_buffer的长度。
返回值:
ZOK表示操作成功。
ZNONODE表示该节点不存在。
ZNODEEXISTS表示节点已经存在。
ZNOAUTH表示客户端(client)无权限。
ZNOCHILDRENFOREPHEMERALS表示不能够创建临时(ephemeral)节点的子节点(children)。
3.2.1.4zoo_wexists
ZOOAPIintzoo_wexists(zhandle_t*zh,constchar*path,watcher_fnwatcher,
void*watcherCtx,structStat*stat);
功能:
同步监视一个zookeeper节点(node)是否存在。
参数:
zh:
zookeeper的句柄,由zookeeper_init得到。
path:
节点名称,就是一个类似于文件系统写法的路径。
watcher:
如果不为NULL则会在服务器端设置监视,当节点发生变化时客户端会得到通知,即使当前指定的节点不存在也会设置监视,这样该节点被创建时,客户端也可以得到通知。
watcherCtx:
用户指定的数据,将被传入到监视器回调函数中,与由zookeeper_init()设置的全局监视器上下文不同,该函数设置的监视器上下文只与当前的监视器相关联。
stat:
返回的Stat信息
返回值:
ZOK表示操作成功。
ZNONODE表示该节点不存在。
ZNOAUTH表示客户端(client)无权限。
ZINVALIDSTATE表示存在非法的参数。
3.2.1.5zoo_set
ZOOAPIintzoo_set(zhandle_t*zh,constchar*path,constchar*buffer,intbuflen,intversion);
功能:
向zookeeper节点写数据。
参数:
zh:
zookeeper的句柄,由zookeeper_init得到。
path:
节点名称,就是一个类似于文件系统写法的路径。
buffer:
欲写的数据。
buflen:
欲写的数据的长度。
version:
检查这个节点的版本是否为version。
当设置为-1时,不会进行版本检查。
3.2.1.6zoo_get
ZOOAPIintzoo_get(zhandle_t*zh,constchar*path,intwatch,char*buffer,
int*buffer_len,structStat*stat);
功能:
获取zookeeper节点数据。
参数:
zh:
zookeeper的句柄,由zookeeper_init得到。
path:
节点名称,就是一个类似于文件系统写法的路径。
watch:
如果非0,则在服务器端设置监视,当节点发生变化时客户端会得到通知。
buffer:
用于保存从zookeeper服务器获取的节点数据。
buffer_len:
buffer大小,一旦成功返回该值将会被设置为节点数据的实际大小,如果节点的数据为空,则数据大小为-1,buffer_len也为-1。
stat:
如果非空,stat指向的结构将会保存该节点的Stat信息。
3.2.1.7zoo_state
ZOOAPIintzoo_state(zhandle_t*zh);
功能:
获取zookeeper连接状态。
参数:
zh:
zookeeper的句柄,由zookeeper_init得到。
返回值:
ZOKoperationcompletedsuccessfully
*ZNONODEtheparentnodedoesnotexist.
*ZNODEEXISTSthenodealreadyexists
*ZNOAUTHtheclientdoesnothavepermission.
*ZNOCHILDRENFOREPHEMERALScannotcreatechildrenofephemeralnodes.
*\paramdataThedatathatwillbepassedtothecompletionroutinewhenthe
*functioncompletes.
*\returnZOKonsuccessoroneofthefollowingerrcodesonfailure:
*ZBADARGUMENTS-invalidinputparameters
*ZINVALIDSTATE-zhandlestateiseitherZOO_SESSION_EXPIRED_STATEorZOO_AUTH_FAILED_STATE
*ZMARSHALLINGERROR-failedtomarshallarequest;possibly,outofmemory
第4章客户端CAPI编译
4.1Linux平台编译
✓解压缩源代码包,cd到zookeeper-x.x.x/src/c目录
✓执行./configure
对于这一步,configure工具支持下述有用的选项:
--enable-debug 启用优化和调试信息。
(默认是禁用的)
--without-syncapi 禁止同步API支持,不创建zookeeper_mt库。
(默认是启用的)
--disable-static 不创建静态库。
(默认是启用的)
--disable-shared 不创建共享库。
(默认是启用的)
注意:
关于执行configure的一般信息,请看INSTALL文件。
✓编译好的动态库存放在zookeeper-3.4.6/src/c/.libs/目录下。
✓执行make或者makeinstall,创建并且安装库。
✓要生成ZooKeeperAPI的doxygen文档,可执行doxygen-doc。
所有文档将放置到docs子目录中。
默认情况下,这个命令只生成HTML。
关于其他文档格式的信息,请执行./congiure--help。
4.2Window平台编译
✓解压缩源代码包,cd到zookeeper-x.x.x/src/c目录
✓目录下有VS工程,打开工程编译即可
第5章zookeeper客户端命令
ZooKeeper命令行工具类似于Linux的shell环境,可以简单的对ZooKeeper进行访问,数据创建,数据修改等操作. 使用zkCli.sh-server127.0.0.1:
2181连接到ZooKeeper服务,连接成功后,系统会输出ZooKeeper的相关环境以及
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- zookeeper使用总结文档 初级 zookeeper 使用 总结 文档