ZooKeeper使用入门
ZooKeeper简介
ZooKeeper是一个分布式的,开源的分布式应用程序协调服务,是Hadoop的子项目之一。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
安装ZooKeeper
操作系统要求
操作系统 | 客户端 | 服务端 | 原生客户端 | 附加组件 |
---|---|---|---|---|
GNU/Linux | 开发/生产 | 开发/生产 | 开发/生产 | 开发/生产 |
Solaris | 开发/生产 | 开发/生产 | 不支持 | 不支持 |
FreeBSD | 开发/生产 | 开发/生产 | 不支持 | 不支持 |
Windows | 开发/生产 | 开发/生产 | 不支持 | 不支持 |
Mac OS X | 开发 | 开发 | 不支持 | 不支持 |
软件要求
Java 8及Java 11以上版本(Java 9和10不支持)
硬件要求
此硬件资源为官网推荐的配置,实际开发过程中不需要这么大,笔者测试1核1G内存20G硬盘的虚拟机即可运行。
- 2核
- 2G内存
- 80G硬盘
下载安装并进行单点配置
- 下载页面地址:https://zookeeper.apache.org/releases.html
- 官网只提供tar.gz格式的压缩包,windows下载后按照zip之类的解压方式可能会导致解压后的包无法使用,笔者使用Git带的命令行执行linux的解压命令解压后使用,如果没有安装Git则建议使用虚拟机安装Linux使用。以下是正确解压和错误解压后的对比。
- 解压后的ZooKeeper默认是无法执行的,需要进行配置,将
apache-zookeeper-3.6.1/conf/zoo_sample.cfg
复制一份并重命名为zoo.cfg
,没什么特殊需要里边的配置项默认即可,笔者因为是在windows下使用,所以将datadir修改了。配置文件项说明如下:
配置项 | 说明 |
---|---|
tickTime |
ZooKeeper使用的时间,单位毫秒,一般用于心跳检测,而ZooKeeper中的最小session超时时间是此项的两倍 |
dataDir |
保留内存数据库快照的地址,如果不单独指定,事务日志也会记录在此 |
clientPort |
服务端监听的端口号 |
initLimit |
集群中的follower服务器与leader服务器之间初始连接时的最大心跳数 |
syncLimit |
集群中follower服务器与leader服务器之间通讯时的最大心跳数 |
- 配置完成后即可在bin目录下执行对应的文件启动了,Windows下为
zkServer.bat
,Linux下为zkServer.sh
。
ZooKeeper应用
通过zkCli进行使用
- ZooKeeper启动后,可以通过
bin
目录下自带的客户端进行访问,Windows下为zkCli.bat
,Linux下为zkCli.sh
。 - 启动时默认连接
localhost:2181
,如果有需要连接远程或其他端口的情况,可以如下添加参数:
zkCli.sh -server IP:Port
进入客户端后执行
help
(此处是一个随意的指令,只要不是zkCli支持的操作都可以)可查看其支持的操作,关于所有操作的介绍请参考官方页面:https://zookeeper.apache.org/doc/current/zookeeperCLI.html常用操作介绍:
- 查看节点信息,节点路径不能以“/”结尾
ls /
ls /zookeeper
- 创建一个节点
create /test
create /test/testa
- 查看节点状态
stat /test
stat /test/testa
- 删除节点
# 删除单个空节点
delete /test/testa
delete /test
# 级联删除
deleteall /test
*退出客户端
quit
通过ZooKeeper客户端使用
因为笔者的第一开发语言是Java,这里以Java为例。常用的ZooKeeper Java客户端用zkclient和Apache Curator两种。zkclient是github上的一个开源项目,该项目在2018年10月2日后停止更新;Apache Curator是Apache基金会的开源项目,目前持续更新,推荐使用。常用的分布式RPC框架DUBBO也在2019年1月份推出的2.7.0版本中将默认的ZooKeeper客户端由zkclient切换为Apache Curator,此文中的示例也使用Apache Curator。
- 创建一个Maven项目,然后在pom.xml中引用Apache Curator,以下是笔者的文件内容,除了Apache Curator外添加了测试使用的junit并设置了编译使用的java版本。
<?xml version="1.0" encoding="UTF-8"?>
<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>org.example</groupId>
<artifactId>apache-curator</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.apache.curator/curator-recipes -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.3.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.6.2</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
- 之后在
src\test\java\
目录创建com\aotian\curator\test\Tester.java
,文件基本框架如下,主要是创建一个空的测试类
public class Tester {
@Test
public void testCurator() {
}
}
- 接下来就是使用Apache Curator提供的API对ZooKeeper进行访问了。首先介绍下常用的API
- 创建客户端
RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
CuratorFramework curatorFramework = CuratorFrameworkFactory.newClient("localhost:2181", retryPolicy);
curatorFramework.start();
- 检查节点是否存在,存在的话返回
Stat
对象,不存在则返回null
curatorFramework.checkExists().forPath("/localhost/aotian");
- 创建节点,
forPath
第二个参数可以指定节点内容,不设置时创建空节点
curatorFramework.create().creatingParentContainersIfNeeded().forPath("/localhost/aotian", message.getBytes());
- 设置节点内容,仅适用于已存在的节点,否则会报错
curatorFramework.setData().forPath("/localhost/aotian", message.getBytes());
- 获取节点信息,以下代码表示将获取的节点信息保存到
result
对象。
Stat result = new Stat();
curatorFramework.getData().storingStatIn(result).forPath("/localhost/aotian");
- 获取节点内容
byte[] results = curatorFramework.getData().forPath("/localhost/aotian");
- 完整示例如下,结尾添加了线程睡眠的代码,可以在睡眠时间内通过
zkCli
查看服务端中的内容。
@Test
public void testCurator() {
// 创建客户端
RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
CuratorFramework curatorFramework = CuratorFrameworkFactory.newClient("localhost:2181", retryPolicy);
curatorFramework.start();
// 定义节点内容
String message = "testCurator";
try {
// 判断节点是否存在不存在则创建,存在则设置指定值
Stat a = curatorFramework.checkExists().forPath("/localhost/aotian");
if (a == null){
curatorFramework.create()
.creatingParentContainersIfNeeded()
.forPath("/localhost/aotian", message.getBytes());
}else{
curatorFramework.setData().forPath("/localhost/aotian", message.getBytes());
}
// 获取节点信息
Stat result = new Stat();
curatorFramework.getData().storingStatIn(result).forPath("/localhost/aotian");
System.out.println(result.getCtime());
// 获取节点内容
byte[] results = curatorFramework.getData().forPath("/localhost/aoitan");
System.out.println(new String(results));
// 线程睡10S,这段时间内可以通过客户端查看节点内的信息,结束后只能查看到空节点
Thread.sleep(100000);
} catch (Exception e) {
e.printStackTrace();
}finally {
curatorFramework.close();
}
}
ZooKeeper集群搭建
ZooKeeper集群中包含两种角色:Leader和Follower,因为ZooKeeper集群是半数节以上节点正常时才会正常提供服务,所以一般ZooKeeper集群中节点数量均为奇数。我们按照最小数量算,准备三台zookeeper服务器。
- 分别按照本文一开始的单机配置配置好三个ZooKeeper服务。个人联系或可以在同一台机器上部署三个ZooKeeper,只要解决端口冲突问题即可,实际生产过程中务必使用三台机器进行搭建,否则一旦机器出问题则整个集群瘫痪。
- 准备好三台ZooKeeper服务器之后我们准备开始集群的配置,首先我们需要规划好ZooKeeper的ID,然后在
datadir
属性对应的目录下创建一个myid
文件。然后在文件内写上当前服务对应的ID,笔者规划的是0、1、2,所以我需要添加的配置文件如下:
IP地址 | 文件路径 | 文件内容 |
---|---|---|
192.168.142.7 | /tmp/zookeeper/myid | 0 |
192.168.142.8 | /tmp/zookeeper/myid | 1 |
192.168.142.9 | /tmp/zookeeper/myid | 2 |
datadir
属性默认在/tmp
目录下,此目录会被定期清理掉,生产环境不要使用。
3、配置完以上文件后,需要配置之前的zoo.cfg
,在最后添加以下内容,其中server.*
对应myid
文件中的ID号,192.168.142.7
是IP地址,2888
是ZooKeeper集群的通讯端口,3888
是集群选取Leader使用的端口。
server.0=192.168.142.7:2888:3888
server.1=192.168.142.8:2888:3888
server.2=192.168.142.9:2888:3888
4、最后检查防火墙是否开放了2181、2888、3888端口,确认开放后启动ZooKeeper即可。通过执行zkServer.sh status
命令可以查看当前机器的状态。
[root@centos-server-01 bin]# ./zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /usr/apache-zookeeper-3.6.0/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: follower
[root@centos-server-02 bin]# ./zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /usr/apache-zookeeper-3.6.0/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: leader
ZooKeeper使用入门的更多相关文章
- zookeeper编程入门系列之zookeeper实现分布式进程监控和分布式共享锁(图文详解)
本博文的主要内容有 一.zookeeper编程入门系列之利用zookeeper的临时节点的特性来监控程序是否还在运行 二.zookeeper编程入门系列之zookeeper实现分布式进程监控 三. ...
- zookeeper windows 入门安装和测试
一.序言 以下是我对zookeeper 的一些理解: zookeeper 作为一个服务注册信息存储的管理工具,好吧,这样说得很抽象,我们举个“栗子”. 栗子1号: 假设我是一家 ...
- zookeeper从入门到放弃
第1章 Zookeeper入门 1.1 概述 Zookeeper是一个开源的分布式的,为分布式应用提供协调服务的Apache项目. 1.2 特点 1.3 数据结构 1.4 应用场景 提供的服务包括:统 ...
- Zookeeper从入门到精通(开发详解,案例实战,Web界面监控)
ZooKeeper是Hadoop的开源子项目(Google Chubby的开源实现),它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护.命名服务.分布式同步.组服务等. Zookee ...
- zookeeper快速入门
一.zookeeper简介 zookeeper 是apache旗下的hadoop子项目,它一个开源的,分布式的服务协调器.同样通过zookeeper可以实现服务间的同步与配置维护.通常情况下,在分布式 ...
- Zookeeper 快速入门(上)
来源:holynull, blog.leanote.com/post/holynull/Zookeeper 如有好文章投稿,请点击 → 这里了解详情 Zookeeper是Hadoop分布式调度服务,用 ...
- ZooKeeper学习总结 第一篇:ZooKeeper快速入门
1. 概述 Zookeeper是Hadoop的一个子项目,它是分布式系统中的协调系统,可提供的服务主要有:配置服务.名字服务.分布式同步.组服务等. 它有如下的一些特点: 简单 Zookeeper的核 ...
- Zookeeper之入门(原理、基础知识)
Zookeeper介绍 Zookeeper是分布式应用程序的协调服务框架,是Hadoop的重要组件.ZK要解决的问题: 1.分布式环境下的数据一致性. 2.分布式环境下的统一命名服务 3.分布式环境下 ...
- zookeeper 快速入门
分布式系统简介 在分布式系统中另一个需要解决的重要问题就是数据的复制.我们日常开发中,很多人会碰到一个问题:客户端C1更新了一个值K1由V1更新到V2.但是客户端C2无法立即读取到K的最新值.上面的例 ...
- springboot+Zookeeper+Dubbo入门
最近想学习dubbo,就利用周末写了一个特别简单的demo,不知道有没有用,先记录一下. 1.安装zookeeper并启动(安装看我上一篇博客https://www.cnblogs.com/huang ...
随机推荐
- 掌握了Docker Layer Caching才敢自称精通Dockerfile
长话短说: 本次原创将向您展示在Docker中使用Layer Cache以加快镜像构建. 这个话题的初衷在于:应用程序打包过程是很慢的(下载并安装框架&第三方依赖包.生成assets),这在D ...
- ios时间显示NaN
问题是当时js里时间是这种格式的 2016-09-07 16:37:50 用var time = obj.replace(/\-/g, "/");将格式改成 2016/09/07 ...
- MIT6.828准备:MacOS下搭建xv6和risc-v环境
本文介绍在MacOS下搭建Mit6.828/6.S081 fall2019实验环境的详细过程,包括riscv工具链.qemu和xv6,对于Linux系统同样可以参考. 介绍 只有了解底层原理才能写好上 ...
- 整理总结数据库常用sql语句,建议收藏,忘记了可以来看一下
第一节课:sql语言介绍(参照PPT)及基本查询sql学习 1.数据库表的介绍 emp表:员工表 dept表:部门表 salgrady:薪资水平表 Balance: 2.基本的查询语句: 知识点: s ...
- [JavaWeb基础] 012.Struts2 自定义标签使用
在做开发中,我们会把一些比较经常使用到的代码封装起来,这样可以加快开发的速度和减少错误,并且在修改bug可以一次修改多次修复.那么在前端页面上,如果我们要经常用到公用的显示功能,并涉及到服务端逻辑操作 ...
- Java IO(十五)FilterReader 和 FilterWriter、FilterReader 子类 PushBackReader
Java IO(十五)FilterReader 和 FilterWriter.FilterReader 子类PushBackReader 一.介绍 FilterReader 和 FilterWrite ...
- 云中奈飞(一):Netflix的上云之旅
作者按: Netflix(译为奈飞/网飞)公司自1997年创立以来,已发展成为美国最大的互联网流媒体服务商.它从2008到2015年间长达七年的将其所有IT系统从自有数据中心迁移到AWS之上的旅程,在 ...
- # # # Vue的分环境打包
我们使用Vue-cli的默认环境是只有dev和prod两种环境,在开发中我们的项目一般是开发版.测试版.pre版.Prod版.我们一般是在源码中API地址中修改后然后打包. ###1.首先安装cros ...
- kubeadm实现k8s高可用集群环境部署与配置
高可用架构 k8s集群的高可用实际是k8s各核心组件的高可用,这里使用主备模式,架构如下: 主备模式高可用架构说明: 核心组件 高可用模式 高可用实现方式 apiserver 主备 keepalive ...
- Rocket - debug - Periphery
https://mp.weixin.qq.com/s/uGxn-Xec0LkwdaSsCtQBvw 简单介绍Periphery的实现. 1. ExportDebugDMI/ExportDebugJTA ...