1.安装zookeeper环境
1.官网:https://zookeeper.apache.org/
2.将zookeeper-3.4.11.tar.gz拷贝进入到/opt目录下并解压
3.新建专属zookeeper目录,mkdir /myzookeeper,
随后将上一步解压的zookeeper内容拷贝进/myzookeeper目录内
cp -r zookeeper-3.4.11 /myzookeeper/ -- -r 参数表示递归拷贝
4.启动zookeeper(启动Zookeeper服务之前需要先安装好Java环境)
到/myzookeeper/zookeeper-3.4.9/bin路径下,执行./zkServer.sh start
查看zk是否启动的几种方法如下:
1)ps -ef|grep 2181/zookeeper
2)netstat -anp|grep 2181
3)echo ruok |nc 127.0.0.1 2181 如果输出imok说明启动成功
5.客户端连接zk服务: ./zkCli.sh
退出:quit
6.关闭zk服务
./zkServer.sh stop
搭建zookeeper集群
1.zookeeper-3.4.11.tar.gz解压后拷贝到/myzookeeper目录下并重新名为zk01,
再复制zk01形成zk02、zk03,共计3份。
2.进入zk01/02/03分别新建文件夹mydata和mylog
3.分别进入zk01-zk03各自的conf文件夹,新建zoo.cfg
4.编辑zoo.cfg,设置自己的数据和log路径
dataDir=/myzookeeper/zk01/mydata
dataLogDir=/myzookeeper/zk01/mylog
5.在各自mydata下面创建myid的文件,在里面写入server的数字
6.分别启动三个服务器,到bin目录下启动脚本
./zkServer.sh start
7.zkCli连接server,带参数指定-server
zkCli -server 127.0.0.1 2191
2.Java程序连接Zookeeper
注:此处我创建的是简单的springboot的工程
1)java客户端操作
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.atsuifeng</groupId>
<artifactId>Zookeeper</artifactId>
<version>1.0-SNAPSHOT</version>
<name>Zookeeper</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.zookeeper/zookeeper -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.9</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
<!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
<plugin>
<artifactId>maven-site-plugin</artifactId>
<version>3.7.1</version>
</plugin>
<plugin>
<artifactId>maven-project-info-reports-plugin</artifactId>
<version>3.0.0</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
package com.atsuifeng;
import org.apache.log4j.Logger;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;
import java.io.IOException;
public class HelloZK {
/**
* Logger for this class
*/
private static final Logger logger = Logger.getLogger(HelloZK.class);
private static final String CONNECTSTRING = "192.168.126.130:2181";
private static final String PATH = "/atsuifeng";
private static final int SESSION_TIMEOUT = 50 * 1000;
public ZooKeeper startZK() throws IOException {
return new ZooKeeper(CONNECTSTRING, SESSION_TIMEOUT, new Watcher() {
@Override
public void process(WatchedEvent event) {
}
});
}
public void stopZK(ZooKeeper zk) throws InterruptedException {
if (zk != null) {
zk.close();
}
}
public void createZNode(ZooKeeper zk, String path, String nodeValue) throws KeeperException, InterruptedException {
zk.create(path, nodeValue.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
}
public String getZNode(ZooKeeper zk, String path) throws KeeperException, InterruptedException {
byte[] byteArray = zk.getData(path, false, new Stat());
return new String(byteArray);
}
public static void main(String[] args) throws IOException, KeeperException, InterruptedException {
HelloZK hello = new HelloZK();
ZooKeeper zk = hello.startZK();
Stat stat = zk.exists(PATH, false);
if (stat == null) {
hello.createZNode(zk, PATH, "suifeng");
String result = hello.getZNode(zk, PATH);
System.out.println("**********result: " + result);
} else {
System.out.println("***********znode has already ok***********");
}
hello.stopZK(zk);
}
}
2).watch事件一次性触发
package com.atsuifeng;
import java.io.IOException;
import org.apache.log4j.Logger;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.data.Stat;
public class WatchOne {
/**
* Logger for this class
*/
private static final Logger logger = Logger.getLogger(HelloZK.class);
//定义常量
private static final String CONNECTSTRING = "192.168.126.130:2181";
private static final String PATH = "/atsuifeng3";
private static final int SESSION_TIMEOUT = 50 * 1000;
//定义实例变量
private ZooKeeper zk = null;
//以下为业务方法
public ZooKeeper startZK() throws IOException {
return new ZooKeeper(CONNECTSTRING, SESSION_TIMEOUT, new Watcher() {
@Override
public void process(WatchedEvent event) {
}
});
}
public void stopZK() throws InterruptedException {
if (zk != null) {
zk.close();
}
}
public void createZNode(String path, String nodeValue) throws KeeperException, InterruptedException {
zk.create(path, nodeValue.getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
}
public String getZNode(String path) throws KeeperException, InterruptedException {
byte[] byteArray = zk.getData(path, new Watcher() {
@Override
public void process(WatchedEvent event) {
try {
triggerValue(path);
} catch (KeeperException | InterruptedException e) {
e.printStackTrace();
}
}
}, new Stat());
return new String(byteArray);
}
public String triggerValue(String path) throws KeeperException, InterruptedException {
byte[] byteArray = zk.getData(path, false, new Stat());
String retValue = new String(byteArray);
System.out.println("**************triggerValue: " + retValue);
return retValue;
}
public static void main(String[] args) throws IOException, KeeperException, InterruptedException {
WatchOne watchOne = new WatchOne();
watchOne.setZk(watchOne.startZK());
if (watchOne.getZk().exists(PATH, false) == null) {
watchOne.createZNode(PATH, "BBB");
System.out.println("**********************>: " + watchOne.getZNode(PATH));
Thread.sleep(Long.MAX_VALUE);
} else {
System.out.println("i have znode");
}
}
//setter---getter
public ZooKeeper getZk() {
return zk;
}
public void setZk(ZooKeeper zk) {
this.zk = zk;
}
}
3)watch事件多次触发
package com.atsuifeng;
import org.apache.log4j.Logger;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;
import java.io.IOException;
public class WatchMore {
/**
* Logger for this class
*/
private static final Logger logger = Logger.getLogger(WatchMore.class);
//定义常量
private static final String CONNECTSTRING = "192.168.126.130:2181";
private static final String PATH = "/suifeng";
private static final int SESSION_TIMEOUT = 50 * 1000;
//定义实例变量
private ZooKeeper zk = null;
private String lastValue = "";
//以下为业务方法
public ZooKeeper startZK() throws IOException {
return new ZooKeeper(CONNECTSTRING, SESSION_TIMEOUT, new Watcher() {
@Override
public void process(WatchedEvent event) {
}
});
}
public void stopZK() throws InterruptedException {
if (zk != null) {
zk.close();
}
}
public void createZNode(String path, String nodeValue) throws KeeperException, InterruptedException {
zk.create(path, nodeValue.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
}
public String getZNode(String path) throws KeeperException, InterruptedException {
byte[] byteArray = zk.getData(path, new Watcher() {
@Override
public void process(WatchedEvent event) {
try {
triggerValue(path);
} catch (KeeperException | InterruptedException e) {
e.printStackTrace();
}
}
}, new Stat());
return new String(byteArray);
}
public boolean triggerValue(String path) throws KeeperException, InterruptedException {
byte[] byteArray = zk.getData(path, new Watcher() {
@Override
public void process(WatchedEvent event) {
try {
triggerValue(path);
} catch (KeeperException | InterruptedException e) {
e.printStackTrace();
}
}
}, new Stat());
String newValue = new String(byteArray);
if (lastValue.equals(newValue)) {
System.out.println("there is no change~~~~~~~~");
return false;
} else {
System.out.println("lastValue: " + lastValue + "\t" + "newValue: " + newValue);
this.lastValue = newValue;
return true;
}
}
public static void main(String[] args) throws IOException, KeeperException, InterruptedException {
WatchMore watch = new WatchMore();
watch.setZk(watch.startZK());
if (watch.getZk().exists(PATH, false) == null) {
String initValue = "s1";
watch.setLastValue(initValue);
watch.createZNode(PATH, initValue);
System.out.println("**********************>: " + watch.getZNode(PATH));
Thread.sleep(Long.MAX_VALUE);
} else {
System.out.println("i have znode");
}
}
//setter---getter
public ZooKeeper getZk() {
return zk;
}
public void setZk(ZooKeeper zk) {
this.zk = zk;
}
public String getLastValue() {
return lastValue;
}
public void setLastValue(String lastValue) {
this.lastValue = lastValue;
}
}