ZooKeeper入门–云惠网

云惠网小编 2020年12月31日11:41:01
评论
15192字阅读50分38秒
摘要

ZooKeeper是一个软件,来自Apache软件基金会。

广告也精彩

1. ZooKeeper

1.1、ZooKeeper概述

ZooKeeper是一个软件,来自Apache软件基金会。

Zookeeper是一个分布式协调服务的开源框架。 主要用来解决分布式集群中应用系统的一致性问题,例如怎样避免同时操作同一数据造成脏读的问题。

ZooKeeper本质上是一个分布式的小文件存储系统。 提供基于类似于文件系统的目录树方式的数据存储,并且可以对树中的节点进行有效管理。从而用来维护和监控你存储的数据的状态变化。通过监控这些数据状态的变化,从而可以达到基于数据的集群管理。 诸如: 统一命名服务、分布式配置管理、分布式消息队

1.2、ZooKeeper特性

1. 全局数据一致:集群中每个服务器保存一份相同的数据副本,client无论连接到哪个服务器,展示的数据都是一致的,这是最重要的特征

2. 可靠性:如果消息被其中一台服务器接受,那么将被所有的服务器接受

3. 顺序性:包括全局有序和偏序两种:全局有序是指如果在一台服务器上消息 a 在消息 b 前发布,则在所有Server 上消息 a 都将在消息 b 前被发布; 偏序是指如果一个消息 b 在消息 a 后被同一个发送者发布, a 必将排在 b 前面。

4. 数据更新原子性:一次数据更新要么成功(半数以上节点成功),要么失败,不存在中间状态

5. 实时性: Zookeeper保证客户端将在一个时间间隔范围内获得服务器的更新信息,或者服务器失效的信息。

1.3、ZooKeeper集群角色

开发中有两种常见的集群:

1、主从集群

解决服务器的访问量过大的问题

主角色:leader master 老大

从角色:follower slave 小弟

主从角色各自负责不同的职责,从角色受到主角色的管理

角色指的是软件的一个组件(一个进程)

2、主备集群

解决服务器单点故障

主备角色的职责一模一样,同一时刻只能有一个工作

结论:ZooKeeper属于主从集群

Leader:

Zookeeper 集群工作的核心

事务请求(写操作)的唯一调度和处理者,保证集群事务处理的顺序性; 集群内部各个服务器的调度者。

对于create, setData, delete等有写操作的请求,则需要统一转发给leader处理, leader需要决定编号、执行操作,这个过程称为一个事务。

Follower:

处理客户端非事务(读操作)请求,转发事务请求给Leader;

参与集群 Leader 选举投票。

此外,针对访问量比较大的 zookeeper 集群, 还可新增观察者角色。

Observer:

观察者角色,观察 Zookeeper 集群的最新状态变化并将这些状态同步过来,其对于非事务请求可以进行独立处理,对于事务请求,则会转发给 Leader 服务器进行处理。

不会参与任何形式的投票只提供非事务服务,通常用于在不影响集群事务处理能力的前提下提升集群的非事务处理能力。(说白了就是增加并发的读请求)

1.4、ZooKeeper集群搭建

Zookeeper 集群搭建指的是 ZooKeeper分布式模式安装。 通常由 2n+1 台 servers组成。 这是因为为了保证Leader 选举(基于Paxos算法(分布式一致性算法)的实现)能过得到多数的支持,所以 ZooKeeper集群的数量一般为奇数

1.4.1、安装JDK

Zookeeper 运行需要 java 环境, 所以需要提前安装jdk

JDK的安装过程:

1、创建一个文件夹,软件安装在此文件夹中

2、把jdk安装包直接放到/export/servers文件夹中并解压

3、配置Linux环境变量

#配置环境变量

vi /etc/profile

#在profile中键入以下内容:

export JAVA_HOME=/export/servers/jdk1.8.0_65

export PATH=$PATH:$JAVA_HOME/bin

export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

#刷新配置

source /etc/profile

1.4.2、安装ZooKeeper

