1.准备3台虚拟机,关闭各自防火墙
系统可采用centos或者red hat
本示例采用centos7
注意:zookeeper依赖于Java环境,所以先自行安装JDK。
jdk 下载:https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html
2.下载zookeeper
官网地址
wget http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.5.8/apache-zookeeper-3.5.8-bin.tar.gz
3.解压缩
tar -zxvf apache-zookeeper-3.5.8-bin.tar.gz
4.zookeeper-3.4.8/conf 下面新增zoo.cfg
三台机器进行相同操作!
cd /root/apache-zookeeper-3.5.8-bin/bin
vi zoo.cfg
内容如下:
tickTime=2000
dataDir=/usr/soft/data-zookeeper
clientPort=2181
initLimit=5
syncLimit=2
server.1=192.168.100.1:2888:3888
server.2=192.168.100.2:2888:3888
server.3=192.168.100.3:2888:3888
5.新建data目录/usr/soft/data-zookeeper
cd /usr/soft/data-zookeeper 新增myid文件
3台虚拟机分别定义myid文件内容,
192.168.100.1 --> 1;
192.168.100.2 --> 2;
192.168.100.3 --> 3;
6.三台机器分别启动
./zkServer.sh start
如果启动失败:
启动失败,查看zookeeper目录下的logs发现报错:
Error: Could not find or load main class org.apache.zookeeper.server.quorum.QuorumPeerMain
需要下载bin文件, http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.5.8/apache-zookeeper-3.5.8-bin.tar.gz
7.检查状态
./zkServer.sh status
结果:
8.测试
Mode:leader有读写权限,Mode: follower 只有读取权限
测试脚本java
8.1 添加maven依赖
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.8</version>
</dependency>
8.2
public class ZooKeeperTest {
private static final String HOST2 = "192.168.100.15:2181";
private static final String HOST1 = "192.168.100.16:2181";
private static final Integer TIMEOUT = 2000;
public static void main(String[] args) {
try {
ZooKeeper zooKeeper1 = new ZooKeeper(HOST1, TIMEOUT, null);
ZooKeeper zooKeeper2 = new ZooKeeper(HOST2, TIMEOUT, null);
System.out.println("16 创建节点...");
if (zooKeeper2.exists("/tests", false) == null) {
zooKeeper2.create("/tests", "zNode1".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
}
System.out.println("=========查看节点是否创建成功========");
System.out.println(new String(zooKeeper1.getData("/tests", false, null)));
System.out.println("========修改节点的数据========");
System.out.println("16 修改节点...");
String data = "zNode2";
zooKeeper2.setData("/tests",data.getBytes(),-1);
System.out.println("========查看修改的节点是否成功=========");
System.out.println(new String(zooKeeper1.getData("/tests", false, null)));
System.out.println("========删除节点========");
System.out.println("16 修改节点...");
zooKeeper2.delete("/tests",-1);
System.out.println("========查看节点是否被删除=========");
System.out.println("节点状态:" + zooKeeper2.exists("/tests",false));
System.out.println("=========查看节点是否存在========");
System.out.println("15 查看节点...");
System.out.println(new String(zooKeeper1.getData("/tests", false, null)));
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (KeeperException e) {
e.printStackTrace();
}
}
}
测试结果: