认认真真学习zookeeper(一)
本文内容包括:zookeeper的简介、数据模型、单机安装过程、常用Shell命令、ACL权限控制以及JavaAPI调用
文章目录
- 1. zookeeper简介
- 1.1 什么是zookeeper
- 1.2 zookeeper应用场景
- 1.3 zookeeper的设计目标
- 2. zookeeper的数据模型
- 3. zookeeper单机安装
- 4. zookeeper常用Shell命令
- 4.1 新增节点
- 4.2 更新节点
- 4.3 删除节点
- 4.4 查看节点
- 4.5 查看节点状态
- 4.6 查看节点列表
- 4.7 监听器get path [watch]
- 4.8 监听器stat path [watch]
- 4.9 监听器ls\ls2 path [watch]
- 5. zookeeper的acl权限控制
- 5.1 概述
- 5.2 权限模式
- 5.3 授权的对象
- 5.4 授予的权限
- 5.5 授权的相关命令
- 5.6 案例
- 5.7 acl 超级管理员
- 6. zookeeper javaAPI
- 6.1 连接到ZooKeeper
- 6.2 新增节点
- 6.3 更新节点
- 6.4 删除节点
- 6.5 查看节点
- 6.6 查看子节点
- 6.7 检查节点是否存在
1. zookeeper简介
1.1 什么是zookeeper
zookeeper官网:https://zookeeper.apache.org/
ZooKeeper由雅虎研究院开发,是Google Chubby的开源实现,后来托管到Apache,于2010年11月正式成为Apache的顶级项目。
大数据生态系统里的很多组件的命名都是某种动物或者昆虫,比如hadoop就是🐘,hive就是🐝。zookeeper即动物园管理者,顾名思义就是管理大数据生态系统各组件的管理员,如下图所示:
1.2 zookeeper应用场景
zookeeper是一个经典的分布式数据一致性解决方案,致力于为分布式应用提供一个高性能、高可用,且具有严格顺序访问控制能力的分布式协调存储服务。
- 维护配置信息
- 分布式锁服务
- 集群管理
- 生成分布式唯一ID
1.维护配置信息
java编程经常会遇到配置项,比如数据库的url、schema、user和passwords等。通常这些配置项我们会放置在配置文件中,再将配置文件放置在服务器上当需要更改配置项时,需要去服务器上修改对应的配置文件。但是随着分布式系统的兴起,由于许多服务都需要使用到该配置文件,因此有必须保证该配置服务的高可用性(high availability)和各台服务器上配置数据的一致性。通第会将配置文件部署在一个集群上,然而一个集群动輒上千台服务器,此时如果再一台台服务器逐个修改配置文件那将是非常繁琐且危险的的操作,因此就需要一种服务,能够高效快速且可靠地完成配置项的更改等操作,并能够保证各配置项在每台服务器上的数据一致性。
zookeeper就可以提供这样一种服务,其使用Zab这种一致性协议来保证一致性。现在有很多开源项目使用zookeeper来维护配置,比如在hbase中,客户端就是连接一个zookeeper,获得必要的hbase集群的配置信息然后才可以进一步操作。还有在开源的消息队列kafka中,也使用zookeeper来维护brokers的信息。在 alibaba开源的soa框架dubbo中也广泛的使用zookeeper管理一些配置来实现服务治理。
2.分布式锁服务
一个集群是一个分布式系统,由多台服务器组成。为了提高并发度和可靠性,多台服务器上运行着同一种服务。当多个服务在运行时就需要协调各服务的进度,有时候需要保证当某个服务在进行某个操作时,其他的服务都不能进行该操作,即对该操作进行加锁,如果当前机器挂掉后,释放锁并fail over到其他的机器继续执行该服务。
3.集群管理
一个集群有时会因为各种软硬件故障或者网络故障,出现某些服务挂掉而被移除集群,而某些服务器加入到集群中的情况,zookeeper会将这些服务加入/移出的情况通知给集群中的其他正常工作的服务器,以及时调整存储和计算等任务的分配和执行等。此外zookeeper还会对故宣的服务器做出诊断并尝试修复。
4.生成分布式唯一ID
在过去的单库单表型系统中,通常可以使用数据库字段自带的auto_increment属性来自动为每条记录生成一个唯一的ID。但是分库分表后,就无法在依靠数据库的auto_increment属性来唯一标识一条记录了。此时我们就可以用zookeeper在分布式环境下生成全局唯一ID。做法如下:每次要生成一个新id时,创建一个持久顺序节点创建操作返回的节点序号,即为新id,然后把比自己节点小的删除即可
1.3 zookeeper的设计目标
zookeeper致力于为分布式应用提供一个高性能、高可用,且具有严格顺序访问控制能力的分布式协调服务
1.高性能
zookeeper将全量数据存储在内存中,并直接服务于客户端的所有非事务请求,尤其适用于以读为主的应用场景
2.高可用
zookeeper一般以集群的方式对外提供服务,一般3~5台机器就可以组成一个可用的zookeeper集群了,每台机器都会在内存中维护当前的服务器状态,并且每台机器之间都相互保持着通信。只要集群中超过一半的机器都能够正常工作,那么整个集群就能够正常对外服务
3.严格顺序访问
对于来自客户端的每个更新请求,ZooKeeper都会分配一个全局唯一的递增编号,这个编号反映了所有事务操作的先后顺序
2. zookeeper的数据模型
zookeeper的数据节点可以视为树状结构(或者目录),树中的各节点被称为znode(即zookeeper node),一个znodes可以有多个子节点。zookeeper节点在结构上表现为树状;使用路径path来定位某个znode,比如/ns-1/itcast/mysql/schema1/table1,此处ns-1、itcast、mysql、schema1、table1分别是根节点、2级节点、3級节点以及4级节点;其中ns-1是itcast的父节点,,itcast是ns-1的子节点。itcast是mysq的父节点,mysq是itcast的子节点,以此类推。
znode,兼具文件和目录两种特点。既像文件一样维护着数据、元信息、ACL、时间戳等数据结构,又像目录一样可以作为路径标识的一部分。
那么如何描述一个znode?一个znode大体上分为3个部分:
- 节点的数据:即znode data(节点path,节点data)的关系就像是java map中(key, value)的关系
- 节点的子节点children
- 节点的状态stat:用来描述当前节点的创建、修改记录,包括cZxid、ctime等
节点状态stat的属性
在zookeeper shell中使用get命令查看指定路径节点的data、stat信息:
[ zk : localhost:2181 (CONNECTED) 7 ] get /ns-1/tenantczxid = 0x6a0000000a
ctime = wed Mar 27 09:56:44 CST 2019
mZxid = 0x6a0000000a
mtime = Wed Mar 27 09:56:44 CST 2019
pZxid = 0x6a0000000e
cversion = 2
dataVersion = 0
aclversion = 0
ephemer alowner = 0x0
dataLength = 0
numChildren = 2
属性说明:
- cZxid:数据节点创建时的事务ID
- ctime:数据节点创建时的时间
- mZxid:数据节点最后一次更新时的事务ID
- mtime:数据节点最后一次更新时的时间
- pZxid:数据节点的子节点最后一次被修改的事务ID
- cversion:子节点的更改次数
- dataVersion:节点数据的更改次数
- aclVersion:节点的ACL的更改次数
- ephemer alowner:如果节点是临时节点,则表示创建该节点的会话的SessionID;如果节点是持久节点,则该属性为0
- dataLength:数据内容的长度
- numChildren:数据节点当前的子节点个数
节点类型
zookeeper中的节点有两种,分别为临时节点和永久节点。节点的类型在创建时即被确定,并且不能改受。 - 临时节点:该节点的生命周期依赖于创建它们的会话。一旦会话(Session)结束,临时节点将被自动删除,当然可以也可以手动删除。虽然每个临时的Znode都会绑走到一个客户端会话,但他们对所有的客户端还是可见的。另外,ZooKeeper的临时节点不允许拥有子节点。
- 持久化节点:该节点的生命周期不依赖于会话,并且只有在客户端显示执行删除操作的时候,他们才能被删除
3. zookeeper单机安装
当前测试环境centos7
jdk:jdk-8u251-linux-x64.tar.gz
zookeeper:zookeeper-3.4.9.tar.gz
- 卸载原有openjdk
rpm -qa | grep java
rpm -e --nodeps java-1.8.0-openjdk-headless-1.8.0.242.b08-1.el7.x86_64
rpm -e --nodeps python-javapackages-3.4.1-11.el7.noarch
rpm -e --nodeps java-1.8.0-openjdk-1.8.0.242.b08-1.el7.x86_64
rpm -e --nodeps javapackages-tools-3.4.1-11.el7.noarch
rpm -e --nodeps tzdata-java-2019c-1.el7.noarch
- zookeeper底层依赖于jdk,opt目录下先进行jdk的安装,jdk使用jdk-8u251-linux-x64.tar.gz版本,上传并解压jdk
tar -zxvf jdk-8u251-linux-x64.tar.gz
- 配置jdk环境变量
// 打开profile
vim /etc/profile// 文件中加入如下内容
JAVA_HOME=/opt/jdk1.8.0_251
export JAVA_HOMEPATH=$JAVA_HOME/bin:$PATH
export PATH// 使环境生效
source /etc/profile
- 检测jdk安装
// 敲如下命令,系统如图反馈说明安装成功
java -version
- zookeeper使用zookeeper-3.4.9.tar.gz,上传并解压
tar -zxvf zookeeper-3.4.9.tar.gz
- 为zookeeper准备配置文件
// 配置文件
cd /opt/zookeeper-3.4.9/conf/
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg //修改一下内容,此路径用于存储zookeeper中数据的内存快照、及事务日志文件
dataDir=/opt/zookeeper-3.4.9/data创建data文件夹
cd /opt/zookeeper-3.4.9/
mkdir data
- 启动zookeeper
// 进入zookeeper的bin目录
cd /opt/zookeeper-3.4.9/bin/
// 启动zookeeper
./zkServer.sh start// 启动:zkServer.sh start
// 停止:zkServer.sh stop
// 查看状态:zkServer.sh status
4. zookeeper常用Shell命令
4.1 新增节点
create [-s] [-e] path data # 其中-s 为有序节点,-e 临时节点
创建持久化节点并写入数据:
create /hadoop "123456"
创建持久化有序节点,此时创建的节点名为指定节点名 + 自增序号
[zk: localhost:2181(CONNECTED) 0] create -s /a "aaa"
Created /a0000000000
[zk: localhost:2181(CONNECTED) 1] create -s /b "bbb"
Created /b0000000001
[zk: localhost:2181(CONNECTED) 2] create -s /c "ccc"
Created /c0000000002
创建临时节点,临时会在会话过期后被删除:
[zk: localhost:2181(CONNECTED) 3] create -e /tmp "tmp"
Created /tmp
创建临时有序节点,临时会在会话过期后被删除:
[zk: localhost:2181(CONNECTED) 4] create -s -e /aa 'aaa'
Created /aa0000000004
[zk: localhost:2181(CONNECTED) 5] create -s -e /bb 'bbb'
Created /bb0000000005
[zk: localhost:2181(CONNECTED) 6] create -s -e /cc 'ccc'
Created /cc0000000006
4.2 更新节点
更新节点的命令是 set
,可以直接进行修改,如下:
[zk: localhost:2181(CONNECTED) 9] set /hadoop "345"
cZxid = 0xa
ctime = Tue Jun 02 09:53:13 CST 2020
mZxid = 0xb
mtime = Tue Jun 02 09:53:20 CST 2020
pZxid = 0xa
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 0
也可以基于版本号进行修改,此时类似于乐观锁机制,当你传入的数据版本号(dataVersion)和当前节点的数据版本号不符合时,zookeeper会拒绝本次修改:
[zk: localhost:2181(CONNECTED) 12] set /hadoop "159" 2
version No is not valid : /hadoop
4.3 删除节点
删除节点的语法如下:
delete path [version]
和更新节点数据一样,也可以传入版本号,当你传入的数据版本号(dataVersion)和当前节点的数据版本号不符合时,zookeeper会拒绝本次删除操作:
[zk: localhost:2181(CONNECTED) 13] delete /hadoop 0
version No is not valid : /hadoop
[zk: localhost:2181(CONNECTED) 14] delete /hadoop 1
[zk: localhost:2181(CONNECTED) 15]
要想删除某个节点及其所有后代节点,可以使用递归删除,命令为 rmr path
。
4.4 查看节点
[zk: localhost:2181(CONNECTED) 17] get /hadoop
123456
cZxid = 0x11
ctime = Tue Jun 02 09:59:49 CST 2020
mZxid = 0x11
mtime = Tue Jun 02 09:59:49 CST 2020
pZxid = 0x11
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 6
numChildren = 0
节点各个属性如下表。其中一个重要的概念是 Zxid(ZooKeeper Transaction
Id),ZooKeeper 节点的每一次更改都具有唯一的 Zxid,如果 Zxid1 小于 Zxid2,则
Zxid1 的更改发生在 Zxid2 更改之前。
状态属性 | 说明 |
---|---|
cZxid | 数据节点创建时的事务 ID |
ctime | 数据节点创建时的时间 |
mZxid | 数据节点最后一次更新时的事务 ID |
mtime | 数据节点最后一次更新时的时间 |
pZxid | 数据节点的子节点最后一次被修改时的事务 ID |
cversion | 子节点的更改次数 |
dataVersion | 节点数据的更改次数 |
aclVersion | 节点的 ACL 的更改次数 |
ephemeralOwner | 如果节点是临时节点,则表示创建该节点的会话的SessionID;如果节点是持久节点,则该属性值为 0 |
dataLength | 数据内容的长度 |
numChildren | 数据节点当前的子节点个数 |
4.5 查看节点状态
可以使用 stat
命令查看节点状态,它的返回值和 get
命令类似,但不会返回节点数据
[zk: localhost:2181(CONNECTED) 9] stat /hadoop
cZxid = 0x18
ctime = Tue Jun 02 10:43:30 CST 2020
mZxid = 0x18
mtime = Tue Jun 02 10:43:30 CST 2020
pZxid = 0x18
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 6
numChildren = 0
4.6 查看节点列表
查看节点列表有 ls path
和 ls2 path
两个命令,后者是前者的增强,不仅可以查看指定路径下的所有节点,还可以查看当前节点的信息
[zk: localhost:2181(CONNECTED) 13] ls /hadoop
[node2, node1]
[zk: localhost:2181(CONNECTED) 14] ls2 /hadoop
[node2, node1]
cZxid = 0x18
ctime = Tue Jun 02 10:43:30 CST 2020
mZxid = 0x18
mtime = Tue Jun 02 10:43:30 CST 2020
pZxid = 0x1a
cversion = 2
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 6
numChildren = 2
4.7 监听器get path [watch]
使用 get path [watch]
注册的监听器能够在节点内容发生改变的时候,向客户端发出通知。需要注意的是 zookeeper 的触发器是一次性的 (One-time trigger),即触发一次后就会立即失效。
[zk: localhost:2181(CONNECTED) 16] get /hadoop watch
[zk: localhost:2181(CONNECTED) 17] set /hadoop "456"
WATCHER::
WatchedEvent state:SyncConnected type:NodeDataChanged path:/hadoop
4.8 监听器stat path [watch]
使用 stat path [watch]
注册的监听器能够在节点状态发生改变的时候,向客户端发出通知
[zk: localhost:2181(CONNECTED) 18] stat /hadoop watch
[zk: localhost:2181(CONNECTED) 19] set /hadoop 1122
WATCHER::cZxid = 0x18
WatchedEvent state:SyncConnected type:NodeDataChanged path:/hadoop
4.9 监听器ls\ls2 path [watch]
使用 ls path [watch]
或 ls2 path [watch]
注册的监听器能够监听该节点下所有子节点的增加和删除操作。
[zk: localhost:2181(CONNECTED) 20] ls /hadoop watch
[node2, node1]
[zk: localhost:2181(CONNECTED) 21] create /hadoop/yran "aaa"
WATCHER::Created /hadoop/yran
WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/hadoop
5. zookeeper的acl权限控制
5.1 概述
zookeeper 类似文件系统,client 可以创建节点、更新节点、删除节点,那么如何做到节点的权限的控制呢?zookeeper的access control list 访问控制列表可以做到这一点。
acl 权限控制,使用scheme:id:permission 来标识,主要涵盖 3 个方面:
- 权限模式(scheme):授权的策略
- 授权对象(id):授权的对象
- 权限(permission):授予的权限
其特性如下:
- zooKeeper的权限控制是基于每个znode节点的,需要对每个节点设置权限
- 每个znode支持设置多种权限控制方案和多个权限
- 子节点不会继承父节点的权限,客户端无权访问某节点,但可能可以访问它的子节点
例如:
// 将节点权限设置为IP:192.168.188.133的客户端可以对节点进行增删改查管理权限
[zk: localhost:2181(CONNECTED) 28] setAcl /test2 ip:192.168.188.133:crwda
5.2 权限模式
采用何种方式授权
方案 | 描述 |
---|---|
world | 只有一个用户:anyone,代表登录zokeeper所有人(默认) |
ip | 对客户端使用IP地址认证 |
auth | 使用已添加认证的用户认证 |
digest | 使用“用户名:密码”方式认证 |
5.3 授权的对象
给谁授予权限
授权对象ID是指,权限赋予的实体,例如:IP 地址或用户。
5.4 授予的权限
授予什么权限
create、delete、read、writer、admin也就是 增、删、改、查、管理权限,这5种权限简写为cdrwa,注意:这5种权限中,delete是指对子节点的删除权限,其它4种权限指对自身节点的操作权限
权限 | ACL简写 | 描述 |
---|---|---|
create | c | 可以创建子节点 |
delete | d | 可以删除子节点(仅下一级节点) |
read | r | 可以读取节点数据及显示子节点列表 |
write | w | 可以设置节点数据 |
admin | a | 可以设置节点访问控制列表权限 |
5.5 授权的相关命令
命令 | 使用方式 | 描述 |
---|---|---|
getAcl | getAcl | 读取ACL权限 |
setAcl | setAcl | 设置ACL权限 |
addauth | addauth | 添加认证用户 |
5.6 案例
- world授权模式:
命令
setAcl <path> world:anyone:<acl>
案例
[zk: localhost:2181(CONNECTED) 1] create /node1 "node1"
Created /node1[zk: localhost:2181(CONNECTED) 2] getAcl /node1
'world,'anyone
: cdrwa[zk: localhost:2181(CONNECTED) 3] setAcl /node1 world:anyone:cdrwa
cZxid = 0x22
ctime = Tue Jun 02 13:29:10 CST 2020
mZxid = 0x22
mtime = Tue Jun 02 13:29:10 CST 2020
pZxid = 0x22
cversion = 0
dataVersion = 0
aclVersion = 1
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0
- IP授权模式
命令
setAcl <path> ip:<ip>:<acl>
案例
注意:远程登录zookeeper命令:./zkCli.sh -server ip
[zk: localhost:2181(CONNECTED) 4] create /node2 "node2"
Created /node2[zk: localhost:2181(CONNECTED) 7] setAcl /node2 ip:192.168.188.131:cdrwa
cZxid = 0x24
ctime = Tue Jun 02 13:31:55 CST 2020
mZxid = 0x24
mtime = Tue Jun 02 13:31:55 CST 2020
pZxid = 0x24
cversion = 0
dataVersion = 0
aclVersion = 1
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0[zk: localhost:2181(CONNECTED) 8] getAcl /node2
'ip,'192.168.188.131
: cdrwa
- Auth授权模式:
命令
addauth digest <user>:<password> #添加认证用户
setAcl <path> auth:<user>:<acl>
案例
[zk: localhost:2181(CONNECTED) 9] create /node3 "node3"
Created /node3
[zk: localhost:2181(CONNECTED) 10] addauth digest itcast:123456
[zk: localhost:2181(CONNECTED) 11] setAcl /node3 auth:itcast:cdrwa
cZxid = 0x26
ctime = Tue Jun 02 13:34:36 CST 2020
mZxid = 0x26
mtime = Tue Jun 02 13:34:36 CST 2020
pZxid = 0x26
cversion = 0
dataVersion = 0
aclVersion = 1
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0
[zk: localhost:2181(CONNECTED) 12] getAcl /node3
'digest,'itcast:673OfZhUE8JEFMcu0l64qI8e5ek=
: cdrwa
[zk: localhost:2181(CONNECTED) 13] get /node3
node3
cZxid = 0x26
ctime = Tue Jun 02 13:34:36 CST 2020
mZxid = 0x26
mtime = Tue Jun 02 13:34:36 CST 2020
pZxid = 0x26
cversion = 0
dataVersion = 0
aclVersion = 1
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0
- Digest授权模式:
命令
setAcl <path> digest:<user>:<password>:<acl>
这里的密码是经过SHA1及BASE64处理的密文,在SHELL中可以通过以下命令计算:
echo -n <user>:<password> | openssl dgst -binary -sha1 | openssl base64
先来计算一个密文
echo -n sky:123456 | openssl dgst -binary -sha1 | openssl base64
案例:
[zk: localhost:2181(CONNECTED) 23] create /node5 "node5"
Created /node5
[zk: localhost:2181(CONNECTED) 24] setAcl /node5 digest:sky:mjsqJQ8e6gZDKVF+t9LAARPOBjc=:cdrwa
cZxid = 0x2b
ctime = Tue Jun 02 13:42:59 CST 2020
mZxid = 0x2b
mtime = Tue Jun 02 13:42:59 CST 2020
pZxid = 0x2b
cversion = 0
dataVersion = 0
aclVersion = 1
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0
[zk: localhost:2181(CONNECTED) 25] getAcl /node5
'digest,'sky:mjsqJQ8e6gZDKVF+t9LAARPOBjc=
: cdrwa
[zk: localhost:2181(CONNECTED) 26] get /node5
Authentication is not valid : /node5
[zk: localhost:2181(CONNECTED) 27] addauth digest sky:123456
[zk: localhost:2181(CONNECTED) 28] get /node5
node5
cZxid = 0x2b
ctime = Tue Jun 02 13:42:59 CST 2020
mZxid = 0x2b
mtime = Tue Jun 02 13:42:59 CST 2020
pZxid = 0x2b
cversion = 0
dataVersion = 0
aclVersion = 1
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0
- 多种模式授权:
同一个节点可以同时使用多种模式授权
[zk: localhost:2181(CONNECTED) 48] create /node7 "node7"
Created /node7
[zk: localhost:2181(CONNECTED) 49] addauth digest sky:123456
[zk: localhost:2181(CONNECTED) 50] setAcl /node7 ip:192.168.188.133:cdra,auth:itcast:cdrwa,digest:sky:mjsqJQ8e6gZDKVF+t9LAARPOBjc=:cdrwa
cZxid = 0x34
ctime = Tue Jun 02 13:51:50 CST 2020
mZxid = 0x34
mtime = Tue Jun 02 13:51:50 CST 2020
pZxid = 0x34
cversion = 0
dataVersion = 0
aclVersion = 1
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0
5.7 acl 超级管理员
zookeeper的权限管理模式有一种叫做super,该模式提供一个超管可以方便的访问任何权限的节点
假设这个超管是:super:admin,需要先为超管生成密码的密文
echo -n super:admin | openssl dgst -binary -sha1 | openssl base64
那么打开zookeeper目录下的/bin/zkServer.sh服务器脚本文件,找到如下一行:
nohup $JAVA "-Dzookeeper.log.dir=${ZOO_LOG_DIR}"
"-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}"
这就是脚本中启动zookeeper的命令,我们需要加一个
超管的配置项
"-Dzookeeper.DigestAuthenticationProvider.superDigest=super:xQJmxLMiHGwaqBvst5y6rkB6HQs="
那么修改以后这条完整命令变成了
之后启动zookeeper,输入如下命令添加权限
addauth digest super:admin #添加认证用户
6. zookeeper javaAPI
znode是zooKeeper集合的核心组件,zookeeper API提供了一小组方法使用zookeeper集合来操纵znode的所有细节。
客户端应该遵循以步骤,与zookeeper服务器进行清晰和干净的交互。
- 连接到zookeeper服务器。zookeeper服务器为客户端分配会话ID。
- 定期向服务器发送心跳。否则,zookeeper服务器将过期会话ID,客户端需要重新连
接。 - 只要会话ID处于活动状态,就可以获取/设置znode。
- 所有任务完成后,断开与zookeeper服务器的连接。如果客户端长时间不活动,则
zookeeper服务器将自动断开客户端。
6.1 连接到ZooKeeper
ZooKeeper(String connectionString, int sessionTimeout, Watcher watcher)
- connectionString - zookeeper主机
- sessionTimeout - 会话超时(以毫秒为单位)
- watcher - 实现“监视器”对象。zookeeper集合通过监视器对象返回连接状态。
案例:
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;import java.util.concurrent.CountDownLatch;public class ZookeeperConnection {public static void main(String[] args) {try {// 计数器对象CountDownLatch countDownLatch=new CountDownLatch(1);// arg1:服务器的ip和端口// arg2:客户端与服务器之间的会话超时时间 以毫秒为单位的// arg3:监视器对象ZooKeeper zooKeeper=new ZooKeeper("192.168.188.133:2181",5000, new Watcher() {@Overridepublic void process(WatchedEvent event) {if(event.getState()==Event.KeeperState.SyncConnected) {System.out.println("连接创建成功!");countDownLatch.countDown();}}});// 主线程阻塞等待连接对象的创建成功countDownLatch.await();// 会话编号System.out.println(zooKeeper.getSessionId());zooKeeper.close();} catch (Exception ex) {ex.printStackTrace();}}
}
6.2 新增节点
// 同步方式
create(String path, byte[] data, List<ACL> acl, CreateMode createMode)
// 异步方式
create(String path, byte[] data, List<ACL> acl, CreateMode createMode,
AsyncCallback.StringCallback callBack,Object ctx)
- path - znode路径。例如,/node1 /node1/node11
- data - 要存储在指定znode路径中的数据
- acl - 要创建的节点的访问控制列表。zookeeper API提供了一个静态接口
- ZooDefs.Ids 来获取一些基本的acl列表。例如,ZooDefs.Ids.OPEN_ACL_UNSAFE返回打开znode的acl列表。
- createMode - 节点的类型,这是一个枚举。
- callBack-异步回调接口
- ctx-传递上下文参数
案例:
import org.apache.zookeeper.*;
import org.apache.zookeeper.data.ACL;
import org.apache.zookeeper.data.Id;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;public class ZKCreate {private String IP = "192.168.188.133:2181";private ZooKeeper zooKeeper;@Beforepublic void before()throws Exception{// 计数器对象CountDownLatch countDownLatch=new CountDownLatch(1);// arg1:服务器的ip和端口// arg2:客户端与服务器之间的会话超时时间 以毫秒为单位的// arg3:监视器对象zooKeeper=new ZooKeeper(IP, 5000, new Watcher() {@Overridepublic void process(WatchedEvent event) {if(event.getState()==Event.KeeperState.SyncConnected) {System.out.println("连接创建成功!");countDownLatch.countDown();}}});// 主线程阻塞等待连接对象的创建成功countDownLatch.await();}@Afterpublic void after()throws Exception{zooKeeper.close();}@Testpublic void create1()throws Exception{// arg1:节点的路径// arg2:节点的数据// arg3:权限列表 world:anyone:cdrwa// arg4:节点类型 持久化节点zooKeeper.create("/create/node1","node1".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);}@Testpublic void create2() throws Exception {// Ids.READ_ACL_UNSAFE world:anyone:rzooKeeper.create("/create/node2", "node2".getBytes(), ZooDefs.Ids.READ_ACL_UNSAFE, CreateMode.PERSISTENT);}@Testpublic void create3() throws Exception {// world授权模式// 权限列表List<ACL> acls = new ArrayList<ACL>();// 授权模式和授权对象Id id = new Id("world", "anyone");// 权限设置acls.add(new ACL(ZooDefs.Perms.READ, id));acls.add(new ACL(ZooDefs.Perms.WRITE, id));zooKeeper.create("/create/node3", "node3".getBytes(), acls, CreateMode.PERSISTENT);}@Testpublic void create4() throws Exception {// ip授权模式// 权限列表List<ACL> acls = new ArrayList<ACL>();// 授权模式和授权对象Id id = new Id("ip", "192.168.188.133");// 权限设置acls.add(new ACL(ZooDefs.Perms.ALL, id));zooKeeper.create("/create/node4", "node4".getBytes(), acls, CreateMode.PERSISTENT);}@Testpublic void create5() throws Exception {// auth授权模式// 添加授权用户zooKeeper.addAuthInfo("digest", "itcast:123456".getBytes());zooKeeper.create("/create/node5", "node5".getBytes(), ZooDefs.Ids.CREATOR_ALL_ACL, CreateMode.PERSISTENT);}@Testpublic void create6() throws Exception {// auth授权模式// 添加授权用户zooKeeper.addAuthInfo("digest", "itcast:123456".getBytes());// 权限列表List<ACL> acls = new ArrayList<ACL>();// 授权模式和授权对象Id id = new Id("auth", "itcast");// 权限设置acls.add(new ACL(ZooDefs.Perms.READ, id));zooKeeper.create("/create/node6", "node6".getBytes(), acls, CreateMode.PERSISTENT);}@Testpublic void create7() throws Exception {// digest授权模式// 权限列表List<ACL> acls = new ArrayList<ACL>();// 授权模式和授权对象Id id = new Id("digest", "sky:mjsqJQ8e6gZDKVF+t9LAARPOBjc=");// 权限设置acls.add(new ACL(ZooDefs.Perms.ALL, id));zooKeeper.create("/create/node7", "node7".getBytes(), acls, CreateMode.PERSISTENT);}@Testpublic void create8() throws Exception {// 持久化顺序节点// Ids.OPEN_ACL_UNSAFE world:anyone:cdrwaString result = zooKeeper.create("/create/node8", "node8".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL);System.out.println(result);}@Testpublic void create9() throws Exception {// 临时节点// Ids.OPEN_ACL_UNSAFE world:anyone:cdrwaString result = zooKeeper.create("/create/node9", "node9".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);System.out.println(result);}@Testpublic void create10() throws Exception {// 临时顺序节点// Ids.OPEN_ACL_UNSAFE world:anyone:cdrwaString result = zooKeeper.create("/create/node10", "node10".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);System.out.println(result);}@Testpublic void create11() throws Exception {// 异步方式创建节点zooKeeper.create("/create/node11", "node11".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT, new AsyncCallback.StringCallback() {@Overridepublic void processResult(int rc, String path, Object ctx, String name) {// 0 代表创建成功System.out.println(rc);// 节点的路径System.out.println(path);// 节点的路径System.out.println(name);// 上下文参数System.out.println(ctx);}}, "I am context");Thread.sleep(10000);System.out.println("结束");}
}
6.3 更新节点
// 同步方式
setData(String path, byte[] data, int version)
// 异步方式
setData(String path, byte[] data, int version,AsyncCallback.StatCallback callBack, Object ctx)
- path- znode路径
- data - 要存储在指定znode路径中的数据。
- version- znode的当前版本。每当数据更改时,ZooKeeper会更新znode的版本号。
- callBack-异步回调接口
- ctx-传递上下文参数
案例:
import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;import java.util.concurrent.CountDownLatch;public class ZKSet {String IP = "192.168.188.133:2181";ZooKeeper zooKeeper;@Beforepublic void before() throws Exception {CountDownLatch countDownLatch = new CountDownLatch(1);// arg1:zookeeper服务器的ip地址和端口号// arg2:连接的超时时间 以毫秒为单位// arg3:监听器对象zooKeeper = new ZooKeeper(IP, 5000, new Watcher() {@Overridepublic void process(WatchedEvent event) {if (event.getState() == Event.KeeperState.SyncConnected) {System.out.println("连接创建成功!");countDownLatch.countDown();}}});// 使主线程阻塞等待countDownLatch.await();}@Afterpublic void after() throws Exception {zooKeeper.close();}@Testpublic void set1() throws Exception {// arg1:节点的路径// arg2:修改的数据// arg3:数据版本号 -1代表版本号不参与更新Stat stat = zooKeeper.setData("/set/node1", "node13".getBytes(), -1);// 当前节点的版本号System.out.println(stat.getVersion());}@Testpublic void set2() throws Exception {zooKeeper.setData("/set/node1", "node14".getBytes(), -1, new AsyncCallback.StatCallback() {@Overridepublic void processResult(int rc, String path, Object ctx, Stat stat) {// 0代表修改成功System.out.println(rc);// 节点的路径System.out.println(path);// 上下文参数对象System.out.println(ctx);// 属性描述对象System.out.println(stat.getVersion());}}, "I am Context");Thread.sleep(10000);System.out.println("结束");}
}
6.4 删除节点
// 同步方式
delete(String path, int version)
// 异步方式
delete(String path, int version, AsyncCallback.VoidCallback callBack,
Object ctx)
- path - znode路径。
- version - znode的当前版本
- callBack-异步回调接口
- ctx-传递上下文参数
案例:
import org.apache.zookeeper.AsyncCallback;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.util.concurrent.CountDownLatch;public class ZKDelete {String IP = "192.168.188.133:2181";ZooKeeper zooKeeper;@Beforepublic void before() throws Exception {CountDownLatch countDownLatch = new CountDownLatch(1);// arg1:zookeeper服务器的ip地址和端口号// arg2:连接的超时时间 以毫秒为单位// arg3:监听器对象zooKeeper = new ZooKeeper(IP, 5000, new Watcher() {@Overridepublic void process(WatchedEvent event) {if (event.getState() == Event.KeeperState.SyncConnected) {System.out.println("连接创建成功!");countDownLatch.countDown();}}});// 使主线程阻塞等待countDownLatch.await();}@Afterpublic void after() throws Exception {zooKeeper.close();}@Testpublic void delete1() throws Exception {// arg1:删除节点的节点路径// arg2:数据版本信息 -1代表删除节点时不考虑版本信息zooKeeper.delete("/delete/node1",-1);}@Testpublic void delete2() throws Exception {// 异步使用方式zooKeeper.delete("/delete/node2", -1, new AsyncCallback.VoidCallback() {@Overridepublic void processResult(int rc, String path, Object ctx) {// 0代表删除成功System.out.println(rc);// 节点的路径System.out.println(path);// 上下文参数对象System.out.println(ctx);}},"I am Context");Thread.sleep(10000);System.out.println("结束");}
}
6.5 查看节点
// 同步方式
getData(String path, boolean b, Stat stat)
// 异步方式
getData(String path, boolean b,AsyncCallback.DataCallback callBack,
Object ctx)
- path - znode路径。
- b- 是否使用连接对象中注册的监视器。
- stat - 返回znode的元数据。
- callBack-异步回调接口
- ctx-传递上下文参数
案例:
import org.apache.zookeeper.AsyncCallback;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;import java.util.concurrent.CountDownLatch;public class ZKGet {String IP = "192.168.188.133:2181";ZooKeeper zooKeeper;@Beforepublic void before() throws Exception {CountDownLatch countDownLatch = new CountDownLatch(1);// arg1:zookeeper服务器的ip地址和端口号// arg2:连接的超时时间 以毫秒为单位// arg3:监听器对象zooKeeper = new ZooKeeper(IP, 5000, new Watcher() {@Overridepublic void process(WatchedEvent event) {if (event.getState() == Event.KeeperState.SyncConnected) {System.out.println("连接创建成功!");countDownLatch.countDown();}}});// 使主线程阻塞等待countDownLatch.await();}@Afterpublic void after() throws Exception {zooKeeper.close();}@Testpublic void get1() throws Exception {// arg1:节点的路径// arg3:读取节点属性的对象Stat stat=new Stat();byte [] bys=zooKeeper.getData("/get/node1",false,stat);// 打印数据System.out.println(new String(bys));// 版本信息System.out.println(stat.getVersion());}@Testpublic void get2() throws Exception {//异步方式zooKeeper.getData("/get/node1", false, new AsyncCallback.DataCallback() {@Overridepublic void processResult(int rc, String path, Object ctx, byte[] data, Stat stat) {// 0代表读取成功System.out.println(rc);// 节点的路径System.out.println(path);// 上下文参数对象System.out.println(ctx);// 数据System.out.println(new String(data));// 属性对象System.out.println(stat.getVersion());}},"I am Context");Thread.sleep(10000);System.out.println("结束");}
}
6.6 查看子节点
// 同步方式
getChildren(String path, boolean b)
// 异步方式
getChildren(String path, boolean b,AsyncCallback.ChildrenCallback
callBack,Object ctx)
- path - Znode路径。
- b- 是否使用连接对象中注册的监视器。
- callBack - 异步回调接口。
- ctx-传递上下文参数
案例:
import org.apache.zookeeper.AsyncCallback;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;import java.util.List;
import java.util.concurrent.CountDownLatch;public class ZKGetChid {String IP = "192.168.188.133:2181";ZooKeeper zooKeeper;@Beforepublic void before() throws Exception {CountDownLatch countDownLatch = new CountDownLatch(1);// arg1:zookeeper服务器的ip地址和端口号// arg2:连接的超时时间 以毫秒为单位// arg3:监听器对象zooKeeper = new ZooKeeper(IP, 5000, new Watcher() {@Overridepublic void process(WatchedEvent event) {if (event.getState() == Event.KeeperState.SyncConnected) {System.out.println("连接创建成功!");countDownLatch.countDown();}}});// 使主线程阻塞等待countDownLatch.await();}@Afterpublic void after() throws Exception {zooKeeper.close();}@Testpublic void get1() throws Exception {// arg1:节点的路径List<String> list = zooKeeper.getChildren("/get", false);for (String str : list) {System.out.println(str);}}@Testpublic void get2() throws Exception {// 异步用法zooKeeper.getChildren("/get", false, new AsyncCallback.ChildrenCallback() {@Overridepublic void processResult(int rc, String path, Object ctx, List<String> children) {// 0代表读取成功System.out.println(rc);// 节点的路径System.out.println(path);// 上下文参数对象System.out.println(ctx);// 子节点信息for (String str : children) {System.out.println(str);}}},"I am Context");Thread.sleep(10000);System.out.println("结束");}
}
6.7 检查节点是否存在
// 同步方法
exists(String path, boolean b)
// 异步方法
exists(String path, boolean b,AsyncCallback.StatCallback callBack,Object
ctx)
- path- znode路径。
- b- 是否使用连接对象中注册的监视器。
- callBack - 异步回调接口。
- ctx-传递上下文参数
案例:
import org.apache.zookeeper.AsyncCallback;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;import java.util.concurrent.CountDownLatch;public class ZKExists {String IP = "192.168.188.133:2181";ZooKeeper zooKeeper;@Beforepublic void before() throws Exception {CountDownLatch countDownLatch = new CountDownLatch(1);// arg1:zookeeper服务器的ip地址和端口号// arg2:连接的超时时间 以毫秒为单位// arg3:监听器对象zooKeeper = new ZooKeeper(IP, 5000, new Watcher() {@Overridepublic void process(WatchedEvent event) {if (event.getState() == Event.KeeperState.SyncConnected) {System.out.println("连接创建成功!");countDownLatch.countDown();}}});// 使主线程阻塞等待countDownLatch.await();}@Afterpublic void after() throws Exception {zooKeeper.close();}@Testpublic void exists1() throws Exception {// arg1:节点的路径Stat stat=zooKeeper.exists("/exists1",false);// 节点的版本信息System.out.println(stat.getVersion());}@Testpublic void exists2() throws Exception {// 异步方式zooKeeper.exists("/exists1", false, new AsyncCallback.StatCallback() {@Overridepublic void processResult(int rc, String path, Object ctx, Stat stat) {// 0 代表方式执行成功System.out.println(rc);// 节点的路径System.out.println(path);// 上下文参数System.out.println(ctx);// 节点的版本信息System.out.println(stat.getVersion());}},"I am Context");Thread.sleep(10000);System.out.println("结束");}
}
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- DVWA靶场-Brute Force Source 暴力破解
靶场环境搭建https://github.com/ethicalhack3r/DVWA[网络安全学习篇附]:DVWA 靶场搭建目录Brute Force Source 暴力破解Low Brute Force核心代码BP爆破注入Medium Brute Force核心代码High Brute Force核心代码Impossible Brute ForceBrute Force Source 暴力破解Low Brute F…...
2024/4/16 8:14:11 - js DOM 事件 与http
第一个接收事件的是window -》 document -》html js获得html节点 document.documentElement;=》body捕获 =》 目标阶段=》 冒泡阶段 event event.preventDefault() 阻止默认事件 比如阻止a标签跳转 event.stopPropagaition() 阻止冒泡 event.stoplmmediatePropagarion() 注…...
2024/4/19 9:39:01 - 【分享】http://t.cn/xxx的短链接如何生成?
短链接:用通俗的话说,短链接就是把长网址通过程序计算和其他方法转换成短网址,类似于t.cn/xxxx。短链接优势:短小精悍;减少网址字符占用的空间,尤其是在撰写文章和插入网址字符时;搜索引擎优化!应用场景 短网址的应用非常广泛,如短信营销、邮件宣传、微信营销、QQ营销…...
2024/4/18 18:54:08 - 多线程程序
功能描述:相机采集图片,同时对采集的图片进行处理功能说明:采集和处理两个模块采用线程处理,数据使用循环队列进行存储。主程序#encoding: utf-8该文件用于控制多个相机的采集和算法调用import time import uuid, cv2 import numpy as np import threading from thread…...
2024/4/16 8:14:11 - 006
软件配置管理的作用?软件配置包括什么 软件配置管理(Software Configuration Management,SCM)是一种标识、组织和控制修改的技术。软件配置管理应用于整个软件工程过程。在软件建立时变更是不可避免的,而变更加剧了项目中软件开发者之间的混乱。SCM活动的目标就是为了标识…...
2024/4/16 8:14:16 - 初学Web前端会用到开发工具【零基础web前端入门视频教程】
目前市面上比较流行的前端开发工具主要有WebStorm、Vscode、Sublime、HBuilder、notepad++、EditPlus、记事本等,今天介绍一下这些开发工具,并且给出了下载地址。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Cfsy14n7-1591101435577)(https://u…...
2024/4/16 8:13:56 - DVWA靶场-Command Injection 命令注入
往期博文:DVWA靶场-Brute Force Source 暴力破解靶场环境搭建https://github.com/ethicalhack3r/DVWA[网络安全学习篇附]:DVWA 靶场搭建目录Command Injection 命令注入Low Command Injection核心代码Medium Command Injection核心代码High Command Injection核心代码Impossi…...
2024/4/16 8:14:52 - tensorflow教程
tf对话create two matrixes层数据输入占位符 对话 import tensorflow as tf create two matrixes matrix1 = tf.constant([[3,3]]) matrix2 = tf.constant([[2],[2]]) product = tf.matmul(matrix1,matrix2)# method 1 sess = tf.Session() result = sess.run(product) print(r…...
2024/4/18 10:39:35 - leetcode--字符串的排列
题目来自LeetCode,链接:面试题38. 字符串的排列。具体描述为:输入一个字符串,打印出该字符串中字符的所有排列。你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。示例: 输入:s = "abc" 输出:["abc","acb","bac",&q…...
2024/4/16 8:14:01 - 堆的计数
import java.util.Scanner;public class Main_10 {/*** 题目描述 我们知道包含N个元素的堆可以看成是一棵包含N个节点的完全二叉树。* 每个节点有一个权值。对于小根堆来说,父节点的权值一定小于其子节点的权值。* * 假设N个节点的权值分别是1~N,你能求出一共有多少种不同的小…...
2024/4/16 8:14:16 - 本地文件上传至 Linux 服务器
本地文件上传至 Linux 服务器服务器使用过程中经常需要与 PC 进行文件交互,交互过程中的文件传输可采用的协议主要有 RDP(远程桌面协议), SSH, FTP(远程文件传输协议) 等。方法主要有 scp, xftp(Xshell 插件), lrzsz, FTP工具等,这里只介绍 scp 的上传下载文件时的用法。一、…...
2024/4/19 17:53:41 - 游戏设计模式——面向数据编程(转)
作者:KillerAery 出处:http://www.cnblogs.com/KillerAery/随着软件需求的日益复杂发展,远古时期面的向过程编程思想才渐渐萌生了面向对象编程思想。当人们发现面向对象在应对高层软件的种种好处时,越来越沉醉于面向对象,热衷于研究如何更加优雅地抽象出对象。然而现代开发…...
2024/4/18 10:01:51 - 2020年6月程序员工资统计,平均14404元,又跌了,扎心
见了鬼 本月的平均收入为14404, 本文的articleId为106503404,真是见了鬼。 平均工资 2020年6月全国招收程序员313739人。2020年6月全国程序员平均工资14404元,工资中位数12500元,其中95%的人的工资介于5250元到35000元。虽然收入又下降了,但是岗位比上个月多了起来,随着经…...
2024/4/16 8:15:07 - 2020年6月中国编程语言排行榜
编程语言比例排名 编程语言 平均工资 工资中位数 最低工资 最高工资 人头 人头百分比1 scala 19973 17500 7000 45000 3175 0.68%2 rust 19229 17500 5352 44229 457 0.10%3 julia 18455 20214 12500 25000 11 0.00%4 python 18350 17500 6000 42500 36648 7.90%5 lua 18168 16…...
2024/4/16 8:14:52 - 特长生考试Day_0
你根本不知道,让一个已经退役一年的OIer去考特长生,他有多么绝望。 你永远不知道,当你用洛谷查到你最新几次做题记录做的是网络流,差分约束,斜率优化等算法时,然而你连背包、dfs怎么打都忘记时,你有多么绝望。 你永远不知道,当你看自己曾发的题解时竟然看不懂的心情,有…...
2024/4/16 8:14:42 - 一个实验带你快速掌握NAT的多种实现方式,建议收藏反复学习
认识NAT NAT定义:网络地址转换(NAT,Network Address Translation)属接入广域网(WAN)技术,是一种将私有(保留)地址转化为合法IP地址的转换技术,它被广泛应用于各种类型Internet接入方式和各种类型的网络中。原因很简单,NAT不仅完美地解决了lP地址不足的问题,而且还能够有…...
2024/4/19 19:56:17 - 健壮F.T.+新裸金属重磅发布!全新升级版ZStack加速新基建!
6月2日,以“健壮F.T.+新裸金属 新基建下的新IaaS”为主题的2020年ZStack新品线上超级发布会引爆了企业级云市场。面向新基建发展契机,致力于普惠云计算的ZStack与英特尔、阿里云等伙伴强势携手发布2大重磅新品:首个采用了F.T.技术的ZStack Mini超融合一体机(简称:ZStack M…...
2024/4/18 12:44:01 - 百度云此链接内容可能涉及侵权,分享的文件已经被取消等屏蔽问题的解决方法
...
2024/4/19 17:15:25 - Python的炫技操作:条件语句的七种写法
前言文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。作者: Python极客社区PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取http://t.cn/A6Zvjdun有的人说 Python 入门容易,但是精通难的语…...
2024/4/16 8:14:52 - 如何教零基础的人认识Python
前言 文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。 作者: 编程派 PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取http://t.cn/A6Zvjdun 什么是code? code就就是一种语言,一种计算机…...
2024/4/19 12:41:47
最新文章
- 【InternLM 实战营第二期笔记06】Lagent AgentLego 智能体应用搭建
一、智能体的由来 为什么要有智能体呢?这主要源于大语言模型存在的局限性。尽管大语言模型在人工智能领域取得了显著的进步,但它们仍然面临着一些重要的问题。 智能体可以通过学习和优化算法,不断提升自身的性能。它们可以从历史数据中学习…...
2024/4/20 14:12:36 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - 阿里云弹性计算通用算力型u1实例性能评测,性价比高
阿里云服务器u1是通用算力型云服务器,CPU采用2.5 GHz主频的Intel(R) Xeon(R) Platinum处理器,ECS通用算力型u1云服务器不适用于游戏和高频交易等需要极致性能的应用场景及对业务性能一致性有强诉求的应用场景(比如业务HA场景主备机需要性能一致)…...
2024/4/17 16:24:44 - Unity-C#进阶——3.27更新中
文章目录 数据结构类ArrayListStackQueueHashtable 泛型泛型类、泛型方法、泛型接口ListDictionaryLinkedList泛型栈,泛型队列 委托和事件委托事件匿名函数Lambad 表达式**闭包** List 排序逆变协变多线程进程线程多线程方法:线程之间共享数据࿱…...
2024/4/15 22:15:27 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/4/19 14:24:02 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/4/19 18:20:22 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/4/19 11:57:31 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/4/19 11:57:31 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/4/19 11:57:52 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/4/19 11:57:53 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/4/19 11:58:14 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/4/19 11:58:20 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/4/20 7:40:48 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/4/19 11:58:39 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/4/19 11:58:51 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/4/20 3:12:02 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/4/19 11:59:15 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/4/19 11:59:23 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/4/19 11:59:44 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/4/19 11:59:48 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/4/19 12:00:06 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/4/19 16:57:22 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/4/19 12:00:25 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/4/19 12:00:40 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57