一、Zookeeper集群搭建
1、下载压缩包,上传到虚拟机soft目录下,解压,安装之前记得先拍快照,关闭Hadoop集群
2、配置环境变量
vim /etc/profile
export ZOOKEEPER_HOME=/usr/local/soft/zookeeper-3.4.6
export PATH=$PATH:$ZOOKEEPER_HOME/bin
配置文件生效
source /etc/profile
3、修改配置文件
cd conf
cp zoo_sample.cfg zoo.cfg
修改
dataDir=/usr/local/soft/zookeeper-3.4.6/data
增加
server.0=master:2888:3888
server.1=node1:2888:3888
server.2=node2:2888:3888
4、同步到其它节点
scp -r zookeeper-3.4.6 node1:`pwd`
scp -r zookeeper-3.4.6 node2:`pwd`
配置node1和node2的环境变量
scp /etc/profile node1:/etc/
scp /etc/profile node2:/etc/
在所有节点执行
source /etc/profile
5、创建/usr/local/soft/zookeeper-3.4.6/data目录,所有节点都要创建
mkdir /usr/local/soft/zookeeper-3.4.6/data
在data目录下创建myid文件
vim myid
master,node1,node2分别加上0,1,2
6、启动zk,
zkServer.sh start 三台都需要执行
zkServer.sh status 查看状态
zkServer.sh stop 关闭
当有一个leader的时候启动成功
leader负责客户端writer类型的请求;follower负责客户端reader类型的请求,并参与leader选举,并且节点对于用户来说是无中心化的,没有follow和leader区别,但是相对与zookeeper而言有follow和leader之分,随机分配
二、Zookeeper基本命令操作
Zookeeper使用的数据结构为树形结构,根节点为"/"。Zookeeper集群中的节点
执行指令zkCli.sh
2、执行基本命令
执行指令zkCli.sh help ,查看帮助信息
ls / 查找根目录
create /test abc 创建节点并赋值
get /test 获取指定节点的值
set /test cb 设置已存在节点的值
rmr /test 递归删除节点
delete /test/test01 删除不存在子节点的节点
三、Zookeeper Java API的使用
1、在Java中新建maven项目命名zk,并导入对应版本的zookeeper jar包
搜索maven仓库官网下载对应zookeeper版本jar包
创建maven项目
2、开始使用
1、连接
String connectionString = "127.0.0.1:2181"; int sessionTimeout = 30000; ZooKeeper zk = new ZooKeeper(connectionString,sessionTimeout,null });
是连接信息,当为集群的时候,使用”,”分隔,如
“192.168.1.1:2181,192.168.1.2:2181”
指会话过期时间,其值minSessionTimeout最小为tickTime的2倍,最大值 maxSessionTimeout为tickTime的20倍;即使传入的值不在此范围实际起作用的也是minSessionTimeout至maxSessionTimeout
2、创建节点
zk.create("/testRoot","testRoot".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
类型 | 描述 |
CreateMode.PERSISTENT | 永久性节点 |
CreateMode.PERSISTENT_SEQUENTIAL | 永久性序列节点 |
CreateMode.EPHEMERAL | 临时节点,会话断开或过期时会删除此节点 |
CreateMode.PERSISTENT_SEQUENTIAL | 临时序列节点,会话断开或过期时会删除此节点 |
3、获取节点
Stat stat = new Stat(); zk.getData("/testRoot",true,stat);
4、修改节点数据
表示忽略版本
zk.setData("/testRoot", "testRoot_modified".getBytes(), -1);
5、创建子节点
zk.create("/testRoot/child1","child1_data".getBytes(),
ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
6、获取子节点
List<String> children = zk.getChildren("/testRoot",new Watcher()
{
public void process(WatchedEvent event)
{
System.out.println("this is children node event");
System.out.println(event);
}
});
注:getChildren方法会在子点有变化时触发Watcher()这个监听器
7、删除节点
zk.delete("/testRoot", -1); zk.delete("/testRoot/child1", -1);
8、关闭连接
zk.close();
import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;
import java.util.List;
public class ZookeeperDemo1 {
public static void main(String[] args) throws Exception {
//创建连接
String conn = "master:2181,node1:2181,node2:2181";
ZooKeeper zooKeeper = new ZooKeeper(conn, 3000, null);
//创建节点
/**
* zk.create("/testRoot","testRoot".getBytes(),
* ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
*
* CreateMode.PERSISTENT 永久性节点
* CreateMode.PERSISTENT_SEQUENTIAL 永久性序列节点
* CreateMode.EPHEMERAL 临时节点,会话断开或过期时会删除此节点
* CreateMode.PERSISTENT_SEQUENTIAL 临时序列节点,会话断开或过期时会删除此节点
*
*ACL zk自带的一个验证
*/
String s = zooKeeper.create("/text", "text".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println(s);
//获取节点
/**
* Stat stat = new Stat();
* zk.getData("/testRoot",true,stat);
*/
Stat stat = new Stat();
byte[] data = zooKeeper.getData("/zookeeper", true, stat);
System.out.println(data.toString());
//修改节点数据
/**
* // -1表示忽略版本
* zk.setData("/testRoot", "testRoot_modified".getBytes(), -1);
*/
zooKeeper.setData("/text","textmodified".getBytes(),-1);
/**
* 创建子节点
* zk.create("/testRoot/child1","child1_data".getBytes(),
* ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
*/
zooKeeper.create("/text/text1","text1".getBytes(),ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
/**
* 获取子节点
* List<String> children = zk.getChildren("/testRoot",new Watcher()
* {
*
* public void process(WatchedEvent event)
* {
*
* System.out.println("this is children node event");
*
* System.out.println(event);
* }
*
* });
* 注:getChildren方法会在子点有变化时触发Watcher()这个监听器
*/
List<String> children = zooKeeper.getChildren("/text/text1", new Watcher() {
public void process(WatchedEvent watchedEvent) {
System.out.println("这是字节点");
System.out.println(watchedEvent);
}
});
/**
* 删除节点
* zk.delete("/testRoot", -1);
* zk.delete("/testRoot/child1", -1);
*/
zooKeeper.delete("/text/text1",-1);
zooKeeper.delete("/text",-1);
/**
* 关闭连接
*/
zooKeeper.close();
}
}
9、监听机制
import org.apache.zookeeper.*;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
public class ZookeeperDemo2 {
ZooKeeper zooKeeper;
@Before
public void init() throws IOException {
//创建连接
String conn = "master:2181,node1:2181,node2:2181";
zooKeeper= new ZooKeeper(conn, 3000, null);
}
@Test
public void create() throws KeeperException, InterruptedException {
String s = zooKeeper.create("/text", "text".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
Thread.sleep(5000);//节点消失
}
@Test
/**
* 监听
* 参数两个 第一个节点路径 第二个是监听
* 把监听和路径绑定
*/
public void children() throws KeeperException, InterruptedException {
zooKeeper.getChildren("/text", new Watcher() {
//回调函数
//触发的前提
public void process(WatchedEvent watchedEvent) {
System.out.println("当前节点不存在");
System.out.println(watchedEvent);
}
});
while (true);//一直监听
}
}
先运行create,再监听