下载地址
https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.14/
一、zookeeper环境搭建
安装jdk:略
本次我们在192.168.0.104,192.168.0.106,192.168.0.107三台机器中搭建zookeeper。
zookeeper版本:3.4.14
1、下载并解压
下载:zookeeper-3.4.14.tar.gz,下载完成之后,我将其放置在"/usr/local/zookeeper"目录下,解压目录为"/usr/local/zookeeper/zookeeper-3.4.14"。
2、修改环境变量
vim /etc/profile
在 /etc/profile文件中添加如下内容(注:目录根据自己的位置进行配置):
export ZOOKEEPER_HOME=/usr/local/zookeeper/zookeeper-3.4.14
PATH=$ZOOKEEPER_HOME/bin:$PATH
source /etc/profile
3、修改配置文件
cd /usr/local/zookeeper/zookeeper-3.4.14/conf
mv zoo_sample.cfg zoo.cfg
vim zoo.cfg
(1)dataDir=/usr/local/zookeeper/data
(2)末尾添加如下内容:
server.0=192.168.0.104:2888:3888
server.1=192.168.0.106:2888:3888
server.2=192.168.0.107:2888:3888
注:dataDir=/usr/local/zookeeper/data中的这个目录需要自己创建。
4、服务器标识配置
进入创建的data目录
cd /usr/local/zookeeper/data
vim myid
其中myid文件的内容分别为:0,1,2。也就是上面配置的server.0,server.1,server.2对应的三台机器中。根据如上配置。
192.168.0.104机器的myid文件内容为“0”
192.168.0.106机器的myid文件内容为“1”
192.168.0.107机器的myid文件内容为“2”
zoo.cfg配置解释
tickTime: 以毫秒为单位。是 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔。
dataDir: Zookeeper 保存数据的目录。默认情况下,Zookeeper 会将数据的日志文件也保存在这个目录。
clientPort:客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。
initLimit:配置 Zookeeper 接受客户端初始化连接时最长能忍受多少个心跳时间间隔数,当已经超过 10 个心跳的时间(也就是 tickTime)长度后 Zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。
syncLimit:标识 Leader 与 Follower 之间发送消息、请求和应答的时间长度,最长不能超过多少个 tickTime 的时间长度。
server.A = B:C:D :
A表示这个是几号服务器
B 是服务器的 ip 地址
C 是这个服务器与集群中的 Leader 服务器交换信息的端口;
D 是若集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader
5、启动zookeeper
启动:
zkServer.sh start
注:启动时记得要关闭防火墙!!!
停止firewall
systemctl stop firewalld.service
禁止firewall开机启动
systemctl disable firewalld.service
查询服务:
jps
检查状态:
zkServer.sh status
在三个节点上检验zookeeperk的mode,一个leader和俩个follower
如下图所示:
二、 zkCli.sh进入客户端
zkCli.sh位于zookeeper解压目录的bin目录下
查找:ls / 例如: ls /zookeeper
创建并赋值: create /test zookeeper
获取值:get /test
设置值:set /test hello
三、查看zookeeper工具
1、ZooInspector
下载地址:
https://issues.apache.org/jira/secure/attachment/12436620/ZooInspector.zip
解压之后找到:zookeeper-dev-ZooInspector.jar
启动:
java -jar zookeeper-dev-ZooInspector.jar
2、eclipse
Eclipse -> help -> install new software
Location: http://www.massedynamic.org/eclipse/updates/
连接成功如下所示:
四、zookeeper原生api简单使用
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.5.5</version>
</dependency>
import java.io.IOException;
import java.util.concurrent.CountDownLatch;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.EventType;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;
public class ZookeeperClient {
public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
String CONNECT_ADDR = "192.168.0.104:2181,192.168.0.106:2181,192.168.0.107:2181";
int SESSION_TIMEOUT = 5000; //session超时时间(ms)
CountDownLatch countDownLatch = new CountDownLatch(1); //阻塞,等待zk连接成功
ZooKeeper zk = new ZooKeeper(CONNECT_ADDR, SESSION_TIMEOUT, new Watcher(){
@Override
public void process(WatchedEvent event) {
KeeperState keeperState = event.getState();
EventType eventType = event.getType();
//状态是建立连接
if(KeeperState.SyncConnected == keeperState){
if(EventType.None == eventType){
//如果连接成功,发送信号量,让后续阻塞程序向下执行
countDownLatch.countDown();
System.out.println("zk连接成功");
}
}
}
});
//进行阻塞,连接成功后放行
countDownLatch.await();
//创建节点
//Ids.OPEN_ACL_UNSAFE 节点权限:开放权限
//CreateMode.PERSISTENT 节点类型:持久节点
String create = zk.create("/testZookeeper", "testValue".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println(create);
String child = zk.create("/testZookeeper/child", "childValue".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println(child);
//获取节点
byte[] data = zk.getData("/testZookeeper", false, null);
System.out.println(new String(data));
//修改节点
zk.setData("/testZookeeper", "testValueNew".getBytes(), -1);
byte[] dataNew = zk.getData("/testZookeeper", false, null);
System.out.println(new String(dataNew));
//删除节点
zk.delete("/testZookeeper/child", -1);
//检查节点是否存在(返回null则表示不存在该节点)
System.out.println(zk.exists("/testZookeeper/child", false));
//关闭连接
zk.close();
}
}