栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

Zookeeper学习笔记(一)

Zookeeper学习笔记(一)

文章目录

一、简介

1. Zookeeper是什么2. Zookeeper的特性3. Zookeeper主要目录结构4. zoo.cfg文件配置5. Zookeeper数据模型

5.1 Zookeeper数据模型介绍5.2 Zookeeper数据模型基本操作

5.2.1 客户端连接与关闭5.2.2 查看znode结构 6. Zookeeper的使用场景 二、常用命令

1. 查看

1.1 查看该路径下的节点1.2 查看该节点的详细信息1.3 获取该节点的数据 2. 创建

2.1 创建2.2 创建临时节点2.3 创建顺序节点 3. 修改

3.1 修改3.2 指定版本号修改 4. 删除

4.1 删除4.2 指定版本号删除 三、Zookeeper的watcher机制

1. watcher的命令行操作

1.1 父节点 增删改操作 触发watcher1.2 子节点 增删改操作 触发watcher 2. watcher使用场景

2.1 统一资源配置 四、ACL(access control lists)权限控制

1. Zookeeper的ACL的构成

1.1 scheme分类 2. ACL使用场景 五、四字命令


一、简介 1. Zookeeper是什么

中间件,为分布式系统提供协调服务。

2. Zookeeper的特性

一致性:按照顺序分批入库原则性:事务要么成功,要么失败单一视图:客户端连接集群任一zk节点,数据都是一致的可靠性:每次对zk的操作状态都会保存在服务端实时性:客户端可以读到服务端的最新数据 3. Zookeeper主要目录结构

bin:主要的一些运行命令conf:存放配置文件docs:文档,一些htmllib:依赖的jar包 4. zoo.cfg文件配置

tickTime:用于计算的时间单元(单位:ms)。比如session超时时间:N * tickTime,zookeeper里所有的时间都以它为倍数来就行计算initLimit:用于集群,允许“从节点”连接并同步到“master节点”的初始化连接时间,以tickTime的倍数来表示syncLimit:用于集群,“master节点”与“从节点”之间发送消息,请求和应答的时间长度(心跳机制)dataDir:数据存储的位置(必须配置)dataLogDir:日志目录,如果没有,则会使用dataDir目录clientPort:服务的端口,默认2181 5. Zookeeper数据模型 5.1 Zookeeper数据模型介绍

是一个树形结构,可理解为Linux/Unix的文件目录每一个节点称为znode,它可以有子节点,也可以有数据每一个节点分为临时节点和永久节点,临时节点在客户端断开后消失每一个zk节点各自的版本号,可以通过命令来显示节点信息每当节点数据发生变化,那么该节点的版本号就会累加(乐观锁)删除/修改过时节点,版本号不匹配则会报错每个zk节点存储的数据不宜过大,几k即可节点可以设置权限acl,可以通过权限来限制用户的访问 5.2 Zookeeper数据模型基本操作 5.2.1 客户端连接与关闭

连接:启动zkCli关闭:Ctrl + C 5.2.2 查看znode结构

ls /

6. Zookeeper的使用场景

master节点选举

主节点挂了以后,从节点就会接手工作,并且保证这个节点是唯一的,这也就是“首脑模式”,从而保证集群的高可用

统一配置文件管理

只需要部署一台服务器,就可以把相同的配置文件同步更新到其他所有服务器。这在云计算中使用很多

6.3 发布与订阅

类似消息队列MQ,dubbo发布者会把数据存在znode上,订阅者会读取这数据

提供分布式锁

分布式的环境中不同进程之间相互争夺资源,类似于多线程中的锁

6.5 集群管理

在集群中保证数据的强一致

二、常用命令

首先通过zkCli(zookeeper的bin目录下,Windows是.cmd,Linux是.sh)打开客户端命令行后台。

[zk: localhost:2181(CONNECTED) 0] help
ZooKeeper -server host:port -client-configuration properties-file cmd args
        addWatch [-m mode] path # optional mode is one of [PERSISTENT, PERSISTENT_RECURSIVE] - default is PERSISTENT_RECURSIVE
        addauth scheme auth
        close 
        config [-c] [-w] [-s]
        connect host:port
        create [-s] [-e] [-c] [-t ttl] path [data] [acl]
        delete [-v version] path
        deleteall path [-b batch size]
        delquota [-n|-b] path
        get [-s] [-w] path
        getAcl [-s] path
        getAllChildrenNumber path
        getEphemerals path
        history 
        listquota path
        ls [-s] [-w] [-R] path
        printwatches on|off
        quit 
        reconfig [-s] [-v version] [[-file path] | [-members serverID=host:port1:port2;port3[,...]*]] | [-add serverId=host:port1:port2;port3[,...]]* [-remove serverId[,...]*]
        redo cmdno
        removewatches path [-c|-d|-a] [-l]
        set [-s] [-v version] path data
        setAcl [-s] [-v version] [-R] path acl
        setquota -n|-b val path
        stat [-w] path
        sync path
        version
