Zookeeper简介
初识Zookeeper
Zookeeper是一个为分布式应用提供协同服务的组件。它提供了一系列简便的功能给分布式系统实现更高等级的同步、配置管理、分组及命名。它设计的非常容易开发,使用了一种跟树形文件系统非常相似的数据模型。 Zookeeper使用Java的运行环境,能使用Java和C进行操作。
Zookeeper是非常简单的。Zookeeper通过一种可共享的继承式的命名空间让分布式程序之间相互协同,这种数据模型类似一个精简的文件系统。和一般的文件系统是为了存储数据不一样,Zookeeper的是数据是保存在内存中,这意味着高吞吐量和低延迟。
Zookeeper保证了高性能、高可用性和严格的访问顺序。它的高性能意味着能用在节点规模庞大的分布式系统中,高可用性使其避免了单点问题,严格的访问顺序使其客户端能实现精确的分布式协同。
Zookeeper的集群模式
Zookeeper是可集群的。很多分布式系统数据和执行程序都在各个节点上复制一份,Zookeeper也不例外。
Zookeeper通过存储的操作日志进行执行更新动作,各个节点之间能互相感知并通过保持数据的一致性。只要大多数服务器可用,整个Zookeeper集群就是可用的。客户端通过访问TCP访问Zookeeper服务器,包括request、response和心跳检测等。客户端一次只连接一台服务器,当连接的这台服务器不能访问后,会连接至另一台服务器。
Zookeeper的数据模型
Zookeeper的数据模型非常像标准文件系统,它使用分割符(/)来分割元素的各部分,Zookeeper每个节点都被定义为路径。和标准文件系统不同的是Zookeeper命名空间的节点既可以包含数据也能包含子节点,就好像文件系统的节点既可以是文件也可以是目录。Zookeeper被设计用来存储协同数据(状态信息、配置、路径),所以数据的存储量是非常轻量级的(几千节点)。为了更清晰的描述这个节点Zookeeper把它称之为znode.
Zookeeper有瞬时节点(ephemeral nodes)的概念,这些节点只有在创建它的会话(Session)存在时有效。当创建它的会话结束生命周期时,它也一并被删除。
Zookeeper的安装和运行
下载zookeeper
cd /usr/local/src
wget http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.9/zookeeper-3.4.9.tar.gz
安装
tar -zxvf zookeeper-3.4.9.tar.gz -C /usr/local/
mv zookeeper-3.4.9 zookeeper
cp /usr/local/zookeeper/conf/zoo_sample.cfg /usr/local/zookeeper/conf/zoo.cfg
编辑zookeeper的参数
- vi /usr/local/zookeeper/conf/zoo.cfg 配置的内容如下
# zookeeper最基本的时间单位(毫秒),它被用作检测心跳,Session最小的超时时间为tickTime的两倍
tickTime=2000
# 内存数据快照存储的地方,注意别使用/tmp目录;如没特别指定,操作的日志会存储至此
dataDir=/var/zookeeper
# 通讯端口
clientPort=2181
# initLimit is timeouts ZooKeeper uses to limit the length of time the ZooKeeper servers in quorum have to connect to a leader
# 允许各follower和leader之间的连接时间,超过tickTime*initLimit时会重新投票选举leader
initLimit=10
# leader和follower之间的能容忍的心跳检测时间,超过tickTime*syncLimit则从follower列表里剔除超时的follower
syncLimit=5
注:initLimit和syncLimit这两个参数集群模式下使用的
设置环境变量
- vi /etc/profile 在底部加入以下内容
ZOOKEEPER_HOME=/usr/local/zookeeper
PATH=$PATH:$ZOOKEEPER_HOME/bin
export PATH
- 使profile起作用: source /etc/profile
启动和关闭
zkServer.sh start #启动
zkServer.sh stop #关闭zookeeper
由于已配置环境变量,可以直接使用zkServer.sh start启动Zookeeper
[root@localhost zookeeper]# zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
Zookeeper的简单操作
客户端连接
zkCli.sh
查看zk的目录
[zk: localhost:2181(CONNECTED) 0] ls /
[zookeeper]
创建一个znode
[zk: localhost:2181(CONNECTED) 1] create /massive this_is_massive_data
Created /massive
[zk: localhost:2181(CONNECTED) 2] ls /
[massive, zookeeper]
查看节点
[zk: localhost:2181(CONNECTED) 3] get /massive
this_is_massive_data
cZxid = 0x8
ctime = Sat Dec 10 23:01:03 PST 2016
mZxid = 0x8
mtime = Sat Dec 10 23:01:03 PST 2016
pZxid = 0x8
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 20
numChildren = 0
更改节点内容
[zk: localhost:2181(CONNECTED) 4] set /massive this_data_has_changed
cZxid = 0x8
ctime = Sat Dec 10 23:01:03 PST 2016
mZxid = 0x9
mtime = Sat Dec 10 23:02:48 PST 2016
pZxid = 0x8
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 21
numChildren = 0
[zk: localhost:2181(CONNECTED) 5] get /massive
this_data_has_changed
cZxid = 0x8
ctime = Sat Dec 10 23:01:03 PST 2016
mZxid = 0x9
mtime = Sat Dec 10 23:02:48 PST 2016
pZxid = 0x8
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 21
numChildren = 0
删除节点
[zk: localhost:2181(CONNECTED) 6] delete /massive
[zk: localhost:2181(CONNECTED) 7] ls /
[zookeeper]