ZooKeeper第二天

2020-11-20  本文已影响0人  Curtain_call

2. Zookeeper 基础

2.1.部署

先把 ZK 安装起来,后面的很多操作,都是的前提都是由 ZK 的操作环境,先来把 ZK 安装好。

2.1.1. Zookeeper windows 环境安装

环境要求:必须要有 jdk 环境,我们使用的是jdk1.8。

1.安装 jdk

2.安装 Zookeeper. 在官网 http://zookeeper.apache.org/下载 zookeeper.我下载的是zookeeper-3.4.12 版本。

解压 zookeeper-3.4.12 至 D:\machine\zookeeper-3.4.12. 在 D:\machine 新建 data 及 log 目录。

3.ZooKeeper 的安装模式分为三种,分别为:单机模式(stand-alone)、集群模式和集群伪分布模式。ZooKeeper 单机模式的安装相对比较简单,如果第一次接触 ZooKeeper 的话,建议安装 ZooKeeper 单机模式或者集群伪分布模式。安装单击模式。 至 D:\machine\zookeeper-3.4.12\conf 复制 zoo_sample.cfg 并粘贴到当前目录下,命名 zoo.cfg。

2.1.2. Zookeeper 集群配置

1.安装 jdk 运行 jdk 环境,上传 jdk1.8 安装包;

2.安装 jdk1.8 环境变量:

vim /etc/profile

export JAVA_HOME=/usr/local/jdk1.8.0_181

export ZOOKEEPER_HOME=/usr/local/zookeeper

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

export PATH=$JAVA_HOME/bin:$ZOOKEEPER_HOME/bin:$PATH

刷新 profile 文件  source /etc/profile,最后关闭防火墙。

3.下载 zookeeper 安装包

wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.12/zookeeper-3.4.12.tar.gz

4.解压 Zookeeper 安装包:tar -zxvf zookeeper-3.4.10.tar.gz

5.修改 Zookeeper 文件夹名称,重命名: mv zookeeper-3.4.12 zookeeper

6. 修改 zoo_sample.cfg 文件:

cd /usr/local/zookeeper/conf

mv zoo_sample.cfg zoo.cfg

修改 conf: vi zoo.cfg 修改两处

(1) dataDir=/usr/local/zookeeper/data(注意同时在 zookeeper 创建 data 目录)

(2)最后面添加:

server.0=192.168.xxx.xxx:2888:3888

server.1=192.168.xxx.xxx:2888:3888

server.2=192.168.xxx.xxx:2888:3888

7.创建服务器标识

服务器标识配置:echo 0 > myid ;

创建文件夹: mkdir data ;

创建文件 myid 并填写内容为 0: vi ;

上传 jdk1.8 安装包 ;

myid (内容为服务器标识 : 0)。

8.复制 zookeeper

进行复制 zookeeper 目录到 node1 和 node2 ;

还有/etc/profile 文件 ;

把 node1、 node2 中的 myid 文件里的值修改为 1 和 2;

路径(vi /usr/local/zookeeper/data/myid)。

9 启动 zookeeper

启动 zookeeper:

路径: /usr/local/zookeeper/bin ;

执行: zkServer.sh start ;

(注意这里 3 台机器都要进行启动)

状态: zkServer.sh status(在三个节点上检验 zk 的 mode,一个 leader 和俩个 follower)。

远程复制文件,把当前ip的文件复制到其他的ip里面去:

scp -r /soft root@zook02:/

scp -r /soft root@zook03:/

2.1.3. 目录结构

bin               //存放系统脚本

conf             //存放配置文件

contrib zk   //附加功能支持

dist-maven maven     //仓库文件

docs zk        //文档

lib              //依赖的第三方库

recipes       //经典场景样例代码

src zk         //源码

其中 bin 和 conf 是非常重要的两个目录,平时也是经常使用的。

2.1.3.1. bin 目录

先看下 bin 目录:

其中,zkServer 为服务器,启动后默认端口为 2181,zkCli 为命令行客户端。

2.1.3.2. conf 目录

Conf 目录为配置文件存放的目录,zoo.cfg 为核心的配置文件,这里面的配置很多,这配置是运维的工作,目前没必要,也没办法全部掌握。

在这挑选几个讲解:

clientPort:参数无默认值,必须配置,用于配置当前服务器对外的服务端口,客户端必须使用这端口才能进行连接;

dataDir:用于存放内存数据库快照的文件夹,同时用于集群的 myid 文件也存在这个文件夹里(注意:一个配置文件只能包含一个 dataDir 字样,即使它被注释掉了);