1. 查看 1.1 查看该路径下的节点
ls [路径]
[zk: localhost:2181(CONNECTED) 8] ls /
[zookeeper]
1.2 查看该节点的详细信息
stat [路径]
[zk: localhost:2181(CONNECTED) 0] stat /
cZxid = 0x0
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x0
mtime = Thu Jan 01 08:00:00 CST 1970
pZxid = 0x0
cversion = -1
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 1

cZxid:节点创建时,zookeeper为其分配的idctime:节点创建的时间mZxid:修改后zookeeper为其分配的idmtime:节点的修改时间pZxid:子节点的idcversion:子节点的versiondataversion:当前节点数据的版本号aclVersion:权限的版本ephemeralOwner:session的id,如果是0x0 就是一个永久节点,否则为临时节点dataLength:数据长度numChildren:子节点个数 1.3 获取该节点的数据

get [路径]
[zk: localhost:2181(CONNECTED) 6] get /zookeeper/config 

因为是空,所以没数据。

2. 创建 2.1 创建
[zk: localhost:2181(CONNECTED) 0] create /test test-data
Created /test
[zk: localhost:2181(CONNECTED) 1] ls /test
[]
[zk: localhost:2181(CONNECTED) 2] get /test
test-data
2.2 创建临时节点
[zk: localhost:2181(CONNECTED) 3] create -e /test/tmp test-data
Created /test/tmp
[zk: localhost:2181(CONNECTED) 4] get /test/tmp
test-data

session超时与心跳机制

2.3 创建顺序节点
[zk: localhost:2181(CONNECTED) 2] create -s /test/sec seq-data
Created /test/sec0000000004
[zk: localhost:2181(CONNECTED) 3] create -s /test/sec seq-data
Created /test/sec0000000005
[zk: localhost:2181(CONNECTED) 4] create -s /test/sec seq-data
Created /test/sec0000000006
3. 修改 3.1 修改
[zk: localhost:2181(CONNECTED) 22] set /test 12345
[zk: localhost:2181(CONNECTED) 23] get /test
12345
3.2 指定版本号修改
[zk: localhost:2181(CONNECTED) 21] set /test test-data12 -v 1

只能指定最新的版本号

4. 删除 4.1 删除
[zk: localhost:2181(CONNECTED) 33] delete /test/sec0000000004
4.2 指定版本号删除
[zk: localhost:2181(CONNECTED) 32] delete -v 0 /test/sec0000000003

只能指定最新的版本号

三、Zookeeper的watcher机制

针对每个节点的操作,都会有一个监督者,那就是watcher。
当监控的某个znode节点发生变化,则会触发watcher事件。
zookeeper中的watcher是一次性的,触发后立即销毁。

1. watcher的命令行操作 1.1 父节点 增删改操作 触发watcher

stat 和 get 命令都可以创建父节点的watcher

创建父节点,触发:NodeCreated

[zk: localhost:2181(CONNECTED) 10] stat -w /test
Node does not exist: /test
[zk: localhost:2181(CONNECTED) 11] create /test test-data

WATCHER::

WatchedEvent state:SyncConnected type:NodeCreated path:/test
Created /test

修改父节点数据,触发:NodeDataChanged

[zk: localhost:2181(CONNECTED) 24] create /test test-data
Created /test
[zk: localhost:2181(CONNECTED) 25] stat -w /test 
cZxid = 0x55
ctime = Fri Jan 14 15:12:57 CST 2022
mZxid = 0x55
mtime = Fri Jan 14 15:12:57 CST 2022
pZxid = 0x55
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 9
numChildren = 0
[zk: localhost:2181(CONNECTED) 26] set /test change-data

WATCHER::

WatchedEvent state:SyncConnected type:NodeDataChanged path:/test

删除父节点,触发:NodeDeleted

[zk: localhost:2181(CONNECTED) 55] create /test test-data
Created /test
[zk: localhost:2181(CONNECTED) 56] get -w /test
test-data
[zk: localhost:2181(CONNECTED) 57] delete /test

WATCHER::

WatchedEvent state:SyncConnected type:NodeDeleted path:/test
1.2 子节点 增删改操作 触发watcher

ls为父节点设置watcher,创建子节点触发:NodeChildrenChanged

[zk: localhost:2181(CONNECTED) 34] ls -w /test
[]
[zk: localhost:2181(CONNECTED) 35] create /test/testChildren children-data

WATCHER::

WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/test
Created /test/testChildren

ls为父节点设置watcher,删除子节点触发:NodeChildrenChanged

[zk: localhost:2181(CONNECTED) 36] ls -w /test
[testChildren]
[zk: localhost:2181(CONNECTED) 37] delete /test/testChildren 

WATCHER::

WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/test

ls为父节点设置watcher,修改子节点不触发事件

[zk: localhost:2181(CONNECTED) 40] ls -w /test
[testChildren]
[zk: localhost:2181(CONNECTED) 41] set /test/testChildren change-data
2. watcher使用场景 2.1 统一资源配置

举个栗子:

假设一个zk集群由三台机器构成,每个集群节点都是一致的。主机更新了配置信息以后,会通知到zk节点,并为它设置watcher事件,然后将该节点的数据修改为新的配置信息,触发watcher,客户端会收到一个NodeDataChanged事件来更新客户端的配置。
设置一个watcher事件后zk集群的每一个主机都会有一个watcher事件,当主机更新一个节点后,其他主机的节点数据也会被改变,各自也会触发自己的watcher事件去更新客户端。

四、ACL(access control lists)权限控制

针对节点可以设置相关读写等权限,目的是为了保障数据的安全性
权限permission可以指定不同权限范围以及角色

getAcl:获取某个节点的acl权限信息。setAcl:设置每个节点的acl权限信息。addauth:注册一个用户,把用户名密码输入到系统里进行注册。注册(或登录)时输入明文密码,但是在zk的系统里,密码是以加密形式存在的。 1. Zookeeper的ACL的构成

zk的acl通过[scheme : id : permissions]来构成权限列表

scheme:代表采用的某种权限机制id:代表允许访问的用户permissions:权限组合字符串

权限字符串缩写–crdwa。

CREATE:创建子节点READ:获取节点/子节点WRITE:设置节点数据DELETE:删除子节点ADMIN:设置权限 1.1 scheme分类

scheme和id其实是捆绑使用的,针对不同的scheme使用不同的id。

world:world下只有一个id,也就是只有一个用户,那就是anyone,任何人都可以访问,组合写法就是 world:anyone:[permissions]

 

auth:代表认证登录,需要注册用户有权限就可以,形式为 auth:user:password:[permissions]

digest:需要对密码加密才能访问,组合形式为 digest:username:base64(SHA1(password)):[permissions]

auth和digest的区别就是,一个是明文密码,一个是密文密码。而在真实的开发环境中,更多还是使用加密的方式。

[zk: localhost:2181(CONNECTED) 4] create /test test-data
Created /test
[zk: localhost:2181(CONNECTED) 5] getAcl /test
'world,'anyone
: cdrwa
[zk: localhost:2181(CONNECTED) 6] addauth digest demo_user:demo_password
[zk: localhost:2181(CONNECTED) 7] setAcl /test auth:demo_user:demo_password:cdrwa
[zk: localhost:2181(CONNECTED) 8] getAcl /test
'digest,'demo_user:m+N7RKYXjF5f+O8Ak/o9DDuWZ7A=
: cdrwa

断开连接后重连

[zk: localhost:2181(CONNECTED) 0] get /test
Insufficient permission : /test
[zk: localhost:2181(CONNECTED) 1] getAcl
getAcl [-s] path
[zk: localhost:2181(CONNECTED) 2] getAcl /test
Insufficient permission : /test
[zk: localhost:2181(CONNECTED) 3] addauth digest demo_user:demo_password 
[zk: localhost:2181(CONNECTED) 4] get /test
test-data

ip:当设置为ip指定的ip地址,此时限制ip进行访问,比如:ip:192.168.1.1:[permissions]

[zk: localhost:2181(CONNECTED) 0] ls /
[test_ip, zookeeper]
[zk: localhost:2181(CONNECTED) 1] getAcl /test_ip
'world,'anyone
: cdrwa
[zk: localhost:2181(CONNECTED) 2] setAcl /test_ip ip:101.33.XXX.XXX:cdrwa 
[zk: localhost:2181(CONNECTED) 3] getAcl /test_ip
Insufficient permission : /test_ip

super:超级管理员,拥有所有权限

如何创建一个超级管理员?

    修改zkServer.sh 增加super管理员

增加这一行,密码是加密后的密文密码。

    重启zkServer.sh
2. ACL使用场景

开发/测试环境分离生产环境上控制指定IP的服务可以访问相关节点,防止混乱 五、四字命令

zk可以通过他自身提供的简写命令来与服务器交互

需要用到nc命令

yum install nc

用法:

echo [command] nc [ip] [port]

官网:https://zookeeper.apache.org/doc/r3.7.0/zookeeperAdmin.html#sc_4lw

测试一下

[root@VM-8-4-centos bin]# echo stat | nc 10.0.8.4 2181
stat is not executed because it is not in the whitelist.

查了一下原因是因为要在zoo.cfg里添加配置放行指令

然后重启一下,再次尝试就成功了

[root@VM-8-4-centos bin]# echo stat | nc 10.0.8.4 2181
Zookeeper version: 3.6.3--6401e4ad2087061bc6b9f80dec2d69f2e3c8660a, built on 04/08/2021 16:35 GMT
Clients:
 /127.0.0.1:53736[1](queued=0,recved=1,sent=1)
 /10.0.8.4:36962[0](queued=0,recved=1,sent=0)

Latency min/avg/max: 0/0.0/0
Received: 2
Sent: 1
Connections: 2
Outstanding: 0
Zxid: 0xa4
Mode: standalone
Node count: 6

其他操作参见官网。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/711663.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号