学习zookeeper—基础

目录

1 zookeeper 数据模型基本操作

2 zoo.cfg 配置

3 zookeeper 基本数据模型

4 zookeeper 作用的体现

5 zookeeper 常用命令

6 Acl权限控制

7 zk四字命令

8 集群

 

1 zookeeper数据模型基本操作

进入zookeeper的bin目录下

zookeeper服务端:

启动zookeeper服务端 :./zkServer.sh start

重启zookeeper服务端:./zkServer.sh restart

查看zookeeper服务端状态:./zkServer.sh status

关闭zookeeper服务端:./zkServer.sh stop

zookeeper客户端:

启动zookeeper客户端:./zkCli.sh

退出zookeeper客户端:Ctrl + C

 

2 zoo.cfg配置

进入zookeeper的conf目录下,复制一份zoo_sample.cfg,命名为zoo.cfg并保存在该目录下。

打开zoo.cfg文件:

如图所示:

1、

 

 initLimit 和 syncLimit 的值分别为 10和5,指的是他们的值分别为 10倍的tickTime 和 5倍的tickTime。

 

2、

dataDir用于存储Snapshot数据

 

 

3 zookeeper基本数据模型

1、

 

 

 

 

 临时节点可以人为的创建、删除,当session失效后,临时节点的数据全都会丢失。

 

 

 4 Zookeeper作用的体现

1、

 

 

 

 

 

 

 当A获取到锁,其他服务器进入阻塞等待,直到A释放锁,B再获取锁.......

 当主节点(第一个)写入了数据(Data-XYZ),它会自动的将这些数据同步到从节点,客户端可以在主节点或者从节点中读取数据,这就是数据一致性的表现。

 

5 Zookeeper常用命令

1、

 

 

1)启动zk服务端和客户端;

2)ls path:进入path节点

 

3)ls -s path:进入path节点,并且输出状态信息,ls -s path 命令就相当于 ls path 命令加 stat path 命令

 

4)stat path:path节点下的状态信息

cZxid:当前节点创建后zookeeper分配给该节点的id;

ctime:当前节点创建的时间;

mZxid:当前节点修改后zookeeper分配给该节点的id;

mtime:当前节点的修改时间,当mtime等于ctime时,就说明该节点未被修改过;

pZxid:当前的子节点的id;

cversion:当前的子节点的更改次数;

dataVersion:当前节点的数据版本号,每当修改当前节点的数据时,dataVersion都会加1,也就是说dataVersion就是修改当前节点的次数;

aclVersion:当前节点的ACL进行更改的次数;

ephemeralOwner:如果当前节点是ephemeral类型节点,则这是znode所有者的 session ID。 如果znode不是ephemeral节点,则该字段设置为零;

dataLength:当前节点数据字段的长度。

numChildren:当前节点的子节点的数量。

 

5)get path:把path节点下的数据取出来

  这里为空,还没有创建设置节点

 

5.1 zk特性——session

 

 客户端向服务端的ping包请求是为了告诉服务端,客户端还活着,刷新session超时时间。

 

2、创建节点

创建节点的方式:

create [-s] [-e] [-c] [-t ttl] path [data] [acl]

 

-s: 顺序节点
-e: 临时节点
-c: 容器节点
-t: 可以给节点添加过期时间,默认禁用,需要通过系统参数启用

1)创建一个持久节点 create /programmer programmer-data

 

2)查看创建的节点的值 get /programmer

查看检点的值和状态信息 get -s /programmer

 

3)查看创建的节点的状态信息 stat /programmer

 

3)创建一个临时子节点 create -e /programmer/tem tem-data

4)查看临时节点的状态信息 stat /programmer/tem

如果节点的ephemeralOwner值类似于上图中ephemeralOwner的值,则说明该节点就是临时节点。

如果在超时时间内未收到临时节点的心跳信号,则会把该临时节点删除掉(不管是否已经把客户端连接给断开)。

 

