觉得有帮助的,请多多支持博主,点赞关注哦~
ZooKeeper 数据模型的结构与 Unix 文件系统很类似,整体上可以看作是一棵树,每个节点称做一个 ZNode。
很显然 zookeeper 集群自身维护了一套数据结构。这个存储结构是一个树形结构,其上的每一个节点,我们称之为"znode",每一个 znode 默认能够存储 1MB 的数据,每个 ZNode都可以通过其路径唯一标识
提供的服务包括:分布式消息同步和协调机制、服务器节点动态上下线、统一配置管理、负载均衡、集群管理等。
官方网站:https://zookeeper.apache.org/
直接下载推荐链接: https://ftp.riken.jp/net/apache/zookeeper/
https://ftp.riken.jp/net/apache/zookeeper/
安装JDK,不多说了。。之前的文章有很多遍。
# 上传到Linux
[hadooptest@biubiubiu model]$ rz
# 解压到model
[hadooptest@biubiubiu model]$ tar -zxvf apache-zookeeper-3.5.7-bin -C ../model
# 重命名
[hadooptest@biubiubiu model]$ mv apache-zookeeper-3.5.7-bin/ zookeeper-3.5.7
# 修改配置文件zoo.cfg(类似mapred-site.xml)
# 1、新建目录
[hadooptest@biubiubiu zookeeper-3.5.7]$ mkdir data
# 2、进入conf
[hadooptest@biubiubiu zookeeper-3.5.7]$ cd conf
# 3、复制zoo_sample.cfg
[hadooptest@biubiubiu conf]$ cp zoo_sample.cfg zoo.cfg
# 4、修改zoo.cfg
[hadooptest@biubiubiu conf]$ vi zoo.cfg
dataDir=/opt/model/zookeeper-3.5.7/data
# 配置环境变量
[hadooptest@biubiubiu conf]$ sudo vim /etc/profile
[hadooptest@biubiubiu conf]$ source /etc/profile
[hadooptest@biubiubiu conf]$ echo $ZOOKEEPER_HOME
/opt/model/zookeeper-3.5.7
# 启动zookeeper
[hadooptest@biubiubiu bin]$ zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /opt/model/zookeeper-3.5.7/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
# 查看进程是否启动
[hadooptest@biubiubiu bin]$ jps
2251 QuorumPeerMain
2317 Jps
# 查看zookeeper状态
[hadooptest@biubiubiu bin]$ zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/model/zookeeper-3.5.7/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: standalone
# 启动客户端操作
[hadooptest@biubiubiu bin]$ zkCli.sh
# 创建node2节点
[zk: localhost:2181(CONNECTED) 0] create /node2
Created /node2
# 查看/下节点
[zk: localhost:2181(CONNECTED) 1] ls /
[node2, zookeeper]
# 退出客户端
[zk: localhost:2181(CONNECTED) 2] quit
# 停止zookeeper
[hadooptest@biubiubiu bin]$ zkServer.sh stop
ZooKeeper JMX enabled by default
Using config: /opt/model/zookeeper-3.5.7/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED
1、Znode 有两种类型:
2、Znode 有四种形式的目录节点(默认是 persistent )
3、创建 znode 时设置顺序标识,znode 名称后会附加一个值,顺序号是一个单调递增的计数器,由父节点维护
4、在分布式系统中,顺序号可以被用于为所有的事件进行全局排序,这样客户端可以通过顺序号推断事件的顺序
在 biubiubiu01、biubiubiu02和 biubiubiu03三个节点上部署 Zookeeper。
首先只在biubiubiu01上部署,完毕后,分发到biubiubiu02、biubiubiu03。
# 操作biubiubiu01
# 上传zookeeper文件
[hadoop01@biubiubiu01 software]$ rz
# 解压到model下
[hadoop01@biubiubiu01 software]$ tar -zxvf apache-zookeeper-3.5.7-bin.tar.gz -C ../model
# 重命名
[hadoop01@biubiubiu01 model]$ mv apache-zookeeper-3.5.7-bin.tar.gz zookeeper-3.5.7
# 创建文件夹data
[hadoop01@biubiubiu01 zookeeper-3.5.7]$ mkdir data
# 复制/opt/model/zookeeper-3.5.7/conf 这个目录下的 zoo_sample.cfg 为 zoo.cfg
[hadoop01@biubiubiu01 conf]$ cp zoo_sample.cfg zoo.cfg
# 修改zoo.cfg
[hadoop01@biubiubiu01 conf]$ vi zoo.cfg
dataDir=/opt/model/zookeeper-3.5.7/data
# zookeeper集群配置
server.1=biubiubiu01:2888:3888
server.2=biubiubiu02:2888:3888
server.3=biubiubiu03:2888:3888
集群模式下配置一个文件 myid,这个文件在 data目录下,这个文件里面有一个数据就是 A 的值,Zookeeper 启动时读取此文件,拿到里面的数据与 zoo.cfg 里面的配置信息比较从而判断到底是哪个 server。
# 在data下创建myid文件并添加数据1(重要!数据可以随便写,
# 但是必须与文件中添加的server对应的编号:如1相同,必须有序123、246...)
[hadoop01@biubiubiu01 data]$ vi myid
1
# 将biubiubiu01配置好的zookeeper下发到biubiubiu02、biubiubiu03
[hadoop01@biubiubiu01 model]$ scp -r zookeeper-3.5.7/ biubiubiu02:/opt/model
[hadoop01@biubiubiu01 model]$ scp -r zookeeper-3.5.7/ biubiubiu03:/opt/model
# 注意:必须分别修改 myid 文件中内容为 2、3
# 启动前,可以分别配置一下环境变量,方便使用。
# 不要忘了source
# 分别启动zookeeper
[hadoop01@biubiubiu01 model]$ zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /opt/model/zookeeper-3.5.7/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[hadoop01@biubiubiu02 data]$ zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /opt/model/zookeeper-3.5.7/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[hadoop01@biubiubiu03 data]$ zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /opt/model/zookeeper-3.5.7/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
# 分别jsp
[hadoop01@biubiubiu01 model]$ jps
3361 Jps
3318 QuorumPeerMain
# 查看状态:谁是leader,谁是follower
[hadoop01@biubiubiu01 model]$ zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/model/zookeeper-3.5.7/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: follower
[hadoop01@biubiubiu02 data]$ zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/model/zookeeper-3.5.7/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: leader
[hadoop01@biubiubiu03 data]$ zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/model/zookeeper-3.5.7/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: follower
详细了解参数,见上边 stat 结构体。
命令基本语法 | 功能描述 |
---|---|
help | 显示所有操作命令 |
ls [-w] path | 使用 ls 命令来查看当前路径下所有子节点[-w:监听] |
ls2 path [watch] (旧) == ls -s -w path(新) |
查看当前节点数据并能看到更新次数等数据[-w监听] |
create [-s] [-e] path data | 普通创建:-s 顺序节点;-e 临时节点;path 路径;data 数据 |
get path [watch] (旧) ==get -s -w path (新) |
获得节点的数据值[-w监听节点数据的变化] |
set path data | 设置节点的具体值 |
stat path | 查看节点状态 |
delete path [version] | 删除指定路径节点,若有子节点,必须先删子节点 |
rmr path(旧)==deleteall path | 递归删除 |
传统的linux文件操作:文件操作的命令+权限命令(chmod、chown)
zookeeper的权限操作(ACL:access control list):
1)节点能进行什么操作:create、read、write、delete(前4个是对当前节点) 、admin(子节点)
2)身份的认证(4种方式):
wor1d:默认方式,相当于全世界都能访问
auth:代表已经认证通过的用户
digest:即用户名:密码这种方式认证
ip:使用Ip地址认证
查看某个节点的数据信息: get path
查看某个节点的权限信息: getAcl path
基于auth的方式授权:2步
1)创建用户
addauth digest 用户名:密码
2)给对应的path赋权限:
setAcl 路径 auth:用户名:密码:crdwa
基于ip:setAcl /node03 ip: 127.0.0.1:cdrwa,192.168.159.191:cr,192.168.159.192:rw
junit</groupId>
junit</artifactId>
4.11</version>
test</scope>
</dependency>
org.apache.logging.log4j</groupId>
log4j-core</artifactId>
2.12.1</version>
</dependency>
org.apache.zookeeper</groupId>
zookeeper</artifactId>
3.5.7</version>
</dependency>
</dependencies>
package com.biubiubiu;
import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;
import java.util.List;
public class TestZookeeper {
public static void main(String[] args) throws Exception {
//1)创建ZookeeperClient
//sessionTimeout容忍时间,如果超过这个时间没有连接到zk集群,则会报异常,可以根据机器配置适当延长时间。
ZooKeeper zkClient = new ZooKeeper("192.168.153.231:2181,192.168.153.232:2181,192.168.153.233:2181", 5000, new Watcher() {
@Override
public void process(WatchedEvent event) {
//根据实际情况
System.out.println("执行watcher:" + event.getType() + ",path:" + event.getPath() + ",stat:" + event.getState().toString());
}
});
//2)执行操作
//2.1)测试查看节点是否存在 //znode01
// Stat stat = zkClient.exists("/znode01", false);
// if (stat == null) {
// System.out.println("znode01节点不存在");
// } else {
// System.out.println("znode01节点存在");
// }
//2.2)创建节点
// zkClient.create("/znode01", "hello".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
// System.out.println("创建znode01成功");
//
//2.3)查看子列表: ls /
// List nodes = zkClient.getChildren("/", false);
// for (String node : nodes) {
// System.out.println(node);
// }
//2.4)查看某节点的数据
// byte [] data=zkClient.getData("/znode01",true,null);//null是数据的最新版本
// System.out.println("修改之前的数据是:"+new String(data));
//
// //进行修改数据
// zkClient.setData("/znode01","newDatadata".getBytes(),-1);
//
//
// byte [] data2=zkClient.getData("/znode01",true,null);//null是数据的最新版本
// System.out.println("修改之后的数据是:"+new String(data2));
//删除节点
zkClient.delete("/znode01", -1);
System.out.println("删除成功!");
zkClient.close();
}
}
觉得有帮助的,请多多支持博主,点赞关注哦~