首页 > 其他分享 >zookeeper运维(部署安装,常用命令)

zookeeper运维(部署安装,常用命令)

时间:2024-04-07 11:24:50浏览次数:24  
标签:运维 zk zookeeper 2181 usr 常用命令 path 节点

目录

1. 安装部署

转载连接

1.1 单机部署

1.1.1 下载安装

下载地址:https://zookeeper.apache.org/releases.html
示例使用安装版本:https://www.apache.org/dyn/closer.lua/zookeeper/zookeeper-3.9.2/apache-zookeeper-3.9.2-bin.tar.gz

su - root  # 切换为root身份
wget https://www.apache.org/dyn/closer.lua/zookeeper/zookeeper-3.9.2/apache-zookeeper-3.9.2-bin.tar.gz
# wget下载超时,则手动下载包上传至linux
tar -zxf apache-zookeeper-3.9.2-bin.tar.gz
cp -r zookeeper-3.9.2-bin /usr/local/zookeeper
 
# 创建存放数据文件的目录
mkdir /usr/local/zookeeper/data

至此,Zookeeper安装成功,还需要进行一些配置才能启动。

1.1.2 配置文件

Zookeeper的配置文件在path-to-zookeeper/conf目录下,文件名为zoo.cfg。初始安装的Zookeeper有一个zoo_sample.cfg示例文件,可以拷贝一份,在进行修改。

[root@localhost]# cd zookeeper/
[root@localhost zookeeper]# ls
bin  conf  data  docs  lib  LICENSE.txt  NOTICE.txt  README.md  README_packaging.md
[root@localhost zookeeper]#
[root@localhost zookeeper]# cd conf/
[root@localhost conf]# ls
configuration.xsl  logback.xml  zoo_sample.cfg
[root@localhost conf]# cp zoo_sample.cfg zoo.cfg
[root@localhost conf]# ls
configuration.xsl  logback.xml  zoo.cfg  zoo_sample.cfg
[root@localhost conf]#

  下面是zoo.cfg配置项解释:

# 心跳间隔(毫秒),超过2倍tickTime将会被认为会话超时
tickTime=2000
 
# 初始化连接时最长的时间(心跳间隔次数),超过该值会认为连接超时
initLimit=10
 
# zk集群中leader和follower同步消息的超时时间(心跳间隔次数)
syncLimit=5
 
# 保存zookeeper数据库快照的目录,前面安装zookeeper时已经创建了该目录
dataDir=/usr/local/zookeeper/data
 
# 服务器监听的端口号,用于客户端连接服务器
clientPort=2181
 
# zk服务器所支持的最大客户端连接数量
# maxClientCnxns=60

1.1.3 zk server状态管理

启动,重启,停止,状态

Zookeeper中可执行文件都存放在zookeeper安装路径下的bin目录下,而对Zookeeper服务器运行状态管理,使用的是zkServer.sh这个脚本。

  • 通过传入start | stop | restart | status来管理Zookeeper服务器的运行状态
/usr/local/zookeeper/bin/zkServer.sh start
/usr/local/zookeeper/bin/zkServer.sh restart
/usr/local/zookeeper/bin/zkServer.sh stop
/usr/local/zookeeper/bin/zkServer.sh status
[root@localhost bin]# ls
README.txt              zkSnapshotComparer.cmd
zkCleanup.sh            zkSnapshotComparer.sh
zkCli.cmd               zkSnapshotRecursiveSummaryToolkit.cmd
zkCli.sh                zkSnapshotRecursiveSummaryToolkit.sh
zkEnv.cmd               zkSnapShotToolkit.cmd
zkEnv.sh                zkSnapShotToolkit.sh
zkServer.cmd            zkTxnLogToolkit.cmd
zkServer-initialize.sh  zkTxnLogToolkit.sh
zkServer.sh
[root@localhost bin]#
[root@localhost bin]# ./zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@localhost bin]#