5)创建顺序节点  create -s /programmer/items 

  也可以在创建顺序节点时,在后面加上数字,表示是第几个节点:create -s /programmer/items 1

 

6)创建顺序临时节点  create -s -e  /programmer/items 

7)创建容器节点 create -c /programmer/items 

  容器节点用来容纳子节点,若没有子节点,容器节点表现跟持久化节点一样,如果给容器节点创建子节点,后续又把子节点删除,那么容器节点也会被zookeeper删除,当然不是立即删除,而是在一个时间段内被删除

8)节点监听 get -w /programmer/items

  针对节点的监听(一次性),一旦时间触发,对应的注册立即被删除

9)修改节点的值  set /programmer new-data

 

** set使用的是乐观锁:假设并发修改值时,可以使用 set /programmer data 1(版本号)命令。

  **意思就是说:我修改值之前的版本号为1,修改成功后版本号变为2,如果并发修改值时,版本号就起作用了,有两人使用  set /programmer data 1 时,其中一个人先修改成功,版本号变为2,由于版本号变为2了,另外一个人修改数据写的版本号却是1,会报错修改失败。

 

10)删除节点 delete /programmer/tem

**delete也是使用乐观锁:假设并发删除时,可以使用 delete /programmer/tem 1(版本号)命令。

  **意思就是说:与修改同理,删除之前的版本号如果不是1,则删除失败。

 

5.2 zk特性——watcher

1、

 

 

2、命令使用:

 注意:新版本的watch不是使用 get path[watch] 来设置watcher监听(使用这个命令也也可以),是使用 get [-w] path来设置watcher。

 

如图,带有 [-w] 的都可以创建watcher监听:

 

事件类型一:

 

1)创建父节点时触发:

输入:

(1)创建监听

stat -w /stady

 

这里会显示节点不存在,但是不影响他创建watcher监听。

 

(2)创建该节点,触发创建节点事件

create /stady data

 

 

(3)如图所示,创建该节点后触发了 type 为 NodeCreated 事件,修改该目录的值后却不会再触发事件,因为watcher是一次性的,触发过一次后立即销毁。

 

 2)修改父节点时触发:

输入:

(1)创建监听(创建监听方式有多种,如上面所述,带有 [-w] 的命令都可以创建)

get -w /stady

 

 

(2)修改该节点,触发修改节点事件

set /stady data

 

 

(3)如图所示,修改该节点后触发了 type 为 NodeDataChanged 事件

 

3)删除事件这里就不再演示,方法一样。

 

事件类型二:

 

1)创建子节点时触发

输入:

(1)创建子节点事件

ls -w /stady

 

(2)创建子节点

create /stady/item

 

2)删除子节点时触发

输入:

(1)创建子节点事件

ls -w /stady

 

(2)删除子节点

delete /stady/item

 

 

3)创建和删除子节点触发的事件都是 NodeChildrenChanged ,修改子节点不会触发事件。

 

4)把子节点当作父节点来设置watcher监听(创建节点时触发)

输入:

(1)创建节点事件

stat -w /stady/item

 

 

(2)创建节点

create /stady/item

 

 如图所示,以这种方式创建子节点的watcher事件,可以触发增、删、改事件,并且输出的type不是都为 NodeChildrenChanged。

 

5)删除、修改方法一致,这里不再演示。

 

6 ACL 权限控制

1、

 

 

 

 

 

 

 命令行操作:

1)查看权限

getAcl /stady/item

 

 2)设置权限,只有删除和写入权限

setAcl /stady/item world:anyone:dw

 

 

3)如图所示,设置权限需要根据查看权限输出的 'world,'anyone 来设置的,并且可以看出他有cdrwa权限(创建、删除、读、写、设置权限);

给他设置了dw权限(删除,写)后,输入了读命令,输出了没有权限读取。

 

4)命令行使用,如图:

 

Auth模式

1)注册用户命令

addauth digest root:root

 

2)赋予权限

setAcl /stady/test auth:root:root:cdrwa

 

setAcl /stady/test auth::cdra

 

 

