zookeeper简介
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。(以上摘自百度百科~)
环境准备
- 下载zookeeper
前往官网下载最新的稳定版,链接为https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/stable/
我下载已经编译好的apache-zookeeper-3.5.6-bin.tar.gz,注意下载apache-zookeeper-3.5.6.tar.gz的话需要自己编译,不注意的话会被坑的很惨。 - 解压并配置zookeeper
这里我使用的是linux环境,windows环境也是可以的。
#上传文件到linux服务器使用tar命令解压
tar -zxvf apache-zookeeper-3.5.6-bin.tar.gz
#根据自己需要更改目录名称
mv apache-zookeeper-3.5.6 zookeeper-3.5.6
#进入到zookeeper目录
cd zookeeper-3.5.6
#复制配置文件
cp conf/zoo_sample.cfg conf/zoo.conf
#根据需要修改相关配置 这里我只修改了data目录
vi conf/zoo.conf
3. 启动zookeeper服务并进行测试
#使用zkServer-initialize.sh初始化一下,当然也可以自己手动建立响应目录
bin/zkServer-initialize.sh
#这里我们查看zookeeper启动脚本的命令
bin/zkServer.sh
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.5.6/bin/../conf/zoo.cfg
Usage: zookeeper-3.5.6/bin/zkServer.sh [--config <conf-dir>] {start|start-foreground|stop|restart|status|print-cmd}
#这里我们使用start启动zookeeper服务
bin/zkServer.sh start
#出现如下输出即为启动成功
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.5.6/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
#使用zookeeper cli进入测试一下
bin/zkCli.sh
#出现如下输出即为连接成功
[zk: localhost:2181(CONNECTED) 0]
#查看一下znode
ls /
#只有一个zookeeper
[zookeeper]
#我们来创建一个znode用来测试
create /test
#设置一个值
set /test checkcheck
#获取值
get /test
checkcheck
#删除值
delete /test
Java连接测试
- 将zookeeper安装目录下的/lib目录里jar包复制到java的lib目录
- 创建测试类并实现Watcher接口,代码如下:
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;
import java.util.concurrent.CountDownLatch;
/**
* @Auther: hustle
* @Date: 2019/12/4 14:07
* @Description:测试连接zookeeper获取值
*/
public class TestZookeeper implements Watcher {
//程序计数器 用来阻塞线程
private static CountDownLatch connectedSemaphore = new CountDownLatch(1);
private static ZooKeeper zk = null;
private static Stat stat = new Stat();
public static void main(String[] args) throws Exception {
//zookeeper配置数据存放路径
String path = "/test";
//连接zookeeper并且注册一个默认的监听器
zk = new ZooKeeper("10.1.0.16:2181", 5000, //
new TestZookeeper());
//等待zk连接成功的通知
connectedSemaphore.await();
//获取path目录节点的配置数据,并注册默认的监听器
System.out.println(new String(zk.getData(path, true, stat)));
Thread.sleep(Integer.MAX_VALUE);
}
@Override
public void process(WatchedEvent watchedEvent) {
if (Event.KeeperState.SyncConnected == watchedEvent.getState()) { //zk连接成功通知事件
if (Event.EventType.None == watchedEvent.getType() && null == watchedEvent.getPath()) {
connectedSemaphore.countDown();
} else if (watchedEvent.getType() == Event.EventType.NodeDataChanged) { //zk目录节点数据变化通知事件
try {
System.out.println("Recieved change:" + new String(zk.getData(watchedEvent.getPath(), true, stat)));
} catch (Exception e) {
}
}
}
}
}
启动java程序会得到zookeeper中znode/test的值并在控制台打印
这里我们在zookeeper上修改一下znode /test的值,java程序会同步获取到修改会的值,如下图所示:
好了,本篇博客到此结束,下次再会~