1.1.4 使用zk客户端登录服务器

通过命令行的方式登录到Zookeeper服务器,可以使用Zookeeper提供的zkCli.sh脚本,位于/usr/local/zookeeper/bin目录下。

/usr/local/zookeeper/bin/zkCli.sh -server 127.0.0.1:2181

1.1.5 使用PrettyZoo连接zk

1.2 集群部署

1.2.1 环境准备

Zookeeper集群的安装,比安装单机Zk多了1个配置项(server.x)。
本次搭建Zk集群,包含3台机器(建议使用奇数台机器),机器ip分别为
  centos01:192.168.1.3
  centos02:192.168.1.4
  centos03:192.168.1.5
需要在上面三台机器上安装zookeeper,使用上面单机zookeeper的安装步骤。

1.2.2 配置修改

修改集群中每一台zk机器的配置文件内容(/usr/local/zookeeper/conf/zoo.cfg),请尽量保证集群中所有zk机器的配置文件相同。

# 心跳间隔(毫秒),超过2倍tickTime将会被认为会话超时
tickTime=2000
 
# 初始化连接时最长的时间(心跳间隔次数),超过该值会认为连接超时
initLimit=10
 
# zk集群中leader和follower同步消息的超时时间(心跳间隔次数)
syncLimit=5
 
# 保存zookeeper数据库快照的目录,前面安装zookeeper时已经创建了该目录
dataDir=/usr/local/zookeeper/data
 
# 服务器监听的端口号,用于客户端连接服务器
clientPort=2181
 
# 配置zk集群节点信息
server.1=192.168.1.3:2888:3888
server.2=192.168.1.4:2888:3888
server.3=192.168.1.5:2888:3888

上面的集群配置中,比单机配置多了 server.n=A:B:C 几个配置,该配置项的规则如下:
  1、统一前缀,"server.";
  2、"server." 后面的数字n表示机器的id(序号),可以随意指定,不要重复即可;
  3、A 表示集群中zk机器的ip;
  4、B 表示Zk集群中,follower与leader通信的端口;
  5、C 表示当leader宕机时,各follower选举新leader的通信端口;

1.2.3 设置myid

上面配置中使用了server.x来指定ip所指的机器编号为x,除此之外,还需要在dataDir所指的目录下创建一个文件(文件名为myid,不能更改),在该文件中保存机器的id(编号)。

# 配置zk集群节点信息
server.1=192.168.1.3:2888:3888
server.2=192.168.1.4:2888:3888
server.3=192.168.1.5:2888:3888
  • 在1.2.2配置中,已指定dataDir=/usr/local/zookeeper/data,用来存放数据的目录。
  • 在1.2.2配置中,192.168.1.3为1号服务器,所以需要在/usr/local/zookeeper/data目录下创建myid文件,内容为1;
    同理:
    192.168.1.4为2号服务器,所以需要在/usr/local/zookeeper/data目录下创建myid文件,内容为2;
    192.168.1.5为3号服务器,所以需要在/usr/local/zookeeper/data目录下创建myid文件,内容为3;
    可使用下面的命令快速设置myid,分别在三台机器中执行如下命令:
# 192.168.1.3机器,编号为1
[root@centos03 ~]# mkdir /usr/local/zookeeper/data
[root@centos03 ~]# echo 1 > /usr/local/zookeeper/data/myid
 
# 192.168.1.4机器,编号为2
[root@centos04 ~]# mkdir /usr/local/zookeeper/data
[root@centos04 data]# echo 2 > /usr/local/zookeeper/data/myid
 
# 192.168.1.5机器,编号为3
[root@centos05 ~]# mkdir /usr/local/zookeeper/data
[root@centos05 ~]# echo 3 > /usr/local/zookeeper/data/myid

1.2.4 启动集群

  启动集群的方式,就是依次启动所有集群机器的zkServer即可。

[root@centos03 ~]# /usr/local/zookeeper/bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
 
