一、zookeeper安装
Zookeeper 是一个用于维护配置信息、命名、提供分布式同步和提供组服务的注册中心,并使用树形结构管理数据,以“/”作为根节点,每个节点znode既可以存放其他节点znode地址,也可以存放一个具体的值,每个znode上都有一套状态信息:stat。
1、linux系统上传zookeeper-3.4.9.tar.gz
2、解压`tar -zxvf /opt/zookeeper-3.4.9.tar.gz
3、配置配置文件
/conf/zoo_sample.cfg 需改为conf/zoo.cfg
dataDir=/opt/zookeeper-3.4.9/data 4.6在zoo.cfg中配置数据目录的位置
4、创建数据库目录mkdir xx/xx/zookeeper-3.4.9/data
二、相关命令
1、服务器
./zkServer.sh start //启动
./zkServer.sh stop //停止
./zkServer.sh status //查询状态
2、客户端
注意:针对节点的操作都必须基于根节点逐级进行
./zkCli.sh -server locahost:port 登陆
ls : 查看当前znode中所包含的内容
ls2: 增强版ls,查看当前节点数据并能看到更新次数等数据
stat : 查看节点状态
create [-s] [-e] path data acl :创建节点,不带有-s、-e参数为普通创建,-s:含有序列-e:临时(重启或者超时消失),acl登陆权限设置
set :设置节点的具体值
get :获取节点值
delete:删除节点(不能含有子节点)
rmr:递归删除,删除当前节点和子节点
quit:退出
3、四字命令
通过telnet或nc向ZooKeeper提交相应命令,nc命令需要安装对应的程序才可以使用。yum install -y nc
例:echo ruok | nc localhost 2181
ruok:测试服务是否处于正确状态。如果确实如此,那么服务返回“imok ”,否则不做任何响应
stat:输出关于性能和连接的客户端的列表
conf:输出相关服务配置的详细信息
cons:列出所有连接到服务器的客户端的完全的连接 /会话的详细信息。包括“接受 / 发送”的包数量、会话id 、操作延迟、最后的操作执行等等信息
dump:列出未经处理的会话和临时节点
envi:输出关于服务环境的详细信息(区别于conf命令)
reqs:列出未经处理的请求
wchs:列出服务器watch的详细信息
wchc:通过session列出服务器watch的详细信息,它的输出是一个与watch相关的会话的列表
wchp:通过路径列出服务器 watch的详细信息。它输出一个与 session相关的路径
三、节点类型
1、PERSISTENTper-持久化目录节点
客户端与zookeeper断开连接后,该节点依旧存在
2、PERSISTENT_SEQUENTIAL-持久化顺序编号目录节点
客户端与zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号
3、EPHEMERAL-临时目录节点
客户端与zookeeper断开连接后,该节点被删除
4、EPHEMERAL_SEQUENTIAL-临时顺序编号目录节点
客户端与zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号
四、异步通知机制
客户端注册监听它关心的目录节点,当目录节点发生变化(数据改变、被删除、子目录节点增加删除)时,zookeeper会通知客户端。
ZooKeeper的观察机制是一种异步回调的触发机制,zookeeper支持Watch(观察)机制,客户端可以在每个znode结点上设置一个Watcher(观察者),如果被观察服务端的znode结点有变更,那么Watcher就会被触发,这个Watcher所属的客户端将接收到一个通知包被告知结点已经发生变化。,这是个一次性动作,触发一次就失效了。
可以通过递归调用达到持续观测的目的:
// 专门封装一个方法用来实现持续的异步监听
public void getNodeData(String path, ZooKeeper zooKeeper) throws KeeperException, InterruptedException {
// 调用获取节点值的方法时设置Watcher进行监控
byte[] data = zooKeeper.getData(path, new Watcher() {
@Override
public void process(WatchedEvent event) {
// 接收到异步通知时,再次调用获取节点值方法,目的是设置新的Watcher
try {
getNodeData(path, zooKeeper);
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, new Stat());
五、集群
1、搭建集群环境
第1步:创建集群所在目录
mkdir /opt/cluster-zk
第2步:重新解压tar包到集群目录
tar -zxvf /opt/zookeeper-3.4.9.tar.gz -C /opt/cluster-zk/
第3步:复制新的解压目录
cp -r /opt/cluster-zk/zookeeper-3.4.9/ /opt/cluster-zk/zkone
第4步:配置zkone
i:创建zoo.cfg配置文件
cp /opt/cluster-zk/zkone/conf/zoo_sample.cfg /opt/cluster-zk/zkone/conf/zoo.cfg
ii:创建数据目录
mkdir /opt/cluster-zk/zkone/data
iii:在数据目录中创建编号文件
vim /opt/cluster-zk/zkone/data/myid
iv:编辑编号文件,内容就是当前服务器实例的编号
1
v:配置zoo.cfg
dataDir=/opt/cluster-zk/zkone/data
clientPort=1000
server.1=127.0.0.1:1001:1002
server.2=127.0.0.1:2001:2002
server.3=127.0.0.1:3001:3002
第5步:配置zktwo
i:把zktwo复制出来
cp -r /opt/cluster-zk/zkone /opt/cluster-zk/zktwo
ii:修改myid文件中编号值,将1改成2
vim /opt/cluster-zk/zktwo/data/myid
iii:修改zoo.cfg
dataDir=/opt/cluster-zk/zktwo/data
clientPort=2000
第6步:配置zkthree
i:把zkthree复制出来
cp -r /opt/cluster-zk/zkone /opt/cluster-zk/zkthree
ii:修改myid文件中编号值,将1改成3
vim /opt/cluster-zk/zkthree/data/myid
iii:修改zoo.cfg
dataDir=/opt/cluster-zk/zkthree/data
clientPort=3000
2、创建操作服务器的可执行脚本
(1)创建文件
/opt/cluster-zk/start.sh
/opt/cluster-zk/stop.sh
/opt/cluster-zk/status.sh
(2)编辑启动服务器命令
/opt/cluster-zk/zkone/bin/zkServer.sh start
/opt/cluster-zk/zktwo/bin/zkServer.sh start
/opt/cluster-zk/zkthree/bin/zkServer.sh start
(3)编辑停止服务器命令
/opt/cluster-zk/zkone/bin/zkServer.sh stop
/opt/cluster-zk/zktwo/bin/zkServer.sh stop
/opt/cluster-zk/zkthree/bin/zkServer.sh stop
(4)编辑查看服务器状态命令
/opt/cluster-zk/zkone/bin/zkServer.sh status
/opt/cluster-zk/zktwo/bin/zkServer.sh status
/opt/cluster-zk/zkthree/bin/zkServer.sh status
(5)给脚本文件设置可执行权限
chmod 755 /opt/cluster-zk/start.sh
chmod 755 /opt/cluster-zk/stop.sh
chmod 755 /opt/cluster-zk/status.sh
(6)执行脚本
/opt/cluster-zk/start.sh
/opt/cluster-zk/stop.sh
/opt/cluster-zk/status.sh
(7)客户端登录
/opt/zookeeper-3.4.9/bin/zkCli.sh -server 127.0.0.1:1000
/opt/zookeeper-3.4.9/bin/zkCli.sh -server 127.0.0.1:2000
/opt/zookeeper-3.4.9/bin/zkCli.sh -server 127.0.0.1:3000
注意:一般来说,集群中服务器数量最好设置为单数,集群中有超过一半的服务器正常工程,则整个集群判断为正常工作。对外提供服务时大致满足预期。