1.4.2.1、安装前检测

检测1:检测集群服务器的时间是否同步(集群服务器的时间同步很重要)

设置时间同步的原由:

1、ZooKeeper集群服务器需要保证全局数据的一致性(只有同步各服务器节点的时间,才能辨别事务性请求执行的先后顺序)

2、判断集群服务器节点是否可用

例如:节点A服务器每隔3秒钟和节点B服务器发送一次消息,从而判断节点B服务器是否还处于活动状态,当服务器时间不同步时,虽然消息是发送过去了,但随着消息一起发过去的时间,会拿A服务器的时间和B服务器的时间进行比较,当节点B的时间和节点A的时间相差比较大时,会认为节点B服务器属于过时的服务器(该服务器不可用)

解决集群服务器同步时间的方法:

l手动设置时间同步

date -s "2018-03-03 03:03:03"

l互联网自动同步(推荐)

yum install ntpdate

ntpdate cn.pool.ntp.org

检测2:检测防火墙是否关闭

关闭防火墙的原由: 防火墙是针对外网访问时才有作用

集群服务器通常都是在内网搭建的,对外有一个独立的服务器(对外服务器),而这个对外服务器上有防火墙。如果在内网集群服务器上设置防火墙,一是没有什么意义,二是在后期还需要对防火墙设置不同的开放端口(没必须的麻烦)

检测3:检测主机和IP映射有没有配置(如果直接使用ip配置,可以省略此项检测)

1.4.2.2、安装前准备

准备1:/etc/hosts文件 (确保3个节点上都可以利用主机映射到IP)

scp -r /etc/hosts [email protected]:/etc/ 或: scp -r /etc/hosts [email protected]:/etc/

测试:

准备2:SSH免密登录设置(确保node-1节点以免密方式登录node-2、node-3)

ssh-copy-id 主机名 或者 ssh-copy-id IP地址

准备3:JDK安装及配置(确保node-2、node-3节点也安装JDK)

解决方案:

第一步:使用scp命令,把jdk拷贝到其它节点服务器

再次执行scp命令后:

第二步:使用scp命令,把/etc/profile文件拷贝到其它服务器节点上(环境变量)

scp -r /etc/profile [email protected]:/etc/

1.4.2.3、安装ZooKeeper

对于安装leader+follower模式的集群,大致过程如下:

l 下载并解压ZooKeeper安装包

l 修改ZooKeeper配置文件

l 远程复制分发安装文件

l 设置myid

l 启动ZooKeeper集群

安装ZK步骤:

1、拷贝zk安装包到node-1节点服务器

2、解压zookeeper

3、修改ZooKeeper配置文件

第1步:拷贝一份zk配置文件

第2步:配置数据存储路径

第3步:配置集群服务器列表

修改1:dataDir配置 (数据的存储目录)

dataDir=/apps/data/zkdata

修改2:添加集群服务器列表

server.A=B:C:D 例:server.1=node-1:2888:3888

解释说明:

A是一个数字,表示这个是第几号服务器

B是这个服务器的IP地址

C是集群内各节点服务器通讯使用(Leader监听此端口) (心跳端口号)

D是在leader挂掉时专门用来进行选举leader所用的端口(选举端口号)

zookeeper有三个端口(可以修改):

2181 作用:对cline端提供服务

3888 作用:选举leader使用

2888 作用:集群内机器通讯使用(Leader监听此端口)【也称为心跳端口】

4、远程复制分发安装文件到其它节点服务器

scp -r /export/servers/zookeeper/ [email protected]:/export/servers/

5、设置各节点服务器的myid配置

在之前zoo.cfg配置文件中,设置过ZooKeeper保存数据的目录和集群服务器列表

在以上配置文件中存在一个server.1、server.2、server.3,而数字1、2、3就是用来表示当前服务器的编号(服务器的id)。

问题:那么当前服务器怎么就代表是编号1或2或3了呢?

答案:根据每个节点服务器中设置的myid配置

配置myid:

在保存zookeeper数据的目录中,创建一个myid文件,并向文件中写入当前服务器编号

说明:

1、myid文件里面就只有一个数字(id),用来唯一标识这个服务器(保证整个集群中唯一性)

2、 zookeeper会根据这个id来取server.x上的配置。比如当前id为1,则对应着zoo.cfg配置文件中的server.1这个配置

6、启动ZooKeeper集群

命令: zkServer.sh start

查看集群状态:

1、jps(查看进程)

2、zkServer.sh status(查看集群状态,主从信息)

小结:

前置检查:

1、JDK及PATH环境变量

2、时间同步

3、关闭防火墙

4、配置IP和主机名的映射

5、设置免密登录(访问其他局域网中的服务器,传输文件时方便)

安装步骤:

1、下载解压zk

2、修改zk中的配置文件(路径:…/conf/zoo.cfg)

拷贝一份配置文件,名为:zoo.cfg

修改dataDir路径

配置集群列表: server.编号=ip:2888:3888

3、把zk分发到其他节点服务器

4、配置各个节点服务器中的myid (server后的编号)

5、启动zk (方式: ./zkServer.sh start)

2. ZooKeeper数据模型

前面我们已经完成了ZooKeeper的安装和集群搭建,下面我们更深入的了解下ZooKeeper。

ZooKeeper的数据模型,在结构上和标准文件系统的非常相似,拥有一个层次的命名空间,都是采用树形层次结构,ZooKeeper树中的每个节点被称为:Znode

和文件系统的目录树一样,ZooKeeper树中的每个节点可以拥有子节点。但也有不同之处:

1、Znode 兼具文件和目录两种特点。既像文件一样维护着数据、元信息、ACL 时间戳等数据结构,又像目录一样可以作为路径标识的一部分,并可以具有子Znode。用户对Znode 具有增、删、改、查等操作(权限允许的情况下)。

2、Znode 具有原子性操作, 读操作将获取与节点相关的所有数据,写操作也将替换掉节点的所有数据。另外,每一个节点都拥有自己的ACL(访问控制列表),这个列表规定了用户的权限,即限定了特定用户对目标节点可以执行的操作。

3、Znode 存储数据大小有限制。 ZooKeeper虽然可以关联一些数据,但并没有 被设计为常规的数据库或者大数据存储,相反的是,它用来管理调度数据,比如分布式应用中的配置文件信息、状态信息、汇集位置等等。这些数据的共同特性就是它们都是很小的数据, 通常以KB为大小单位。ZooKeeper的服务器和客户端都被设计为严格检查并限制每个Znode的数据大小至多1M,当时常规使用中应该远小于此值。

4、Znode 通过路径引用, 如同Unix中的文件路径。路径必须是绝对的,因此他们必须由斜杠字符来开头。除此以外,他们必须是唯一的,也就是说每一个路径只有一个表示,因此这些路径不能改变。在ZooKeeper中,路径由Unicode字符串组成,并且有一些限制。字符串"/zookeeper"用以保存管理信息,比如关键配额信息。

2.1、数据结构图

图中的每个节点称为一个 Znode

每个Znode由3部分组成:

① stat:此为状态信息, 描述该Znode的版本, 权限等信息

② data:与该Znode关联的数据

③ children:该Znode下的子节点

2.2、节点类型

Znode有两种,分别为临时节点和永久节点。

节点的类型在创建时即被确定,并且不能改变。

临时节点:该节点的生命周期依赖于创建它们的会话。一旦会话结束,临时节点将被自动删除,当然可以也可以手动删除。临时节点不允许拥有子节点

永久节点:该节点的生命周期不依赖于会话,并且只有在客户端显示执行删除操作的时候,他们才能被删除。

Znode还有一个序列化的特性,如果创建的时候指定的话,该Znode的名字后面会自动追加一个不断增加的序列号。序列号对于此节点的父节点来说是唯一的,这样便会记录每个子节点创建的先后顺序。它的格式为“%10d”(10位数字,没有数值的数位用0补充,例如“0000000001”)

根据节点的种类及特性可以分为四种类型的 Znode 节点,分别对应:

永久节点 :PERSISTENT

临时节点 :EPHEMERAL

永久节点、序列化 :PERSISTENT_SEQUENTIAL

临时节点、序列化 :EPHEMERAL_SEQUENTIAL:

2.3、节点属性

每个 znode 都包含了一系列的属性,通过命令 get, 可以获得节点的属性。

dataVersion: 数据版本号,每次对节点进行set操作,dataVersion的值都会增加1(即使设置的是相同的数据),可有效避免了数据更新时出现的先后顺序问题

cversion : 子节点的版本号。当znode的子节点有变化时,cversion的值就会增加1

aclVersion : ACL的版本号

cZxid : Znode创建的事务id

mZxid : Znode被修改的事务id,即每次对znode的修改都会更新mZxid

对于zk来说,每次的变化都会产生一个唯一的事务id,zxid(ZooKeeper Transaction Id)。通过zxid,可以确定更新操作的先后顺序。例如,如果zxid1小于zxid2,说明zxid1操作先于zxid2发生,zxid对于整个zk都是唯一的,即使操作的是不同的znode

ctime: 节点创建时的时间戳

mtime: 节点最新一次更新发生时的时间戳

ephemeralOwner: 如果该节点为临时节点, ephemeralOwner值表示与该节点绑定的session id. 如果不是, ephemeralOwner值为0

3. ZooKeeper Shell

在ZooKeeper启动成功之后,就成为了一个服务(集群式服务),此时就可以使用客户端连接ZooKeeper服务并进行操作。【这种情况也是我们常说的C/S模型】

ZooKeeper自身提供一个Shell客户端,是利用shell命令的方式连接ZooKeeper

3.1、客户端连接

Zookeeper shell客户端:

运行 zkCli.sh –server ip 进入命令行工具

3.2、Shell基本操作

输入 help,输出 zk shell 提示:

3.2.1、创建节点

创建节点 :create [-s] [-e] path data acl

其中, -s 或-e 分别指定节点特性:顺序或临时节点,若不指定,则表示持久节点; acl 用来进行权限控制。

创建永久节点:create path data

创建顺序节点:create -s path data

创建临时节点:create -e path data

注意:临时节点下不能创建子节点

小结:

创建Znode节点的语法: create 绝对路径 数据[可以省略]

创建永久节点: create /zk itcast

创建临时节点: create -e /zktemp temp

创建序列节点: create -s /zk/a itcast

注意:创建a节点名称为a0000000000

3.2.2、读取节点

与读取相关的命令有 ls 命令和 get 命令, ls 命令可以列出Zookeeper指定节点下的所有子节点,只能查看指定节点下的第一级的所有子节点;get命令可以获取Zookeeper指定节点的数据内容和属性信息

ls path [watch] 列出指定节点下的所有子节点

get path [watch] 获取指定节点的数据内容和节点状态信息

ls2 path [watch] 列出当前节点下的子节点,同时列出节点状态

3.2.3、更新节点

更新节点:set path data [version]

data 就是要更新的新内容, version 表示数据版本。

3.2.4、删除节点

命令1:delete path [version] 删除znode节点

若删除节点存在子节点,那么无法删除该节点,必须先删除子节点,再删除父节点

命令2:rmr path 删除znode节点及其子节点

可以递归删除节点。

3.2.5、对节点增加限制

ZooKeeper可以在znode上设置配额限制(quota)。ZooKeeper是通过set,list,delete进行配额限制。配额是存储在/zookeeper/quota路径下的。

setquota -n|-b val path 对节点增加限制

n: 表示子节点的最大个数

b: 表示数据值的最大长度

val: 子节点最大个数或数据值的最大长度

path: 节点路径

listquota path 列出指定节点的quota

如果超出了配置限制,ZooKeeper将会在log日志中打印WARN日志。如果超出配额限制,并不会停止行为操作(软性限制)