3)查看权限

 如图所示:root的密码是被加密过的,加密的方式是先使用SHA1后使用base64。

 

4)如果退出了客户端,用户也会退出登录,重启客户端后,如果要设置权限可以使用:

setAcl /stady/test digest:root:qiTlqPLK7XM2ht3HMn02qRpkKIE=

 

注意:这样子设置权限的话,需要输入密文的密码。除此之外,还不能get设置了相应权限的节点。

 

5)当我们退出用户后,我们可以重新登录,登录密令与注册密令一样:

addauth digest root:root

 

重新登录后,再设置权限就不需要像 8) 那样麻烦了。

 

ip模式

IP 模式表示有相同 IP 地址的任何用户,通过 IP 地址粒度来进行权限控制,例如配置了ip:192.168.0.110,即表示权限控制都是针对这个IP地址的。同时,IP 模式也支持按照网段的方式进行配置,例如ip:192.168.0.1/24表示针对192.168.0.*这个IP段进行权限控制。

1)创建节点:

 

2)设置ip权限

setAcl /stady/ip ip:192.168.179.129:cdwra

 

 

super模式

1、修改zkServer.sh,增加super管理员;

2、重启zkServer.sh。

1)复制zkServer.sh(各位小伙伴可以不复制,直接修改zkServer.sh,为了保险起见,建议复制一份出来修改)

cp zkServer.sh ./zkServer2.sh

 

 

2)进入zkServer2.sh

vim zkServer2.sh

 

 

3)输入命令,快速定位到nohup

/nohup

 

 

4)修改zkServer2.sh

 

5)启动zkServer2.sh 启动zkCli.sh 后,如图演示:

 如上图,使用了 get /stady/winip 命令,返回无权限,登录超级管理员用户后,再使用 get /stady/winip 命令,返回除了结果。

 

Digest模式和World模式,这里不在演示。

小结:

 

7 zk四字命令

 

 

1)退出zookeeper服务端和客户端,安装Ncat

yum install nc

 

 

stat 命令

stat 命令用于查看 zk 的状态信息

2)启动zookeeper服务端后,输入

echo stat | nc localhost 2181

 

 

3)如果报错:stat is not executed because it is not in the whitelist.

前往 zoo.cfg 文件里面添加:

#开启四字命令
4lw.commands.whitelist=*

 

 

4)重启服务端后,输入 2)命令

 

ruok 命令

ruok 命令用于查看当前 zkserver 是否启动,若返回 imok 表示正常。

5)输入

echo ruok | nc localhost 2181

 

结果

 

dump 命令

dump 命令用于列出未经处理的会话和临时节点。

6)输入

echo dump | nc localhost 2181

 

结果

 

conf 命令

conf 命令用于查看服务器配置。

7)输入

echo conf | nc localhost 2181

 

结果

 

cons 命令

cons 命令用于展示连接到服务器的客户端信息。

8)输入

echo cons | nc localhost 2181

 

结果

 

envi 命令

envi 命令用于查看环境变量。

9)输入

echo envi | nc localhost 2181

 

 

mntr 命令

mntr命令用于查看健康信息

10)输入

echo mntr | nc localhost 2181

 

 

wchs 命令

wchs 命令用于查看触发器信息

echo wchs | nc localhost 2181

 

 

还有 wchcwchp 命令,用于session与watch及path与watch信息。

 

8 zookeeper 集群

8.1 在同一台虚拟机搭建zookeeper集群

1)基本概念

 一个主节点 xx ,两个从节点 yy 和 zz ,当主节点 xx 宕机或者崩了,就出现选举一个从节点当作一个主节点,当 xx 修复好后,会回来充当从节点。

 

 

2)搭建

1、进入zookeeper的配置文件夹(conf)

2、编辑配置文件

vim zoo.cfg

 (为了方便,本人把apache-zookeeper-3.6.3-bin文件名改为了zookeeper01,把Dir路径也修改了一下,大家根据自己需求命名存放路径,如下图所示)

