一、概述

集中式 向 分布式演变,高并发、海量存储

应用场景:

* 数据发布、订阅的两种方式:推模式、拉模式
* 命名服务
* 分布式协调/通知(心跳检测)
* 负载均衡

自增长id和uuid的缺点,前者只能在单表中使用,后者可在分布式环境使用,但不易于理解、寻找规律

二、基本概念

1、集群中的角色:

* Leader
* Follower
* Observer

2、会话

客户端与Zookeeper的连接,其连接是通过TCP长连接,保持会话,客户端会向Zookeeper端上报心跳。会话也被叫做Session

3、版本

版本的作用是进行分布式锁控制,锁分为两种,悲观锁和乐观锁
悲观锁适合并发竞争激烈的场景,能避免数据不一致的情况,上一个事务没完成,下一个事务不能开始。乐观锁的并发控制是,加入版本号,每次读取记录时首先会获得版本号,插入数据时,也会将版本号带到参数中,若更新失败,说明其他事务已经修改过数据,会抛出异常给客户端,让其进行处理(重试) version 当前数据内容节点版本号
cversion 当前数据子节点版本号
aversion 当前数据节点ACL变更版本号

4、节点

服务器(节点)

数据模型中的节点

5、watcher

客户端可以在zookeeper中注册watcher,当zookpeer上的内容改变时,会通知客户端获取

6、ACL权限控制

CREATE 创建子节点的权限

READ 读取节点数据、子节点列表的权限

WRITE 更新节点数据的权限

DELETE 删除子节点的权限

ADMIN 设置节点ACL权限

三、环境安装

1、创建文件夹

/opt 用来安装自己的应用软件

/var 用来存放日志输出

2、下载zookeeper

wget 下载链接

3、进行配置

(1)修改Zoo.cfg

dataDir 是用来存放数据快照

clientPort 对外提供的端口号,默认2181

server.id=ip:port:port

server.1=ip:port:port

server.2=ip:port:port

server.3=ip:port:port

(2)在/var/zookeeper中创建myid,内容为id编号,如1

4、启动

export ZK_HOME = /../zookeeper

export PATH=\(PATH:\)ZK_HOME/bin

Zookeeper/bin zkServer.sh start

telnet ip port(2181)

输入 stat 查看状态

四、zk命令

1、启动客户端连接到服务器

zkCli.sh -server serverip:2181

help

quit

ls /   //列出节点

create  /path content

get /path   //查看数据

set /path conent //设置数据

delete  /path      //删除一个节点

rmr /a                //递归删除所有节点

五、通过API访问zk

1、获取根下的目录

(1) 导入依赖包


<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>RELEASE</version>
</dependency> <dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.9</version>
</dependency>

(2)测试代码

fonxian1 对应的是zk服务器的ip地址


@org.junit.Test
public void ls() throws Exception{
ZooKeeper zk = new ZooKeeper("fonxian1:2181",10000,null);
List<String> list = zk.getChildren("/",false);
for(String str:list){
System.out.println(str);
} }

2、递归获取根下所有文件名


@org.junit.Test
public void lsAll() {
try {
ls("/");
} catch (Exception e) {
e.printStackTrace();
}
} public void ls(String path) throws Exception { ZooKeeper zk = new ZooKeeper("fonxian1:2181", 10000, null);
List<String> list = zk.getChildren(path, false);
if (list == null || list.isEmpty()) {
return;
}
for (String str : list) {
if ("/".equals(path)) {
System.out.println(path + str);
ls(path + str);
} else {
System.out.println(path + "/" + str);
ls(path + "/" + str);
} } }

3、添加数据


@org.junit.Test
public void setData () { try{
ZooKeeper zk = new ZooKeeper("fonxian1:2181", 10000, null);
zk.setData("/a","fonxian".getBytes(),2);
}catch (Exception e){
e.printStackTrace();
}
}

出现版本号错误的提示

org.apache.zookeeper.KeeperException$BadVersionException: KeeperErrorCode = BadVersion for /a

	at org.apache.zookeeper.KeeperException.create(KeeperException.java:115)
at org.apache.zookeeper.KeeperException.create(KeeperException.java:51)
at org.apache.zookeeper.ZooKeeper.setData(ZooKeeper.java:1327)
at com.fonxian.ZookeepTest.setData(ZookeepTest.java:47)

原因是Zookeeper服务器中/a的版本号为0,将代码中的版本号设置为0,即可执行成功

[zk: 127.0.0.1(CONNECTED) 0] get /a
tom
cZxid = 0x200000002
ctime = Sun Mar 18 15:49:45 CST 2018
mZxid = 0x200000002
mtime = Sun Mar 18 15:49:45 CST 2018
pZxid = 0x20000000f
cversion = 3
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 3

4、添加临时节点

create [-s] [-e] path data acl

参数s ,表示序列节点,会在父节点下创建一个10个0+父节点名的节点

参数e,表示临时节点,临时节点在会话结束时会被删除,在leader选举中扮演重要作用


@Test
public void setTempData() { try { ZooKeeper zk = new ZooKeeper("fonxian1:2181", 10000, null);
zk.create("/a/t","fonxian".getBytes(), ZooDefs.Ids.READ_ACL_UNSAFE, CreateMode.EPHEMERAL);
System.out.println("hello");
} catch (Exception e) {
e.printStackTrace();
} }

5、使用观察者

观察者的作用在于,当数据发生修改,服务器会通知客户端数据修改,每次注册,只会通知一次。


