ZooKeeper官方网站
官方文档
3.4.5
ZooKeeper安装
文件夹创建
mkdir data
mkdir log
配置文件修改
zoo.cfg
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg
dataDir=/usr/local/src/zookeeper_3.4.5/data
dataLogDir=/usr/local/src/zookeeper_3.4.5/log
server.1=master:2888:3888
server.2=slave1:2888:3888
server.3=slave2:2888:3888
myid
echo "1" > /usr/local/src/zookeeper_3.4.5/data/myid
echo "2" > /usr/local/src/zookeeper_3.4.5/data/myid
echo "3" > /usr/local/src/zookeeper_3.4.5/data/myid
环境变量配置
vim ~/.bashrc
export ZOOKEEPER_HOME=/usr/local/src/zookeeper_3.4.5
export PATH=$PATH:$ZOOKEEPER_HOME/bin
ZooKeeper服务启动
zkServer.sh start
zkServer.sh status
ZooKeeper 3.4 Documentation
Overview
Overview
Design Goals
-
ZooKeeper允许分布式进程通过共享的分级命名空间相互协调,该命名空间的组织方式与标准文件系统类似,名称空间由数据寄存器(ZooKeeper术语称为znode)组成,与文件和目录类似 -
与设计用于存储的典型文件系统不同,
ZooKeeper的数据保存在内存中,这意味着ZooKeeper可以实现高吞吐量和低延迟 -
与它所协调的分布式进程一样,
ZooKeeper本身也是在一组被称为集合的主机上进行复制

- 组成
ZooKeeper服务的服务器必须相互了解,它们在持久存储中维护着内存中的状态映像,以及事务日志和快照 - 客户端连接到一个
ZooKeeper服务器,客户端维护一个TCP连接,通过该连接发送请求、获取响应、获取观察事件并发送心跳,如果与服务器的TCP连接中断,客户端将连接到另一个服务器 ZooKeeper会给每次更新打上一个编号,以反映所有ZooKeeper事务的顺序ZooKeeper应用程序可在数千台机器上运行,在读取比写入更频繁的情况下,它的性能最佳,读写比约为 10 : 1 10:1 10:1
Data model and the hierarchical namespace

Nodes and ephemeral nodes
- 与标准文件系统不同的是,
ZooKeeper命名空间中的每个节点都可以拥有与之相关的数据和子节点 - 使用
znode一词是为了明确谈论的是ZooKeeper数据节点 znode维护一个统计结构,其中包括数据更改的版本号、ACL更改和时间戳,以便进行缓存验证和协调更新,每次znode的数据发生变化,版本号就会增加,例如,每当客户端检索数据时,它也会收到数据的版本- 命名空间中每个
znode上存储的数据都是以原子方式读写的 ZooKeeper还有临时节点的概念,只要创建znode的会话处于活动状态,这些znode就会存在,当会话结束时,znode就会被删除
Conditional updates and watches
ZooKeeper支持watch概念,客户端可以对znode设置watch,当znode发生变化时,将触发并移除watch
Guarantees
- 顺序一致性:客户端的更新将按照发送顺序应用
- 原子性:更新要么成功,要么失败,没有部分结果
- 单一系统映像:客户端无论连接到哪个服务器,都能看到相同的服务视图
- 可靠性:更新一旦应用,就会一直持续下去,直到客户端覆盖更新
- 及时性:保证客户对系统的视图在一定时限内是最新的
Simple API
create:在树中的某个位置创建节点delete:删除节点exists:测试某个位置是否存在节点get data:读取节点的数据set data:向节点写入数据get children:获取节点的子节点列表sync:等待数据传播
Implementation
- 除
Request Processor外,组成ZooKeeper服务的每台服务器都会复制各自组件的副本

Replicated Database是一个内存数据库,包含整个数据树,更新会被记录到磁盘上,以便于恢复,而写入会被序列化到磁盘上,然后再应用到内存数据库中- 作为协议的一部分,所有来自客户端的写入请求都会转发给一台服务器,这台服务器被称为
Leader,其余的ZooKeeper服务器(称为Follower)会接收Leader的信息提议,并就信息传递达成一致,消息层负责在失败时替换Leader,并同步Follower和Leader ZooKeeper使用自定义的原子消息传递协议,当Leader收到写入请求时,它会计算出要写入时的系统状态,并将其转化为一个事务,以捕捉这一新状态
Performance
- 读写比例变化时的
ZooKeeper吞吐量

Reliability