[root@centos04 ~]# /usr/local/zookeeper/bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
 
[root@centos05 ~]# /usr/local/zookeeper/bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

  查看集群中每台机器的状态

[root@centos03 ~]# /usr/local/zookeeper/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: leader
 
[root@centos04 ~]# /usr/local/zookeeper/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: follower
 
[root@centos05 ~]# /usr/local/zookeeper/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: follower

1.2.5 测试集群

注:客户端连接集群中的机器,使用2181端口,不要使用配置集群的2888和3888端口

# 连接到192.168.1.3
ganlixins-MacBook-Pro:~ ganlixin$ /usr/local/zookeeper/bin/zkCli.sh  -server 192.168.1.3:2181
[zk: 192.168.1.3:2181(CONNECTED) 0] create /abc 123
Created /abc
[zk: 192.168.1.3:2181(CONNECTED) 1] create /xyz 666
Created /xyz
[zk: 192.168.1.3:2181(CONNECTED) 2] quit
Quitting...
 
# 连接到192.168.1.4
ganlixins-MacBook-Pro:~ ganlixin$ /usr/local/zookeeper/bin/zkCli.sh  -server 192.168.1.4:2181
[zk: 192.168.1.4:2181(CONNECTED) 0] ls /
[xyz, abc, zookeeper]

2. 常用命令

转载连接

2.1 分类

  1. 状态管理命令:启动(zkServer.sh start)zk服务器,终止(stop),状态查看(status),重启(restart)
  2. 数据操作命令:创建数据节点、删除数据节点、查询数据节点内容...

2.2 功能脚本

2.2.1 zkServer状态管理

zk状态管理,通过运行zkServer.sh脚本来实现,脚本目录在其bin目录下,所有操作如下:

zkServer.sh {start|start-foreground|stop|restart|status|upgrade|print-cmd}

使用方式,如启动zk服务器:zkServer.sh start

2.2.2 zkCli客户端登录

启动服务端,可使用zkCli登录客户端,使用方式
本地连接:

# 不指定-server,默认使用本机localhost:2181
/usr/local/zookeeper/bin/zkCli.sh

远程连接:

# 格式zkCli.sh -server ip:port
/usr/local/zookeeper/bin/zkCli.sh -server 127.0.0.1:2181

关闭连接:

[zk: localhost:2181(CONNECTED) 27] close

[zk: localhost:2181(CLOSED) 28] ls
Not connected

重新连接:

[zk: localhost:2181(CLOSED) 33] connect 127.0.0.1:2181

退出服务:

[zk: localhost:2181(CLOSED) 35] quit

2.3 数据操作命令

当客户端成功的连接到Zookeeper服务后,我们可以输入任意非法的命令都可以获取Zookeeper客户端相关的命令使用方法

命令概览

连接到Zookeeper服务后,输入help查看相关命令
ZooKeeper -server host:port cmd args     # 宿主机命令行执行Zookeeper客户端命令
stat path [watch]                        # 查看节点状态或者判断结点是否存在
set path data [version]                  # 设置节点数据
ls path [watch]                          # 列出节点信息
delquota [-n|-b] path                    # 删除节点个数(-n)或数据长度(-b)配额
ls2 path [watch]                         # ls命令的加强版,列出更多信息
setAcl path acl                          # 设置节点的权限信息
setquota -n|-b val path                  # 设置节点个数(-n)或数据长度(-b)的配额
history                                  # 列出最近的命令历史,可以和redo配合使用
redo cmdid                               # 再次执行某个命令,结合history使用
printwatches on|off                      # 设置和显示监视状态
delete path [version]                    # 删除节点,不可删除有子节点的节点
sync path                                # 强制数据同步
listquota path                           # 显示节点资源配额信息
rmr path                                 # 强制删除节点
get path [watch]                         # 获取节点数据
create [-s] [-e] path data acl           # 创建顺序(-s)或临时(-e)结点
addauth scheme auth                      # 配置节点认证信息
quit                                     # 退出连接
getAcl path                              # 获取节点的权限信息
close                                    # 断开当前Zookeeper连接
connect host:port                        # 连接Zookeeper服务端

