一.zookeeper的原理
1. zookeeper是一个数据库 是一个使用树形结构的数据库,可以拥有高可用的集群,80%在读 ,20%在写,只允许在一台机器上写,机器分为两种角色 leader(领导者)+foollower(追随者),写由leader写入,读由foollower负责 ,一个集群只能有一个leader,leader由paxos算法选举出来,票数最高的机器成为leader。leader写入的数据通过paxos算法将所有数据同步,zookeeper的集群必须是2n+1台,最少n=1。
2. zookeeper的path表示一个znode,/表示根节点,树结构包含多个znode,每个节点都可以有一个值和多个子节点。
3. zookeeper有三种znode
1 永久节点 数据被持久化 用户不调用删除,就不会被删除 ,默认是永久节点
2 临时节点 客户端连接时 才保留数据,客户端断开 数据就删除。create -e / ,一般应用在注册中心
3 顺序节点 按顺序生成 ,create -s /,一般应用在抢票+秒杀+分布式主键
二 zookeeper安装
1.下载 安装包(http://www.apache.org/dyn/closer.cgi/zookeeper/) 这里建议下载3.4以上版本 (将事务日志和快照数据拆分为不同目录 自动清除过期文件)
点击add 输入http://www.massedynamic.org/eclipse/updates/
点击OK选择
2.安装jdk 设置javahome bin目录设置到path中
3.拷贝 conf/zoo_sample.cfg 命名为 zoo.cfg ,zoo.cfg的参数
# 心跳的时间间隔
tickTime=2000
# 初始化同步数据要花费的时间 10个tickTime
initLimit=10
# leader和foollower互相发送心跳检查对方失效的时间间隔
syncLimit=5
# 数据存储的位置
dataDir=D:\zookeeper-3.4.10\data
# 端口号
clientPort=2181
#默认的连接数
#maxClientCnxns=60
4. 运行 bin/zkServer
5.使用客户端命令进行连接进行数据设置 bin/zkCli -server localhost 输入 help查看帮助
常用的数据操作命令(树结构节点数据的操作)
ls / 显示根节点下所有的节点
[zk: localhost(CONNECTED) 1] ls /
[zookeeper]
create / 新增一个user节点 节点的值是 boy
[zk: localhost(CONNECTED) 2] create /user boy
Created /user
[zk: localhost(CONNECTED) 3] ls /
[user, zookeeper]
获取/user节点的值
[zk: localhost(CONNECTED) 5] get /user
boy
重新设置user节点的值
[zk: localhost(CONNECTED) 6] set /user girl
[zk: localhost(CONNECTED) 7] get /user girl
删除节点
[zk: localhost(CONNECTED) 8] delete /user
[zk: localhost(CONNECTED) 9] ls /
[zookeeper]
[zk: localhost(CONNECTED) 10]
其他命令
help 查看所有命令的帮助
close/quit 退出登录
connect ip:port 重新登录
histroy 查看操作历史记录 每个历史记录都有一个编号
redo 编号 重新执行history中编号对应的语句
close 关闭客户端连接
stat /user 查看znode的/user的状态信息
ls2 /user 查看/user所有的子节点 同时查看状态信息
rmr /user 删除/user以及他的所有子节点
setquota -n 1 /test 给/test节点设置允许的子节点个数是1个 添加子节点操作1个 给予警告 可以添加
-b 10 /test 给/test的值的长度限制为 10个字节
listquota /test 列出/test所有的配额
delquota -n /test 删除子节点设置的配额
【通过命令 添加node后 可以查看到一些列 这些列的意义 】
cZxid = 0x2 节点被创建时的事务id
ctime = Thu May 11 17:32:27 CST 2017 节点被创建的时间
mZxid = 0x3 节点最后一次被更新(使用set 修改当前节点时 (修改子节点不影响该字段) 该值会自动更新 自动累加)时的事务id
mtime = Thu May 11 17:33:16 CST 2017 节点最后一次被更新时间
pZxid = 0x2 子节点中最后一个被创建的子节点的czxid 如果当前节点没有子节点pZxid=cZxid
cversion = 0 子节点被创建或者删除 都会导致该版本号递增 修改不会
dataVersion = 1 当前节点调用set 修改值 都会导致该版本号递增 (子节点修改不影响该版本号)
aclVersion = 0
ephemeralOwner = 0x0 如果是持久节点就是0 临时节点是sessionid 客户端连接会产生session
dataLength = 4 数据长度 多少个字节
numChildren = 0 表示子节点的个数
三.Zkclient客户端
1.创建maven项目 ,在pom.xml中加入zkclient的架包
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.et</groupId>
<artifactId>Zookeeper_Zkclient</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<!-- 添加zkclient的架包 -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
</dependencies>
</project>
2.创建测试类
package cn.et;
import org.I0Itec.zkclient.IZkDataListener;
import org.I0Itec.zkclient.ZkClient;
import org.apache.zookeeper.CreateMode;
public class ZkclientTest {
public static void main(String[] args) throws Exception{
//连接zookeeper的URL
String zkUrl="localhost:2181";
//连接zookeeper的URL session的超时时间,连接超时时间,连接不上就重连
ZkClient zk= new ZkClient(zkUrl, 10000, 5000);
//创建一个永久节点 /user
zk.createPersistent("/user");
//创建两个顺序节点/user/ls ,
String znodename =zk.create("/user/ls", "boy", CreateMode.PERSISTENT_SEQUENTIAL);
String znodename1=zk.create("/user/ls", "girl", CreateMode.PERSISTENT_SEQUENTIAL);
System.out.println(znodename);
System.out.println(znodename1);
//创建一个临时节点 /user/zs
zk.createEphemeral("/user/zs", "boy");
//监控节点
zk.subscribeDataChanges("/db", new IZkDataListener() {
//删除节点时被触发
public void handleDataDeleted(String path) throws Exception {
}
//修改节点时被触发
public void handleDataChange(String path, Object arg1) throws Exception {
System.out.println(path);
}
});
while(true){
TimeUnit.SECONDS.sleep(5);
}
}
}
3.监控修改
package cn.et;
import org.I0Itec.zkclient.ZkClient;
public class Zkset {
public static void main(String[] args) {
//连接zookeeper的URL
String zkUrl="localhost:2181";
//连接zookeeper的URL session的超时时间,连接超时时间,连接不上就重连
ZkClient zk= new ZkClient(zkUrl, 10000, 5000);
//修改
zk.writeData("/db", "orca");
}
}
4.运行main方法
log4j:WARN No appenders could be found for logger (org.I0Itec.zkclient.ZkEventThread).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
log4j:WARN No appenders could be found for logger (org.I0Itec.zkclient.ZkConnection).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
/user/ls0000000000
/user/ls0000000001