什么是zookeeper
官方文档上是这么解释zookeeper,它是一个分布式服务框架,是Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。
以上的介绍感觉还是有点抽象了,以下是大数据中的通俗解释!!!!
Zookeeper字面上理解就是动物管理员,是大数据框架Hadoop生态圈中的一个服务中间件,Hadoop生态圈中很多开源项目使用动物命名,那么需要一个管理员来管理这些“动物”。他负责分布式应用程序协调的工作。
Zookeeper主要提供一下四种功能:统一服务名、配置管理、集群管理、共享锁和列队管理。用于高效的管理集群的运行。zookeeper通过心跳机制可以检测挂掉的机器并将挂掉的机器ip和服务对应关系从列表中删除。zookeeper部署有三种方式:单机模式、集群模式、伪集群模式,一下用Docker的方式部署。
ZooKeeper中的节点有两种,分别为临时节点和永久节点。节点的类型在创建时即被确定,并且不能改变。
临时节点:该节点的生命周期依赖于创建它们的会话。一旦会话(Session)结束,临时节点将被自动删除,当然可以也可以手动删除。虽然每个临时的Znode都会绑定到一个客户端会话,但他们对所有的客户端还是可见的。另外,ZooKeeper的临时节点不允许拥有子节点。
永久节点:该节点的生命周期不依赖于会话,并且只有在客户端显示执行删除操作的时候,他们才能被删除。
顺序节点:当创建Znode的时候,用户可以请求在ZooKeeper的路径结尾添加一个递增的计数。这个计数对于此节点的父节点来说是唯一的,它的格式为"%10d"(10位数字,没有数值的数位用0补充,例如"0000000001")。当计数值大于232-1时,计数器将溢出。
监视器:客户端可以在节点上设置watch,我们称之为监视器。当节点状态发生改变时(Znode的增、删、改)将会触发watch所对应的操作。当watch被触发时,ZooKeeper将会向客户端发送且仅发送一条通知,因为watch只能被触发一次,这样可以减少网络流量。
注意: 集群为大于等于3个奇数,如 3、5、7,不宜太多,集群机器多了选举和数据同步耗时长,不稳定。
安装zookeeper:
Step1:配置JAVA环境,检验环境:java -version
Step2:去官网下载,并解压
# cd /usr/local
# wget http://mirror.bit.edu.cn/apache/zookeeper/stable/zookeeper-3.4.12.tar.gz
# tar -zxvf zookeeper-3.4.12.tar.gz
# cd zookeeper-3.4.12
Step3:重命名配置文件zoo_sample.cfg
# cp conf/zoo_sample.cfg conf/zoo.cfg
Step4:直接启动zookeeper
# bin/zkServer.sh start
Step5:测试一下zookeeper是否启动成功
# bin/zkCli.sh
Zookeeper使用
使用客户端命令操作zookeeper
1、使用 ls 命令来查看当前 ZooKeeper 中所包含的内容
2、创建一个新的 znode ,使用 create /zkPro myData
3、再次使用 ls 命令来查看现在 zookeeper 中所包含的内容:
4、下面我们运行 get 命令来确认第二步中所创建的 znode 是否包含我们所创建的字符串:
5、下面我们通过 set 命令来对 zk 所关联的字符串进行设置:
6、下面我们将刚才创建的 znode 删除
使用Java API操作zookeeper
资料来源连接:https://www.jianshu.com/p/4322a5ecad39
ZooKeeper服务命令,命令行工具的一些简单操作如下:
1. 显示根目录下、文件: ls / 使用 ls 命令来查看当前 ZooKeeper 中所包含的内容
2. 显示根目录下、文件: ls2 / 查看当前节点数据并能看到更新次数等数据
3. 创建文件,并设置初始内容: create /zk "test" 创建一个新的 znode节点“ zk ”以及与它关联的字符串
4. 获取文件内容: get /zk 确认 znode 是否包含我们所创建的字符串
5. 修改文件内容: set /zk "zkbak" 对 zk 所关联的字符串进行设置
6. 删除文件: delete /zk 将刚才创建的 znode 删除
7. 退出客户端: quit
8. 帮助命令: help
创建maven项目,导入zookeeper相关包
<dependencies>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.7</version>
</dependency>
</dependencies>
1、连接zookeeper
public class TestCase {
private static final String connectionString = "192.168.25.127:2181,"
+ "192.168.25.129:2181,"
+ "192.168.25.130:2181";
public static final Integer sessionTimeout = 2000;
public static ZooKeeper zkClient = null;
@Before
public void init() throws Exception{
//三个参数分别为连接的zookeeper集群服务器的ip,超时时间,监听器
zkClient = new ZooKeeper(connectionString, sessionTimeout, new Watcher(){
//收到事件通知后的回调函数(应该是我们自己的事件处理逻辑)
public void process(WatchedEvent event) {
System.out.println(event.getType()+","+event.getPath());
}});
}
命令行查看
[zk: localhost:2181(CONNECTED) 1] ls /
[app1, idea, test, servers, zookeeper]
2、创建数据节点到zk中
@Test
public void createNode() throws Exception{
/*
* 传入四个参数
* 1、创建的节点
* 2、节点数据
* 3、节点的权限,OPEN_ACL_UNSAFE表示内部应用权限
* 4、节点类型,4种:持久化节点,带序列持久化节点,临时节点,带序列的临时节点
*/
String path = zkClient.create("/idea",
"helloworld".getBytes(),
Ids.OPEN_ACL_UNSAFE,
CreateMode.PERSISTENT);
System.out.println(path);
}
3、获取子节点
@Test
public void getChildren() throws Exception{
/*
* 传入2个参数
* 1、指定获取哪个节点的孩子
* 2、是否使用监听器(watcher),true表示使用以上的监听功能
*/
List<String> children = zkClient.getChildren("/",true);
for (String child : children) {
System.out.println(child);
}
System.in.read();
}
控制台输出
None,null
app1
idea
test
zookeeper
servers
总结
今天就先写到这里,当然zookeeper远比我们这里描述的功能多,比如zk中的选举机制、实现集群管理、分布式锁、分布式队列;zookeeper还有很多类似的应用大多都是基于上面的特性。总的来说,zk只是一个提供了一些特性的系统,用户根据这些特性自己定义了它的用法。