- ①
Follower的失败和恢复 - ②不同
Follower的失败和恢复 - ③
Leader的失败 - ④两个
Follower的失败和恢复 - ⑤另一位
Leader的失败
Getting Started
Standalone Operation
- 要启动
ZooKeeper,需要一个配置文件
tickTime=2000
dataDir=/var/lib/zookeeper
clientPort=2181
-
tickTime:ZooKeeper使用的基本时间单位(毫秒),它用于心跳,最小会话超时时间是tickTime的两倍 -
dataDir:存储内存数据库快照的位置,除非另有说明,还包括数据库更新的事务日志 -
clientPort:客户端连接的侦听端口 -
创建配置文件后,即可启动
ZooKeeper
bin/zkServer.sh start
ZooKeeper使用log4j记录信息
Connecting to ZooKeeper
ZooKeeper运行后,有几种连接方式可供选择Java使用
bin/zkCli.sh -server 127.0.0.1:2181
C使用:在ZooKeeper源代码的src/c子目录下运行make cli_mt或make cli_st,编译cli_mt(多线程)或cli_st(单线程),可以使用以下命令从src/c运行程序
LD_LIBRARY_PATH=. cli_mt 127.0.0.1:2181
LD_LIBRARY_PATH=. cli_st 127.0.0.1:2181
- 连接完成后,应该看到如下内容
Connecting to localhost:2181
log4j:WARN No appenders could be found for logger (org.apache.zookeeper.ZooKeeper).
log4j:WARN Please initialize the log4j system properly.
Welcome to ZooKeeper!
JLine support is enabled
[zkshell: 0]
[zkshell: 0] help
ZooKeeper host:port cmd args
get path [watch]
ls path [watch]
set path data [version]
delquota [-n|-b] path
quit
printwatches on|off
createpath data acl
stat path [watch]
listquota path
history
setAcl path acl
getAcl path
sync path
redo cmdno
addauth scheme auth
delete path [version]
setquota -n|-b val path
- 发出列表命令,如
ls命令
[zkshell: 8] ls /
[zookeeper]
- 运行
create /zk_test my_data创建一个新的znode,这会创建一个新的znode,并将字符串my_data与该节点关联起来
[zkshell: 9] create /zk_test my_data
Created /zk_test
- 运行
get命令来验证数据是否与znode相关联
[zkshell: 12] get /zk_test
my_data
cZxid = 5
ctime = Fri Jun 05 13:57:06 PDT 2009
mZxid = 5
mtime = Fri Jun 05 13:57:06 PDT 2009
pZxid = 5
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0
dataLength = 7
numChildren = 0
- 发出
set命令来更改与zk_test相关的数据
[zkshell: 14] set /zk_test junk
cZxid = 5
ctime = Fri Jun 05 13:57:06 PDT 2009
mZxid = 6
mtime = Fri Jun 05 14:01:52 PDT 2009
pZxid = 5
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0
dataLength = 4
numChildren = 0
[zkshell: 15] get /zk_test
junk
cZxid = 5
ctime = Fri Jun 05 13:57:06 PDT 2009
mZxid = 6
mtime = Fri Jun 05 14:01:52 PDT 2009
pZxid = 5
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0
dataLength = 4
numChildren = 0
- 删除节点
[zkshell: 16] delete /zk_test
[zkshell: 17] ls /
[zookeeper]
[zkshell: 18]
Running Replicated ZooKeeper
- 在复制模式下,
Quorum中的所有服务器都有相同配置文件的副本
tickTime=2000
dataDir=/var/lib/zookeeper
clientPort=2181
initLimit=5
syncLimit=2
server.1=zoo1:2888:3888
server.2=zoo2:2888:3888
server.3=zoo3:2888:3888
- 新条目
initLimit是ZooKeeper用来限制Quorum中的ZooKeeper服务器连接到Leader的超时时间 - 条目
syncLimit限制了服务器与Leader之间过时的程度 - 形式为
server.X的条目列出了组成ZooKeeper服务的服务器,当服务器启动时,它会通过查找数据目录中的myid文件来知道自己是哪台服务器 - 注意每个服务器名称后面的两个端口号
2888
2888
2888和
3888
3888
3888,对等设备使用前一个端口连接其他对等设备,这种连接是必要的,这样对等设备才能进行通信,例如商定更新的顺序,更具体地说,
ZooKeeper服务器使用该端口将Follower连接到Leader,当出现新的Leader时,Follower会使用该端口打开与Leader的TCP连接,由于默认的Leader选举也使用TCP,需要另一个端口来进行Leader选举,这是服务器条目中的第二个端口
Other Optimizations
- 要想降低更新延迟,必须有一个专用的事务日志目录
- 默认情况下,事务日志与数据快照和
myid文件放在同一目录下 dataLogDir参数表示要用于事务日志的不同目录
2834

被折叠的 条评论
为什么被折叠?