@Test
public void testWatch(){ try { final ZooKeeper zk = new ZooKeeper("fonxian1:2181", 50000, null); Watcher w = new Watcher() { public void process(WatchedEvent watchedEvent) {
try{
System.out.println("data change");
byte[] newData = zk.getData("/a",this,null);
System.out.println("new data = "+new String(newData));
}catch (Exception e){
e.printStackTrace();
}
}
} ; byte[] data = zk.getData("/a",w,null);
System.out.println(new String(data)); while(true){ } } catch (Exception e) {
e.printStackTrace();
} }

Zookeeper(一) —— 环境搭建的更多相关文章

  1. [ZooKeeper] 2 环境搭建

    上一篇中我们介绍了 ZooKeeper 的一些基本概念,这篇我们讲一下 ZooKeeper 的环境搭建. ZooKeeper 安装模式 单机模式:ZooKeeper 运行在一台服务器上,适合测试环境: ...

  2. dubbo+zookeeper+dubboadmin环境搭建

    4.环境搭建 4.1.zookeeper注册中心的配置安装(在windows平台下,Linux类似,见官方文档)(Redis注册中心安装,简易注册中心安装,简易监控中心安装,见官方文档) 下载zook ...

  3. Zookeeper+Dubbo环境搭建与Demo测试

     环境准备: 1. zookeeper-3.4.14     (下载地址:http://archive.apache.org/dist/zookeeper/) 2. dubbo-0.2.0 (下载地址 ...

  4. dubbo+zookeeper简单环境搭建

    dubbo+zoopeeper例子 [TOC] 标签(空格分隔): 分布式 dubbo dubbo相关 dubbo是目前国内比较流行的一种分布式服务治理方案.还有一种就是esb了.一般采用的是基于Ap ...

  5. Zookeeper 分布式环境搭建

    一.前期环境 安装概览 IP Host Name     Software     192.168.23.128     ae01 JDK 1.7 192.168.23.129 ae02 JDK 1. ...

  6. 十五、Hadoop学习笔记————Zookeeper的环境搭建

    linux中/opt一般用来存放应用/var目录一般用来存放日志 sample为样例文件,复制一份zoo.cfg文件 配置zoo文件,id为服务器id(整数),host为服务器的ip地址,第一个por ...

  7. zookeeper编译环境搭建

    当前我使用的jdk环境是1.8 当看到build successful的时候 说明已经构建成功,在这个期间会下载一些工具,发现下载很慢,比如ivy-2.4.0.jar包,如果下载不下来,可以进行手工下 ...

  8. zookeeper+Dubbo环境搭建及简单Demo

    1 安装zk https://www.cnblogs.com/feifeicui/p/11175502.html 2 安装 dubbo-admin https://www.cnblogs.com/fe ...

  9. Linux系统zookeeper环境搭建(单机、伪分布式、分布式)

    本人现在对zookeeper的环境搭建做一个总结,一般zookeeper的安装部署可以有三种模式,单机模式.伪分布式和分布式,这三种模式在什么时候应用具体看大家的使用场景,如果你只有一台机器且只是想自 ...

  10. Hadoop学习笔记—14.ZooKeeper环境搭建

    从字面上来看,ZooKeeper表示动物园管理员,这是一个十分奇妙的名字,我们又想起了Hadoop生态系统中,许多项目的Logo都采用了动物,比如Hadoop采用了大象的形象,所以我们可以猜测ZooK ...

随机推荐

  1. vue监听滚动事件-元素固定位置显示

    1.监听滚动事件 用VUE写一个在控制台打印当前的scrollTop用来测试是否执行: mounted () { window.addEventListener('scroll', this.hand ...

  2. The META for Mobile terminal

    近来想写一些好玩的手机网页,在这里整理了一下在手机端的meta标签,以免下次忘记,再去网上搜. meta指元素可提供有关页面的元信息(meta-information),比如针对搜索引擎和更新频度的描 ...

  3. 【Solidity】学习(1)

    string string类型不可以直接通过length读取字符串长度,也不可以直接通过下标直接访问数据元素 使用的方法是:强制类型转换为bytes 其中," " 和‘ ’都可以表 ...

  4. MyBatis 源码分析系列文章合集

    1.简介 我从七月份开始阅读MyBatis源码,并在随后的40天内陆续更新了7篇文章.起初,我只是打算通过博客的形式进行分享.但在写作的过程中,发现要分析的代码太多,以至于文章篇幅特别大.在这7篇文章 ...

  5. 使用bat脚本部署hexo到coding和github

    因项目的不同适当的改造吧,本文以hexo为例. 拉取coding.net的代码和github的代码到本地 确保代码能够正常的运行,commit,push 在项目的目录外新建一个push.bat文件 快 ...

  6. Hive数仓之快速入门(二)

    上次已经讲了<Hive数据仓库之快速入门一>不记得的小伙伴可以点击回顾一下,接下来我们再讲Hive数据仓库之快速入门二 DQL hive中的order by.distribute by.s ...

  7. Django项目配置日志

    LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'formatters': { 'verbose': { 'format': ...

  8. Java核心技术卷一基础知识-第7章-图形程序设计-读书笔记

    第7章 图形程序设计 本章内容: * Swing概述 * 创建框架 * 框架定位 * 在组件中显示信息 * 处理2D图形 * 使用颜色 * 文本使用特殊字体 * 显示图像 本章主要讲述如何编写定义屏幕 ...

  9. 吴恩达机器学习笔记42-大边界的直观理解(Large Margin Intuition)

    这是我的支持向量机模型的代价函数,在左边这里我画出了关于

  10. C++ Opencv split()通道分离函数 merge()通道合并函数 使用操作详解

    一. split()通道分离函数 split()函数的C++版本有两个原型,他们分别是: C++: void split(const Mat& src, Mat*mvbegin);//& ...