dataLogDir:用于单独设置 transaction log 的目录,transaction log 分离可以避免和普通 log还有快照的竞争;

dataDir:新安装 zk 这文件夹里面是没有文件的,可以通过 snapCount 参数配置产生快照的时机;

以下配置集群中才会使用,后面再讨论。

tickTime:心跳时间,为了确保连接存在的,以毫秒为单位,最小超时时间为两个心跳时间 ;

initLimit:多少个心跳时间内,允许其他 server 连接并初始化数据,如果 ZooKeeper 管理的数据较大,则应相应增大这个值 ;

syncLimit:多少个 tickTime 内,允许 follower 同步,如果 follower 落后太多,则会被丢弃。

2.2.ZK 的特性

Zk 的特性会从会话、数据节点,版本,Watcher,ACL 权限控制,集群角色这些部分来了解,其中重点需要掌握的数据节点与 Watcher

2.2.1. 会话

客户端与服务端的一次会话连接,本质是 TCP 长连接,通过会话可以进行心跳检测和数据传输。

会话(session)是 zookepper 非常重要的概念,客户端和服务端之间的任何交互操作都与会话有关。

会话状态:

看下这图,Zk 客户端和服务端成功连接后,就创建了一次会话,ZK 会话在整个运行期间的生命周期中,会在不同的会话状态之间切换,这些状态包括:CONNECTING、CONNECTED、RECONNECTING、RECONNECTED、CLOSE 。

一旦客户端开始创建 Zookeeper 对象,那么客户端状态就会变成 CONNECTING 状态,同时客户端开始尝试连接服务端,连接成功后,客户端状态变为 CONNECTED,通常情况下,由于断网或其他原因,客户端与服务端之间会出现断开情况,一旦碰到这种情况,Zookeeper 客户端会自动进行重连服务;

同时客户端状态再次变成CONNCTING,直到重新连上服务端后,状态又变为 CONNECTED,在通常情况下,客户端的状态总是介于 CONNECTING和 CONNECTED 之间。但是,如果出现诸如会话超时、权限检查或是客户端主动退出程序等情况,客户端的状态就会直接变更为 CLOSE 状态。

2.2.2. ZK 数据模型

ZooKeeper 的视图结构和标准的 Unix 文件系统类似,其中每个节点称为“数据节点”或 ZNode, 每个 znode 可以存储数据,还可以挂载子节点,因此可以称之为“树”。

第二点需要注意的是,每一个 znode 都必须有值,如果没有值,节点是不能创建成功的。

 在 Zookeeper 中,znode 是一个跟 Unix 文件系统路径相似的节点,可以往这个节点存储或获取数据;

 通过客户端可对 znode 进行增删改查的操作,还可以注册 watcher 监控 znode 的变化。

2.2.3. Zookeeper 节点类型

节点类型非常重要,是后面项目实战的基础。

a、Znode 有两种类型:短暂(ephemeral)(create -e /app1/test1 “test1” 客户端断开连接 zk 删除 ephemeral 类型节点),持久(persistent) (create -s /app1/test2 “test2” 客户端断开连接 zk 不删除 persistent 类型节点)

b、Znode 有四种形式的目录节点(默认是 persistent )

PERSISTENT

PERSISTENT_SEQUENTIAL(持久序列/test0000000019 )

EPHEMERAL

EPHEMERAL_SEQUENTIAL

c、创建 znode 时设置顺序标识,znode 名称后会附加一个值,顺序号是一个单调递增的计数器,由父节点维护

d、在分布式系统中,顺序号可以被用于为所有的事件进行全局排序,这样客户端可以通过顺序号推断事件的顺序

2.2.4. Zookeeper 节点状态属性

2.2.5. ACL 保障数据的安全

ACL 机制,表示为 scheme:id:permissions,第一个字段表示采用哪一种机制,第二个 id 表示用户,permissions 表示相关权限(如只读,读写,管理等)。

zookeeper 提供了如下几种机制(scheme):

world: 它下面只有一个 id, 叫 anyone, world:anyone 代表任何人,zookeeper 中对所有人有权限的结点就是属于 world:anyone 的;

auth: 它不需要 id, 只要是通过 authentication 的 user 都有权限(zookeeper 支持通过 kerberos来进行 authencation, 也支持 username/password 形式的 authentication);

digest: 它对应的 id 为 username:BASE64(SHA1(password)),它需要先通过 username:password形式的 authentication ;

ip: 它对应的 id 为客户机的 IP 地址,设置的时候可以设置一个 ip 段,比如 ip:192.168.1.0/16, 表示匹配前 16 个 bit 的 IP 段;

