要想学习分布式应用,ZooKeeper是一个绕不过去的基础系统。它为大型分布式计算提供开源的分布式配置服务、同步服务和命名注册。java
今天先介绍系统的安装和基本使用,后续会推一些基本的Java使用代码。node
https://www.apache.org/dyn/closer.cgi/zookeeper/,下载最新的ZooKeeper程序,当前最新版本是3.5.5,要求JDK在1.8以上。git
将下载的apache-zookeeper-3.5.5-bin.tar.gz文件使用命令tar -xzvf 解压到 /usr/java 目录,并将原目录名修改成zookeeper-3.5.5。github
进入zookeeper-3.5.5目录并建立两个子目录 data 和logs。数据库
# mkdir data logsapache # echo 建立一个惟一的zookeeper实例号,我是用IP最后一个字节编程 # cd datavim # vim myid // 输入 128 后保存退出bash 128服务器 # echo 复制 zoo_sample.cfg 为 zoo.cfg # cp zoo_sample.cfg zoo.cfg # 修改参数 dataDir # vim zoo.cfg dataDir=/var/lib/zookeeper
|
而后修改 /etc/profile,增长修改相应的环境变量
# vim /etc/profile export PGDATA=/usr/java/postgres/data ZOOKEEPER_HOME=/usr/java/zookeeper-3.5.5 PATH=$ZOOKEEPER_HOME/bin:$PATH export ZOOKEEPER_HOME PATH # zkServer.sh start //启动服务 # zkServer.sh status //查看服务状态 # zkServer.sh stop //中止服务 |
Zookeeper使用的默认端口是2181,能够在conf/zoo.cfg中修改这个端口号。安装完成后,须要在防火墙开启端口
# firewall-cmd --zone=public --add-port=2181/tcp –permanent # firewall-cmd –reload |
建立自动启动的脚本
# cd /etc/rc.d/init.d # touch zookeeper # chmod +x zookeeper # vim zookeeper #!/bin/bash #chkconfig:2345 10 90 #description:service zookeeper
#set java environment JAVA_HOME=/usr/java/jdk8u222-b10 JRE_HOME=/usr/java/jdk8u222-b10/jre CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin export JAVA_HOME JRE_HOME CLASS_PATH PATH
export PGDATA=/usr/java/postgres/data ZOOKEEPER_HOME=/usr/java/zookeeper-3.5.5 PATH=$ZOOKEEPER_HOME/bin:$PATH
export PATH ZOOKEEPER_HOME
su root ${ZOOKEEPER_HOME}/bin/zkServer.sh "$1"
// 添加到启动脚本 # chkconfig --add zookeeper
// 手工启动 # service start zookeeper |
命令行链接到zookeeper
# zhCli.sh -server 127.0.0.1:2181
尝试输入help查看可用的命令,列出了命令,发现其实没有help命令。
输入ls,查看根目录下有哪些节点
尝试建立一个新的节点,并设置一个字符串,而后使用命令get查看已经建立的节点。
尝试为/hello从新赋值
赋值命令执行后,控制台收到了一条通知事件:/hello值已经被修改。从新查看这个值,发现它的版本(dataVersion)已经从0变为1。
再执行删除命令,删掉这个节点
在Windows上,能够安装zkui这个ZooKeeper的客户端,下载网址:https://github.com/echoma/zkui/wiki/Download 。
下载解压后,直接运行 zkui.exe,弹出来链接页面。
在Host部分输入ZooKeeper的地址和端口,点击Login按钮后,左边窗口列出Root下的全部zNode。使用比较简单,本身摸索几分钟就都会了。
在评估、开发、测试环境,使用一台ZooKeeper就能够了,但在生产环境应该配置为多点复制模式。同一个应用多台服务器复制部署的状况,术语叫 quorum,全部的服务器使用相同的配置文件。
复制模式部署,最少须要三台服务器,而且服务器的总数最好是奇数。复制模式部署,配置文件 conf/zoo.cfg同单点模式差很少,有一些不一样,如:
dataDir=/var/lib/zookeeper clientPort=2181 tickTime=2000 initLimit=5 syncLimit=2 server.128=zoo1:2888:3888 server.129=zoo2:2888:3888 server.130=zoo3:2888:3888 |
在配置文件中,initLimit是集群中ZooKeeper Server链接到leader的超时时间;syncLimit是服务器的超时时间。这两个参数,使用的时间单位都是tickTime,initLimit值为5,最终表明的是10秒;syncLimit值为2,最终表明的是4秒。
列表server.X构成了整个ZooKeeper服务,当服务启动的时候,会读取data/myid文件,获取本身的编号。
在server后面有两个端口号:"2888"和"3888"。ZooKeeper服务器之间使用这两个端口进行通讯。若是使用同一台机器安装多个ZooKeeper实例搭建集群,每一个实例应该使用不一样的端口,如:2888:3888/2889:3889/2890:3890;另外,每一个实例的dataDir和clientPort也应该不一样。
ZooKeeper使用层级命名空间,相似一个分布式文件系统。区别在于目录节点也能够绑定数据,相似于一个文件系统,一个文件同时也是一个目录。ZooKeeper不支持相对路径。Unicode字符均可以出如今名称中,除了下面的一些特例:
在ZooKeeper树中,每个节点就是一个znode。Znode包括一个stat结构,含数据修改的版本号,以及acl版本号,时间戳。每次一个znode节点的数据发生变化,版本号都会增长。当客户端读取数据时,也会把数据的版本号一并取回去。当客户端尝试修改或删除一个znode时,须要提供尝试修改节点的版本号。若是提供的版本号同系统中当前的版本号不一致,更新失败。(相似于数据库的乐观锁实现)
ZNodes是程序访问的实体,有几个须要了解的特性:
经过多种方式跟踪时间
节点的Stat结构有以下属性
ZooKeeper的全部读操做getData()、getChildren()和exists()都有一个备选参数:设置watch。ZooKeeper Watch的定义:是一次性的触发器,当数据发生变化时,向设置了watch的客户端发送消息。有三个关键点:
ZooKeeper使用ACL控制节点的读写权限。父子节点的读写权限是独立的,不递归。
ZooKeeper支持的几种权限:
ZooKeeper内置的受权对象