注意:要把环境变量也更改了,如果不更改,则每次启动zookeeper都要进入zookeeper的bin目录下使用 ./zkServer.sh start 等命令才能起作用。添加了环境变量,在哪个目录下直接使用 ./zkServer.sh start 等命令都能起作用。

 

添加:

 

 server.1-3为 主/从 zookeeper 的名称,ip地址(192.168.5.188)为虚拟机的ip地址,后面的端口号自定义。

 

3、进入dataDir 路径

 

这里的dataDir路径为 /usr/local/zookeeper/zookeeper01/conf/tmp/data 

进入后直接使用下面命令,来创建 myid

vim myid

 

 输入以上命令,会自动创建myid文件,并且进入该文件,在该文件里面添加一个 “1” 即可。

 

4、进入第四步,解压两份zookeeper文件到同级目录,分别命名为zookeeper02、zookeeper03

 

5、进入zookeeper02的zoo.cfg文件,修改端口号

 

 

然后进入zookeeper02的dataDir路径,创建myid文件

vim myid

 

进去后把 “1” 改为 “2”

 

6、重复 5 步骤,修改zookeeper03的zoo.cfg文件的端口号为2183,并且修改myid文件,把 “1”改为 “3”

 

7、配置完成后,启动这三个(zookeeper01 - zookeeper03)的服务端

//进入这三个zookeeper文件的bin目录分别输入:
./zkServer.sh start

 

8、启动server.1的客户端,并且添加节点

#启动server.1的客户端
./zkCli.sh -server localhost:2181

#添加节点
create /cluster data

 

 

9、关闭server.1的客户端,启动server.2的客户端

#使用 Ctrl + C 关闭server.1的客户端

#启动server.2的客户端
./zkCli.sh -server localhost:2182

 

启动成功后 输入:

ls /

 

就会发现在server.1中又创建的所有节点

 

10、同理,关闭server.2的客户端,打开server.3的客户端,也是能查看到server.1中的节点。

 

11、在server.1、server.2或在server.3创建节点,都能将创建的节点同步到其他的server中。

 

8.2 在不同虚拟机上搭建zookeeper集群

注意:配置文件中,ip地址不同,端口号可以相同

 

1、首先准备三台虚拟机

我这里使用了克隆两台虚拟机:

第一台:192.168.5.128

第二台:192.168.5.129

第三台:192.168.5.130

 

2、更改 zoo.cfg 文件:

说明:我这里的三台zookeeper的路径、命名都是一样的,使用的端口号也都是一致的。

第一台虚拟机:

myid文件为1

 

 第二台:

 myid文件为2

 

第三台:

 myid文件为3

 

3、启动服务端

打开这三台虚拟机,分别启动他们的服务端。

 

4、启动客户端

第一台虚拟机:

./zkCli.sh -server 192.168.5.128:2181

#创建节点
create /test T

 

可以不退出第一台的客户端。

 

第二台虚拟机:

./zkCli.sh -server 192.168.5.129:2181

#查看节点
ls /

#查看第一台创建的test节点
get /test

 

 

第三台虚拟机同样这么操作,都是可以显示出所有节点。

 

5、查看是否为主节点或是从节点

./zkServer.sh status

 

如下图所示,则为从节点

 

 6、测试宕机

1)直接关闭第一台虚拟机;

 

2)剩下两台虚拟机中的zookeeper会经过选举机制,最终选举其中一个zookeeper为主节点;

 

3)分别向这两台虚拟机输入:

./zkServer.sh status

 

 

4)其中一台就会打印出:

 说明这台虚拟机中的zookeeper当选上了主节点

 

5)从新开启第一台虚拟机,并启动zookeeper服务端,输入

./zkServer.sh status

 

结果:

这表明当主节点宕机后,从节点会选举出一个来当主节点。当主节点被修复后,会被列入从节点。

 

posted @ 2021-11-02 09:54  nicechen  阅读(255)  评论(0编辑  收藏  举报