说明:zookeeper的log日志文件默认会在安装目录下的bin目录中存在

日志名称默认为:zookeeper.out

delquota [-n | -b] path 删除 quota

3.2.6、其他命令

history : 列出命令历史

redo:该命令可以重新执行指定命令编号的历史命令, 命令编号可以通过history查看

小结 :

创建节点:create -e -s znode节点路径 数据

读取节点:ls /znode节点路径 //列出当前节点下的所有子节点

get / znode节点路径 //获取到当前节点中存储的数据及节点的状态信息

ls2 / znode节点路径 //获取当前节点下所有的子节点及当前节点的状态信息

更新节点: set /znode节点路径 修改后的数据

删除节点: delete /znode节点路径 //删除的节点中不能包含子节点

rmr / znode节点路径 //删除当前节点及所有的子节点

增加限制 setquota -n(限制子节点个数) -b(限制数据长度)

delquota / znode节点路径

4. ZooKeeper Watcher

ZooKeeper 提供了分布式数据发布/订阅功能,一个典型的发布/订阅模型系统定义了一种一对多的订阅关系,能让多个订阅者同时监听某一个主题对象,当这个主题对象自身状态变化时,会通知所有订阅者,使他们能够做出相应的处理。

ZooKeeper中,引入了Watcher机制来实现这种分布式的通知功能。ZooKeeper 允许客户端向服务端注册一个Watcher监听,当服务端的一些事件触发了这个 Watcher,那么就会向指定客户端发送一个事件通知来实现分布式的通知功能。

触发事件种类很多, 如:节点创建,节点删除,节点改变,子节点改变等。

总的来说可以概括Watcher 为以下三个过程:

1、客户端向服务端注册 Watcher

2、服务端事件发生触发 Watcher

3、客户端回调 Watcher 得到触发事件情况

4.1、Watch机制特点

一次性触发

事件发生触发监听,一个 watcher event 就会被发送到设置监听的客户端, 这种效果是一次性的, 后续再次发生同样的事件,不会再次触发。

事件封装

ZooKeeper 使用 WatchedEvent 对象来封装服务端事件并传递。 WatchedEvent 包含了每一个事件的三个基本属性:

通知状态( keeperState), 事件类型( EventType) 和节点路径( path)

event 异步发送

watcher 的通知事件从服务端发送到客户端是异步的。

先注册再触发

Zookeeper中的watch 机制,必须客户端先去服务端注册监听,这样事件发送才会触发监听,通知给客户端。

4.2、通知状态和事件类型

同一个事件类型在不同的通知状态中代表的含义有所不同,下表列举了常见的通知状态和事件类型

其中连接状态事件(type=None, path=null) 不需要客户端注册,客户端只要有需要直接处理就行了。

4.3、Shell客户端设置Watcher

设置节点数据变动监听:get path watch

通过另一个客户端更改节点数据:set path data

此时设置监听的节点收到通知:

注意:watcher机制中监听是一次性的。

5. ZooKeeper Java API

除了使用shell客户端访问zk服务外,还可以利用Java语言去编写访问zk服务的客户端程序。

ZooKeeper针对Java语言提供了:ZooKeeper Java API

在使用java程序操作ZooKeeper时有两个核心对象需要关注:

org.apache.zookeeper.Zookeeper Zookeeper

是在Java中客户端主类,负责建立与zookeeper集群的会话,并提供方法进行操作。

org.apache.zookeeper.Watcher Watcher

接口表示一个标准的事件处理器,其定义了事件通知相关的逻辑,包含KeeperState和 EventType两个枚举类,分别代表了通知状态和事件类型,同时定义了事件的回调方法: process(WatchedEvent event)

process 方法是 Watcher 接口中的一个回调方法,当 ZooKeeper 向客户端发送一个 Watcher 事件通知时,客户端就会对相应的 process 方法进行回调,从而实现对事件的处理。

5.1、基本使用

第一步:建立java maven项目,引入maven pom坐标

在pom.xml文件中引入坐标:

<dependency>

<groupId>org.apache.zookeeper</groupId>

<artifactId>zookeeper</artifactId>

<version>3.4.9</version>

</dependency>

第二步:编写客户端java代码(创建一个带有main方法的普通java类)

TestZkClient.java代码:

package cn.itheima.zk;

import java.io.IOException;

import org.apache.zookeeper.CreateMode;

import org.apache.zookeeper.KeeperException;

import org.apache.zookeeper.WatchedEvent;

import org.apache.zookeeper.Watcher;

import org.apache.zookeeper.ZooDefs.Ids;

import org.apache.zookeeper.ZooKeeper;

/**

* zk客户端:基本使用

*

* @author Administrator

*

*/

public class TestZkClient {

public static void main(String[] args) throws IOException, KeeperException, InterruptedException {

/**

* 构造方法:ZooKeeper(connectString, sessionTimeout, watcher)

*

* connectString : zk服务的地址(格式: ip:端口号) [当多个地址时,使用逗号分隔]

* sessionTimeout : 会话超时时间 (一般和系统默认保持一致,系统默认:30000毫秒)

* watcher : Watcher对象(标准的事件处理器)

*/

//创建 ZooKeeper对象。建立与zookeeper集群的连接

ZooKeeper zKeeper = new ZooKeeper("192.168.153.123:2181", 30000, new Watcher() {

//事件的回调方法 (事件触发之后,客户端接收事件并处理)

public void process(WatchedEvent event) {

}

});

//创建新的节点

zKeeper.create("/zkjava", "hellojava".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);

//关闭连接

zKeeper.close();

}

}

运行后,查看Znode节点:

ZooKeeper构造方法:

ZooKeeper(String connectString, int sessionTimeout, Watcher watcher)

参数详解:

connectString : ZooKeeper server列表,以逗号隔开。

ZooKeeper对象初始化后,将从zk服务列表中选择一个server(服务),并尝试与其建立连接。

如果连接建立失败, 则会从列表的剩余项中选择一个server, 并再次尝试建立连接

sessionTimeout : 指定连接的超时时间

watcher : 事件回调接口

创建Znode节点方法:

CreateMode枚举:

TestZkClient.java代码(事件回调方法):

package cn.itheima.zk;

import java.io.IOException;

import org.apache.zookeeper.CreateMode;

import org.apache.zookeeper.KeeperException;

import org.apache.zookeeper.WatchedEvent;

import org.apache.zookeeper.Watcher;

import org.apache.zookeeper.ZooDefs.Ids;

import org.apache.zookeeper.ZooKeeper;

/**

* zk客户端:基本使用

*

* @author Administrator

*

*/

public class TestZkClient {

public static void main(String[] args) throws IOException, KeeperException, InterruptedException {

/**

* 构造方法:ZooKeeper(connectString, sessionTimeout, watcher)

*

* connectString : zk服务的地址(格式: ip:端口号) [当多个地址时,使用逗号分隔]

* sessionTimeout : 会话超时时间 (一般和系统默认保持一致,系统默认:30000毫秒)

* watcher : Watcher对象(标准的事件处理器)

*/

//创建 ZooKeeper对象。建立与zookeeper集群的连接

ZooKeeper zKeeper = new ZooKeeper("192.168.153.123:2181", 30000, new Watcher() {

//事件的回调方法 (事件触发之后,客户端接收事件并处理)

public void process(WatchedEvent event) {

System.out.println("事件发生的路径:"+event.getPath());

System.out.println("事件类型:"+event.getType());

System.out.println("通知状态:"+event.getState());

}

});

//创建新的节点

zKeeper.create("/zkcloud", "hellocloud".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);

//关闭连接

zKeeper.close();

}

}

运行结果:

解释:在ZooKeeper中有些监听是不需要客户端注册的 例如:连接成功自动触发

5.2、更多操作示例

添加操作:

public String create(final String path, byte data[], List<ACL> acl,CreateMode mode)

参数详解:

path: znode的路径