这些命令主要分为五大类:基本信息查看、节点基本操作、资源配额、权限设置、其他操作等,接下来我们分别对这些命令进行学习。

2.3.1 ls path(查看path下有哪些节点)

查看path节点下有哪些子节点,不会显示当前路径的下层级的节点,示例如下:

zk: localhost:2181(CONNECTED) 11] ls /
[admin, brokers, cluster, config, consumers, controller, controller_epoch, feature, isr_change_notification, latest_producer_id_block, log_dir_event_notification, zookeeper]

2.3.2 create path data(创建节点)

该命令用来创建path节点,并且设置节点的值为data。

注意:使用create创建path时,不能嵌套创建path,比如创建/abc/xyz,那么/abc必须是已经存在的,不能直接创建/abc/xyz。

[zk: 127.0.0.1:2181(CONNECTED) 4] create /abc xxxxxx
Created /abc
[zk: 127.0.0.1:2181(CONNECTED) 5] ls /
[abc, zookeeper, ...]

嵌套创建path时,如果上级目录不存在,则创建失败:

[zk: 127.0.0.1:2181(CONNECTED) 5] ls /abc
[]
[zk: 127.0.0.1:2181(CONNECTED) 6] create /abc/xyz/aaa 12345
Node does not exist: /abc/xyz/aaa
[zk: 127.0.0.1:2181(CONNECTED) 7] create /abc/xyz 123
Created /abc/xyz
[zk: 127.0.0.1:2181(CONNECTED) 8] create /abc/xyz/aaa 12345
Created /abc/xyz/aaa

使用create命令时,有-s和-e选项,分别表示Sequence(有序节点)、Ephemeral(临时节点),zookeeper默认的节点类型是无序、永久节点;
  无序是指一个节点下创建子节点时,子节点不会重复;
  永久是指并且如果不主动删除,那么节点就会一直存在;
  有序是指创建节点时,会在节点名称后面加一个10位长度的数字,表示其顺序(序号),可以创建相同的节点名称(但是序号不相同);
  临时是指创建的节点只在当前连接(session)有效,当连接断开后,临时节点就会被删除(可能会有几秒的延迟)。

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

# 无序、永久节点,不能重复创建
[zk: localhost:2181(CONNECTED) 1] create /abc 123
Created /abc
[zk: localhost:2181(CONNECTED) 2] create /abc 456
Node already exists: /abc
 
