zookeeper安装与环境配置以及简单命令使用
链接:https://pan.baidu.com/s/1cb8ltOl3FdIV2t6j4hDM1w
提取码:lycc
一、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集群中的节点
1、到达指定目录执行指令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 });
connectionString是连接信息,当为集群的时候,使用”,”分隔,如
“192.168.1.1:2181,192.168.1.2:2181”
sessionTimeout指会话过期时间,其值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、修改节点数据
// -1表示忽略版本
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,再监听