data: 与znode关联的数据

acl: 指定权限信息。如果不想指定权限,可以传入Ids.OPEN_ACL_UNSAFE

mode: 指定znode类型。CreateMode是一个枚举类

获取操作:

public byte[] getData(final String path, boolean watch, Stat stat) 获取节点下保存的数据

参数详解:

path: znode的路径

watch: watch参数用于指定是否监听path node的删除事件, 以及数据更新事件。

注意, 不监听path node的创建事件, 因为如果path node不存在, 该方法将抛出KeeperException.NoNodeException异常

stat: 传出参数, getData方法会将path node的状态信息设置到该参数中

public List<String> getChildren(String path, boolean watch) 获取子目录节点列表

参数详解:

path: znode的路径

watch:用于指定是否监听path node的子node的增加和删除事件, 以及path node本身的删除事件

修改操作:

Stat setData(final String path, byte data[], int version) 更新node关联的数据,返回path node的状态信息

参数详解:

path: znode的路径

data: 待更新的数据

version: 指定要更新的数据的版本, 如果version和真实的版本不同, 更新操作将失败

指定version为-1则忽略版本检查

删除操作:

void delete(final String path, int version)

参数详解:

path: znode的路径

version: 等同于setData方法中的version参数

其它操作:

Stat exists(String path, boolean watch) 判断znode是否存在

参数详解:

path: znode的路径

watch: 用于指定是否监听path node的创建,删除事件,以及数据更新事件

如果该node存在,则返回该node的状态信息,否则返回null

代码:

package cn.itheima.zk;

import java.io.IOException;

import org.apache.zookeeper.CreateMode;

import org.apache.zookeeper.KeeperException;

import org.apache.zookeeper.WatchedEvent;

import org.apache.zookeeper.Watcher;

import org.apache.zookeeper.ZooDefs.Ids;

import org.apache.zookeeper.ZooKeeper;

/**

* zk客户端:更多操作

*

* @author Administrator

*

*/

public class TestZkClient2 {

public static void main(String[] args) throws IOException, KeeperException,

InterruptedException {

// 创建 ZooKeeper对象。建立与zookeeper集群的连接

ZooKeeper zk = new ZooKeeper("192.168.153.123:2181", 30000,

new Watcher() {

// 事件的回调方法 (事件触发之后,客户端接收事件并处理)

public void process(WatchedEvent event) {

System.out.println("事件发生的路径:" + event.getPath());

System.out.println("事件类型:" + event.getType());

System.out.println("通知状态:" + event.getState());

}

});

// 创建一个目录节点

zk.create("/testRootPath", "rootData".getBytes(), Ids.OPEN_ACL_UNSAFE,

CreateMode.PERSISTENT);

// 创建一个子目录节点

zk.create("/testRootPath/testChildPathOne", "childOneData".getBytes(),

Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);

// 获取节点下保存的数据

System.out

.println(new String(zk.getData("/testRootPath", false, null)));

// 获取指定节点下子目录节点列表

System.out.println(zk.getChildren("/testRootPath", true));// true表示监听子节点创建、删除事件,及当前节点的删除事件

// 修改节点关联数据

zk.setData("/testRootPath/testChildPathOne",

"modifyChildOneData".getBytes(), -1);

// 判断节点是否存在,存在则返回节点的状态信息

System.out.println("节点状态:[" + zk.exists("/testRootPath", true) + "]");// true表示监听节点创建、删除、数据更新事件

// 创建另一个子目录节点

zk.create("/testRootPath/testChildPathTwo", "childTwoData".getBytes(),

Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);

//获取子目录节点下保存的数据

System.out.println(new String(zk.getData("/testRootPath/testChildPathTwo", true, null)));//true表示监听删除、数据更新事件

//删除子目录节点

zk.delete("/testRootPath/testChildPathOne", -1);

zk.delete("/testRootPath/testChildPathTwo", -1);

//删除父目录节点

zk.delete("/testRootPath", -1);

// 关闭连接

zk.close();

}

}

运行结果:

总结:

linux命令:

查找命令:

grep linux中的一个搜索工具。可以用在查看内存进程,还可以用来查找文件中的匹配内容

例: cat a.txt grep ^H

find linux中最常用的命令,在linux文件目录中查找内容

locate 相当于 find -name 。把linux本地文件目录全部存储到一个本地数据库中,是通过数据库查找

建议:每次locate前,先updatedb

whereis 查找linux中的程序。程序包含:二进制程序,文档,源文件

whereis -b /bin/sh

which 去PATH环境变量中去匹配查找

例:which java //去$PATH环境变量中去找有没有java命令

crontab配置: linux中自带的定时器

语法: 分 时 日 月 周 命令

0,30 1-3 * * * 重启tocat

service crontab start //启动

Shell编程:

变量的定义: 变量名=值

变量的使用: echo $变量名

流程控制语法: if语句、 for语句、while语句、case语句

for语法: for 变量 in 常量1 常量2 ……

do

$变量

done

for((i=0;i<=10;i++))

case语法:

case 变量 in

常量值1)

程序代码

;;

*) //相当于default

程序代码

;;

esac

运算符的操作:

对变量+1 : count=1 ((count++)) let count++

对数值进行计算: $((2+2)) $[2+2]

关系运算符: -gt -lt -le -ge

逻辑运算符: -a (and) -o(or)

函数:

1、函数书写在调用之前

2、函数中可以有返回值,使用return关键字

接收返回值使用: $?

3、函数中接收参数的传递: ${n} //n表示的是一个数字

例:

#!/bin/bash

print()

{

echo ${1}

}

##调用函数

print 100 ##100作为调用函数时的参数传递

print $1 ##接收shell在执行时传递的参数,接收到值后,再把值传递给print方法

例: ./hello.sh 100

Zookeeper:

安装前的准备:

1、jdk的安装

2、同步服务器的时间

3、关闭防火墙

4、建议配置ip和主机名的映射(方便)

5、配置免密登录

安装zk:

1、解压zk到指定的目录中

2、修改zk的配置文件: a,拷贝一份配置文件;b,修改dataDir; c,配置集群列表

3、把zk分发到各个节点服务器

4、配置各个节点服务器的myid

5、启动zk集群 命令: 目录/bin/zkServer.sh start

客户端shello连接zk: 目录/bin/zkCli.sh -ip/主机名 start

客户端操作zk:

创建节点:create

读取节点:ls ls2 get

更新节点:set

删除节点:delete (只能删除没有子节点的节点) rmr(当前节点和子节点全部删除)

增加限制:setquota -n | -b 值 /znode节点路径

删除限制:delquota /znode节点路径

使用javaAPI操作zk集群:

Zookeeper zk = new Zookeeper(“多个节点的服务器地址:2181 [中间使用逗号] ” , 会话超时时间, new Watcher(){……});

zk.create()

zk.delete()

zk.set()

zk.getData()

腾讯云618
未分类
云惠网小编
SpringCloud -- Config、Bus解析

SpringCloud — Config、Bus解析

1、Config1.1、概述简介1. 分布式面临的问题微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大量的服务。由于每个服务都需要必要...
Java数据结构-了解复杂度

Java数据结构-了解复杂度

2.实例分析与计算  四.写在最后  // 计算斐波那契递归fibonacci的时间复杂度 int fibonacci(int N) { return N < 2 ? N : fibonacci...
[深度解剖C语言] --关键字 static

[深度解剖C语言] –关键字 static

static ---最名不副实的关键字目录1.static修饰全局变量2.static修饰函数3.static修饰局部变量static的作用:1.static修饰全局变量我们创建两...
Java数据结构-认识顺序表

Java数据结构-认识顺序表

目录二.顺序表1.概念及结构2.顺序表的实现打印顺序表获取顺序表的有效长度在pos位置新增元素判断是否包含某个元素查找某个元素对应的位置获取/查找pos位置的元素给pos位置的元素...
腾讯云618

发表评论