# 有序节点可以重复创建
[zk: localhost:2181(CONNECTED) 3] create -s /xyz 123
Created /xyz0000000001
[zk: localhost:2181(CONNECTED) 4] create -s /xyz 456
Created /xyz0000000002
[zk: localhost:2181(CONNECTED) 5] ls /
[xyz0000000001, abc, xyz0000000002, zookeepe

2.3.3 get path(查看节点信息)

该命令用来查看path节点上值以及节点信息,示例如下:

[zk: localhost:2181(CONNECTED) 26] get /abc
xxxxxx

2.3.4 set path data(设置节点数据)

该命令用来对已经存在的path的data进行设置.
注意:如果path不存在,那么set操作就会失败

[zk: localhost:2181(CONNECTED) 27] set /abc yyyyyy
[zk: localhost:2181(CONNECTED) 28]
[zk: localhost:2181(CONNECTED) 28] set /www xxxxxx
Node does not exist: /www
[zk: localhost:2181(CONNECTED) 29]

set命令可以有一个version可选项,表示要设置哪一个version的path:当要设置的path,对应的dataVersion为version时,才进行set操作,否则认为失败,因为version不同,表示要设置的path不匹配。  

2.3.5 delete path(删除节点)

该命令用来删除叶子节点,叶子节点就是没有子节点的节点。如果删除path下面还有其他的子节点,那么删除操作就会失败。

[zk: localhost:2181(CONNECTED) 3] ls /
[a, abc, admin, brokers, cluster, config, consumers, controller, controller_epoch, feature, isr_change_notification, latest_producer_id_block, log_dir_event_notification, zookeeper]
[zk: localhost:2181(CONNECTED) 4] create /a/b
Created /a/b
[zk: localhost:2181(CONNECTED) 5] delete /a # 删除的path包含子节点,删除失败
Node not empty: /a
[zk: localhost:2181(CONNECTED) 6] delete /a/b # 删除的节点没有子节点,删除成功
[zk: localhost:2181(CONNECTED) 7]

2.3.6 rmr path(删除节点)

该命令用来递归删除path,如果path下面有子节点,那么子节点都会被全部删除。

注:apache-zookeeper-3.9.2版本,没有该命令了

2.3.7 stat path(节点信息)

用来获取path节点的相关信息,节点不存在则报错,示例如下:

[zk: localhost:2181(CONNECTED) 12] stat /a
cZxid = 0x13d                            # 节点创建时的zxid
ctime = Sun Apr 07 09:52:56 CST 2024     # 节点创建时间
mZxid = 0x14e                            # 节点最近一次更新时的zxid
mtime = Sun Apr 07 09:57:13 CST 2024     # 节点最近一次更新的时间
pZxid = 0x150                            # 父节点创建时的zxid
cversion = 7                             # 子节点数据更新次数
dataVersion = 1                          # 本节点数据更新次数
aclVersion = 0                           # 节点ACL(授权信息)的更新次数
ephemeralOwner = 0x0                     # 持久节点值为0,临时节点值为sessionid
dataLength = 6                           # 节点数据长度
numChildren = 1                          # 子节点个数

2.4 watch机制

对于zookeeper目录树上的节点来说,需要关注某个节点,当节点发生变化时,需要触发一些事件。
举例:当/user/Jane节点被删除时,通知客户端删除用户Jane,这就是watch机制(监听)。

2.4.1 watch机制的特点

先注册后监听:对于节点的变化,需要先监听,当节点发生变化时,才会触发通知;
一次性触发:watch后,只会触发一次通知,如果要每次都触发,那么就需要在触发watch的事件后,重新watch;
异步通知:当事件触发后,通知时异步发给客户端的;

2.4.2 通知状态和事件类型

在zookeeper中,可以对数据节点进行很多操作,比如删除、修改、增加子节点...
在触发watch通知的时候,应该通知客户端哪个节点进行了什么操作。 
通知状态包括三类:SyncConnected、Disconnected、Expired、AuthFailed,每一个通知状态(KeeperState)下又有多种事件类型(EventType):

SyncConnected
  None:客户端与服务器成功建立连接;
  NodeCreated:监听的节点被创建;
  NodeDeleted:监听的节点被删除;
  NodeDataChanged:监听的节点数据内容被修改;
  NodeChildChanged:监听的节点的子节点的节点数据内容发生改变;
Disconnected
  None:客户端与服务器断开连接
Expired
  None:会话超时
AuthFailed
  None:鉴权失败

2.4.3 watch示例

  只有一部分zookeeper命令支持watch操作,可以通过查看zk的命令列表,后面有[-w]的命令才支持(只有stat、ls、config、get这四个命令支持)。

[zk: localhost:2181(CONNECTED) 3] 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|-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|-N|-B val path
        stat [-w] path
        sync path
        version
        whoami

示例说明:
单纯的使用ls,不加watch选项,就没有监听。

[zk: localhost:2181(CONNECTED) 5] ls /a
[b]
使用watch选项:
[zk: localhost:2181(CONNECTED) 8] ls /a -w
[b]
[zk: localhost:2181(CONNECTED) 9]

标签:运维,zk,zookeeper,2181,usr,常用命令,path,节点
From: https://www.cnblogs.com/running-future/p/18118654

相关文章

  • Docker基本学习(运维)
     一、背景介绍1.什么是dockerDocker,翻译过来就是码头工人Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可抑制的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器完全使用沙盒机制,相互之间不会存在任何接口。几乎没有性能开销,可......
  • docker、docker-compose 常用命令
    1.docker常用命令创建容器:dockercreate启动容器:dockerstart[id]停止容器:dockerstop [id]停止全部运行的容器:dockerstop`dockerps-q`重启容器:dockerrestart [id] 查看运行中的容器:dockerps查看所有容器(包括已停止的):dockerps-a删除容器:dockerrm容器id查......
  • 一款免费强大的运维工单管理系统 - WGCAT
    WGCAT是WGCLOUD团队开发的一款运维工单系统,该工单系统遵循轻量实用的设计原则,也是遵循该团队一贯的设计作风,恰到好处,简约时尚,部署和操作使用都很简单。除了工单流转功能,WGCAT工单系统还提供了资产管理模块,账号管理模块,以及工作笔记,可以更好的辅助我们工作。最好的是WGCAT工单......
  • Linux常用命令
    Linux常用命令本文记录了常用命令的详细解读。列出当前目录ls列出详细信息,可以查看文件和文件夹到权限ls-al给文件和文件夹授权sudochmod-R777dataset创建文件夹mkdir复制文件夹(递归)cp-r通过SSH复制到远程服务器scp-r在linux下一般用scp这个命令来......
  • 【Linux】在生产环境中,Linux系统排查常用命令
    问题排查文章目录问题排查top命令CPU:vmstatprocscpu内存:free硬盘:df硬盘IO:iostat网络IO:ifstat生产环境服务器变慢,诊断思路和性能评估top命令查看整机系统新能使用top命令的话,重点关注的是%CPU、%MEM、loadaverage三个指标在这个命令下,按1的话,可以看到每个C......
  • PM2 常用命令备忘单
    PM2常用命令备忘单 概述以下命令,基本涵盖了PM2的所有使用场景开始#分叉模式pm2startapp.js--namemy-api#给进程命名#集群模式pm2startapp.js-i0#根据可用CPU数量启动最大进程数,并使用负载均衡pm2startapp.js-imax#与上述相同,但已弃用pm2s......
  • zookeeper监听集群节点的实现zkclient组件实现方案(Java版)
    ZooKeeperWatcher机制client向zookeeper注册监听client注册的同时会存储一个WatchManager对象向zookeeper发生改变则notificationclient并发送一个WatchManager对象,然后client再更新该对象packagecom.jacky.zk.demo;importorg.I0Itec.zkclient.IZkChildListen......
  • KingbaseES V8R6集群运维案例之---同城双中心switchover案例
    KingbaseESV8R6集群运维案例之---同城双中心switchover案例案例说明:在同城双中心执行switchover在线切换后,双中心架构保持不变。适用版本:KingbaseESV8R6集群架构:一、切换前集群节点状态如下所示,切换前集群的主库(Primary)位于同城灾备中心,现在执行switchover在线切......
  • 系统部署与运维常见问题速查
    1CentOS7配置新用户addusernewUser #创建新用户passwdnewUser #为新用户配置密码su-newUser #切换到新用户2CentOS7为新用户配置sudo权限【包括免密】su #切换到root用户sudovim/etc/sudoers #编辑/etc/sudoers文件#搜索wheel用户组,wheel用户组默认......
  • MySQL、Redis 和 Zookeeper 实现分布式锁方法及优缺点
    MySQL、Redis和Zookeeper都可以用来实现分布式锁,每种技术都有其特定的实现方法以及各自的优缺点。MySQL分布式锁实现方法在MySQL中实现分布式锁通常涉及到使用数据库表。可以创建一个专用的锁表,并利用行的唯一性(例如利用唯一索引)来实现锁机制。使用基于事务的 FORUP......