现在看这可能懵懵懂懂,不过没有关系,等会在客户端操作的时候会有详细的操作。

2.3.命令行

2.3.1. 服务端常用命令

在准备好相应的配置之后,可以直接通过 zkServer.sh 这个脚本进行服务的相关操作。

启动 ZK 服务: sh bin/zkServer.sh start

查看 ZK 服务状态: sh bin/zkServer.sh status

停止 ZK 服务: sh bin/zkServer.sh stop

重启 ZK 服务: sh bin/zkServer.sh restart

2.3.2. 客户端常用命令

使 用 zkCli.sh -server 127.0.0.1:2181 连 接 到 ZooKeeper 服务 , 连接成功后,系统会输出 ZooKeeper 的相关环境以及配置信息。 命令行工具的一些简单操作如下:

 显示根目录下、文件: ls / 使用 ls 命令来查看当前 ZooKeeper 中所包含的内容

 显示根目录下、文件: ls2 / 查看当前节点数据并能看到更新次数等数据

 创建文件,并设置初始内容: create /zk "test" 创建一个新的 znode 节点“ zk ”以及与它关联的字符串 [-e] [-s] 【-e 零时节点】 【-s 顺序节点】

 获取文件内容:get /zk 确认 znode 是否包含我们所创建的字符串 [watch【] watch 监听】

 修改文件内容: set /zk "zkbak" 对 zk 所关联的字符串进行设置

 删除文件: delete /zk 将刚才创建的 znode 删除,如果存在子节点删除失败

 递归删除:rmr /zk 将刚才创建的 znode 删除,子节点同时删除

 退出客户端: quit

 帮助命令: help

2.3.3. ACL 命令常用命令

再回过头来看下 ACL 权限,Zookeeper 的 ACL(Access Control List),分为三个维度:scheme、id、permission;

通常表示为:scheme:id:permission ;

 schema:代表授权策略

 id:代表用户

 permission:代表权限

2.3.3.1. Scheme

world:默认方式,相当于全世界都能访问

auth:代表已经认证通过的用户(可以通过 addauth digest user:pwd 来添加授权用户)

digest:即用户名:密码这种方式认证,这也是业务系统中最常用的

ip:使用 Ip 地址认证

2.3.3.2. id

id 是验证模式,不同的 scheme,id 的值也不一样。

scheme 为 auth 时:username:password

scheme 为 digest 时:username:BASE64(SHA1(password))

scheme 为 ip 时:客户端的 ip 地址。

scheme 为 world 时:anyone。

2.3.3.3. Permission

CREATE、READ、WRITE、DELETE、ADMIN 也就是 增、删、改、查、管理权限,这5种权限简写为:crwda(即:每个单词的首字符缩写)。

CREATE(c):创建子节点的权限

DELETE(d):删除节点的权限

READ(r):读取节点数据的权限

WRITE(w):修改节点数据的权限

ADMIN(a):设置子节点权限的权限

2.3.3.4. ACL 命令

2.3.3.4.1. getAcl

获取指定节点的 ACL 信息;

create /testDir/testAcl deer  # 创建一个子节点

getAcl /testDir/testAcl  # 获取该节点的 acl 权限信息

2.3.3.4.2. setAcl

设置指定节点的 ACL 信息;

setAcl /testDir/testAcl world:anyone:crwa    # 设置该节点的 acl 权限

getAcl /testDir/testAcl     # 获取该节点的 acl 权限信息,成功后,该节点就少了 d 权限

create /testDir/testAcl/xyz xyz-data    # 创建子节点

delete /testDir/testAcl/xyz    # 由于没有 d 权限,所以提示无法删除

2.3.3.4.3. addauth

注册会话授权信息

2.3.3.4.3.1. Auth

addauth digest user1:123456    # 需要先添加一个用户

setAcl /testDir/testAcl auth:user1:123456:crwa    # 然后才可以拿着这个用户去设置权限

getAcl /testDir/testAcl    # 密码是以密文的形式存储的

create /testDir/testAcl/testa aaa

delete /testDir/testAcl/testa    # 由于没有 d 权限,所以提示无法删除

退出客户端后:

ls /testDir/testAcl    #没有权限无法访问

create /testDir/testAcl/testb bbb    #没有权限无法访问

addauth digest user1:123456    # 重新新增权限后可以访问了

2.3.3.4.3.2.Digest

auth 与 digest 的区别就是,前者使用明文密码进行登录,后者使用密文密码进行登录;

create /testDir/testDigest data

addauth digest user1:123456

