Zookeeper学习笔记
1.ZK简介
- dubbo 框架 springcloud 框架 zk 注册中心
- Hadoop Hbase 组件 集群架构 zk 集群管理者
- zk 实现分布式锁 redis分布式
Zookeeper简称ZK,一个分布式的,开放源码的分布式应用程序协调服务,是Google的一个开源的实现,是Hadoop和Hbase的重要组件。Zookeeper使用Java编写,但是支持Java和C两种编程语言。
2.ZK内存数据模型
2.1 模型结构
2.2 模型的特点
- 每个系目录如/Java都被称为一个znode节点,这个znode是被它所在的路径唯一标识
- znode可以有子节点目录,并且每个znode可以存储数据
- znode是可以有版本的,每个znode中存储的数据可以有多个版本,也就是一个访问路径中可以存储多份数据
- zonde可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端
3.节点的分类
3.1持久节点(PERSISTENT)
是指在节点创建后就一直存在。直到有删除操作来主动删除这个节点。不会因为创建该节点的客户端会话失效而消失。
3.2持久顺序节点(PERSISTENT_SEQUENTIAL)
这类节点的基本特性和上面的节点类型是一致的。额外的特性是,在zk中,每个父节点会为他的第一级子节点维护一份时序,会记录每个子节点创建的先后顺序。基于这个特性,在创建子节点的时候,可以设置这个属性,那么在创建节点过程中,ZK会自动为给定节点名加上一个数字后缀,作为新的节点名。这个数字后缀的范围是整型的最大值。
3.3临时节点(EPHEMERAL)
和持久节点不同的是,定。也就是说,如果客户端会话失效。那么这个节点就会自动被清除掉。注意。这里提到的是会话失效,而非连接断开。另外,在临时节点下面不能创建子节点。
3.4临时顺序节点(EPHEMERAL_SEQUENTIAL)
具有临时节点特点,额外的特性是,每个父节点会为他的第一级子节点维护一份时序。这点和刚才提到的持久顺序节点类似
4.安装
4.1linux系统安装
# 1.安装jdk并配置环境变量 & 下载ZK安装包
- https://downloads.apache.org/zookeeper/zookeeper-3.7.0/apache-zookeeper-3.7.0-bin.tar.gz
# 2.下载安装包上传到linux服务中,并解压缩
- tar -zxvf zookeeper-3.7.0.tar.gz
# 3.重命名安装目录
mv zookeeper-3.7.0 zxookeeper
# 4.配置zoo.cfg配置文件
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/opt/mydata/zkdata1
clientPort=2181
# 5.启动zk
- 在zk的bin目录下,运行zkServer.sh
[root@iZ zookeeper]# ./bin/zkServer.sh start
# 6.使用jps查看启动是否成功
# 7.启动客户端链接zk
[root@iZ zookeeper]# ./bin/zkCli.sh -server 47.106.158.72:3001
==注意== 可以通过 ./bin/zkCli.sh help 查看客户端所有的可执行指令
4.2Docker安装zookeeper
#1.获取zk镜像
docker pull zookeeper
#2.启动zk服务
docker run -d -p 2181:2181 --name myzk zookeeper
#3.进入zk
docker exec -it myzk /bin/bash
#4.启动zk
./bin/zkCli.sh
5.客户端基本指令
#1.ls path 查看特定节点下面的子节点
#2.create path data 创建一个节点。并给节点绑定数据(默认是持久性节点)
- create path data 创建持久节点(默认是持久节点)
- create -s path data 创建持久性顺序节点
- create -e path data 创建临时节点(注意:临时节点不能含有任何子节点)
- create -s -e path data 创建临时顺序节点(注意:临时节点不能含有任何子节点)
#3.stat path 查看节点状态
#4.set path data 修改节点数据
#5.ls2 path 查看节点下孩子和当前节点的状态
#6.history 查看操作历史
#7.get path 获得节点上绑定的数据信息
#8.delete path 删除节点(注意:删除节点不能含有子节点)
#9.rmr path 递归删除节点(注意:会将当前节点下所有节点删除)
#10.quit 退出当前会话(会话失效)
6.节点监听机制 watch
客户端可以监听 znode 节点的变化。znode 节点的变化触发相应的事件,然后清除对该节点的检测。当检测一个 znode 节点的时候,Zookeeper 会发送通知给检测节点。一个 Watch 事件是一个一次性的触发器,当被设置了 Watch 的数据和目录发生了改变的时候,则服务器将这个改变发送给设置了 Watch 的客户端以便通知他们。
#1.ls /path true 监听节点目录的变化
#2.get /path true 监听节点数据的变化
7.java操作ZK
7.1 创建项目,引入依赖
<!--引入zkclient依赖-->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
7.2 创建 zkClient
private ZkClient zkClient;
@Before
public void before(){
/**
* 参数1:zk server 服务器ip:port
* 参数2:回话超时时间
* 参数3:连接超时时间
* 参数4:序列化方式 对象
*/
zkClient = new ZkClient("47.106.158.72:3001,47.106.158.72:4001,47.106.158.72:5001", 60000 * 30, 60000, new SerializableSerializer());
}
@After
public void after() {
//释放资源
zkClient.close();
}
7.3 创建zk节点
//1.在zk中创建节点
@Test
public void testCreateNode() {
//持久节点
zkClient.create("/node1", "持久节点", CreateMode.PERSISTENT);
//持久顺序节点
zkClient.create("/node2", "持久顺序节点", CreateMode.PERSISTENT_SEQUENTIAL);
//临时节点
zkClient.create("/node3", "临时节点", CreateMode.EPHEMERAL);
//临时顺序节点
zkClient.create("/node4", "临时顺序节点", CreateMode.EPHEMERAL_SEQUENTIAL);
}
8.ZK的集群
8.1 集群(cluster)
# 1. 集群(cluster)
- 集合同一种软件服务的多个节点同事提供服务
# 2.集群解决问题
- 单节点的并发访问的压力问题
- 单节点故障问题(如硬件老化、自然灾害等)
8.2 集群架构
8.3集群搭建
#1.创建三个dataDir
[root@iZwz9bsqk9pa0dkrkl97x1Z mydata]# mkdir zkdata1 zkdata2 zkdata3
#2.分别在三个dataDir目录下面创建myid文件,并写入数据
[root@iZwz9bsqk9pa0dkrkl97x1Z mydata]# touch ./zkdata1/myid
[root@iZwz9bsqk9pa0dkrkl97x1Z mydata]# touch ./zkdata2/myid
[root@iZwz9bsqk9pa0dkrkl97x1Z mydata]# touch ./zkdata3/myid
[root@iZwz9bsqk9pa0dkrkl97x1Z mydata]# echo "1" >> zkdata1/myid
[root@iZwz9bsqk9pa0dkrkl97x1Z mydata]# echo "2" >> zkdata2/myid
[root@iZwz9bsqk9pa0dkrkl97x1Z mydata]# echo "3" >> zkdata3/myid
myid的内容是服务器的 表示 1|2|3
#3.在/conf目录下创建三个zk配置文件,分别为 zoo1.cfg, zoo2.cfg, zoo3.cfg,
- zoo1.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/opt/mydata/zkdata1
clientPort=3001
server.1=47.106.158.72:3002:3003
server.2=47.106.158.72:4002:4003
server.3=47.106.158.72:5002:5003
- zoo2.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/opt/mydata/zkdata2
clientPort=4001
server.1=47.106.158.72:3002:3003
server.2=47.106.158.72:4002:4003
server.3=47.106.158.72:5002:5003
- zoo2.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/opt/mydata/zkdata3
clientPort=5001
server.1=47.106.158.72:3002:3003
server.2=47.106.158.72:4002:4003
server.3=47.106.158.72:5002:5003
#解释:
1.serve.x x为服务器的唯一标识
2.47.106.158.72: 服务器所在的ip地址
3.3002 数据同步使用的端口号
4.3003 选举使用的端口号
#4.分别启动各个zk服务器
[root@iZ zookeeper]# ./bin/zkServer.sh start /opt/mydata/zkdata1/zoo1.cfg
[root@iZ zookeeper]# ./bin/zkServer.sh start /opt/mydata/zkdata2/zoo2.cfg
[root@iZ zookeeper]# ./bin/zkServer.sh start /opt/mydata/zkdata3/zoo3.cfg
#5.查看各个zk服务器的角色信息
[root@iZ zookeeper]# ./bin/zkServer.sh status /opt/mydata/zkdata1/zoo1.cfg
[root@iZ zookeeper]# ./bin/zkServer.sh status /opt/mydata/zkdata2/zoo2.cfg
[root@iZ zookeeper]# ./bin/zkServer.sh status /opt/mydata/zkdata3/zoo3.cfg
#6.客户端连接任意zk服务器进行节点操作
[root@iZ zookeeper]# ./bin/zkCli.sh -server 47.106.158.72:3001
#7.停止特定zk服务器
[root@iZ zookeeper]# ./bin/zkServer.sh stop /opt/mydata/zkdata1/zoo1.cfg