setAcl /testDir/testDigest digest:user1:HYGa7IZRm2PUBFiFFu8xY2pPP/s=:crwa    # 使用 digest来设置权限

注意:这里如果使用明文,会导致该 znode 不可访问。

通过明文获得密文

shell>

java -Djava.ext.dirs=/soft/zookeeper-3.4.12/lib -cp /soft/zookeeper-3.4.12/zookeeper-3.4.12.jar org.apache.zookeeper.server.auth.DigestAuthenticationProvider xxxx(用户名):123456(设置的密码)

xxxx(用户名):123456(设置的密码)->xxxx:ACFm5rWnnKn9K9RN/Oc8qEYGYDs= 

2.3.3.4.4. acl 命令行 ip

create /testDir/testIp data

setAcl /testDir/testIp ip:192.168.30.10:cdrwa

getAcl /testDir/testIp

2.3.4. 常用四字命令

ZooKeeper 支持某些特定的四字命令字母与其的交互。用来获取 ZooKeeper 服务的当前状态及相关信息。可通过 telnet 或 nc 向 ZooKeeper 提交相应的命令 :

当然,前提是安装好了 nc:yum install nc ;

echo stat|nc 127.0.0.1 2181       #来查看哪个节点被选择作为 follower 或者 leader

使用 echo ruok|nc 127.0.0.1 2181    #测试是否启动了该 Server,若回复 imok 表示已经启动。

echo dump| nc 127.0.0.1 2181    #列出未经处理的会话和临时节点。

echo kill | nc 127.0.0.1 2181       #关掉 server

echo conf | nc 127.0.0.1 2181    #输出相关服务配置的详细信息。

echo cons | nc 127.0.0.1 2181    #列出所有连接到服务器的客户端的完全的连接 / 会话的详细信息

echo envi |nc 127.0.0.1 2181      #输出关于服务环境的详细信息(区别于 conf 命令)。

echo reqs | nc 127.0.0.1 2181     #列出未经处理的请求。

echo wchs | nc 127.0.0.1 2181     #列出服务器 watch 的详细信息。

echo wchc | nc 127.0.0.1 2181     #通过 session 列出服务器 watch 的详细信息,它的输出是一个与 watch 相关的会话的列表。

echo wchp | nc 127.0.0.1 2181     #通过路径列出服务器 watch 的详细信息。它输出一个与 session 相关的路径。

2.3.5. ZooKeeper 日志可视化

前面以及讲了两个非常重要的配置一个是 dataDir,存放的快照数据,一个是 dataLogDir,存放的是事务日志文件,用以下命令就可以查看日志。

日志文件:

java -cp

/soft/zookeeper-3.4.12/zookeeper-3.4.12.jar:/soft/zookeeper-3.4.12/lib/slf4j-api-1.7.25.jar

org.apache.zookeeper.server.LogFormatter log.xxxx

快照数据:

java -cp

/soft/zookeeper-3.4.12/zookeeper-3.4.12.jar:/soft/zookeeper-3.4.12/lib/slf4j-api-1.7.25.jar

org.apache.zookeeper.server.SnapshotFormatter log.xxxx

有时候也可能出现有日志文件没有快照数据,有快照数据没有日志文件的情况,这是因为snapCount:

它的默认值太大,我们只需要在zoo.cfg文件里面加入snapCount,设置一下值就可以了,设置完成之后需要重启zookeeper。

2.4.Java 客户端框架(*重要)

2.4.1. Zookeeper 原生客户端

导入依赖:<?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>enjoy</groupId>

<artifactId>zookeeperJavaApi</artifactId>

<version>1.0-SNAPSHOT</version>

<dependencies>

<dependency>

<groupId>junit</groupId>

<artifactId>junit</artifactId>

<version>4.12</version>

</dependency>

<dependency>

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

<artifactId>zookeeper</artifactId>

<version>3.4.12</version>

</dependency>

<dependency>

<groupId>com.101tec</groupId>

<artifactId>zkclient</artifactId>

<version>0.10</version>

</dependency>

<dependency>

<groupId>org.apache.curator</groupId>

<artifactId>curator-framework</artifactId>

<version>4.0.0</version>

</dependency>

<dependency>

<groupId>org.apache.curator</groupId>

<artifactId>curator-recipes</artifactId>

<version>4.0.0</version>

</dependency>

</dependencies>

<build>

<plugins>

<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-compiler-plugin</artifactId>

<configuration>

<source>1.8</source>

<target>1.8</target>

</configuration>

</plugin>

</plugins>

</build>

2.4.1.1. 创建会话

上一篇下一篇

猜你喜欢

热点阅读