彻底搞懂 Zookeeper,吊打大厂面试官
nanshan 2024-10-22 12:54 15 浏览 0 评论
ZooKeeper 是什么?
ZooKeeper 是一个基于 Java 语言开发的,开源,高可用,服务于其他分布式服务产品的一款服务注册与发现的工具。属于 Apache 基金会的一款产品。logo 是一个矿工。
官网地址:https://zookeeper.apache.org/
注:本文篇幅较长,大家按章节阅读。
ZooKeeper 应用场景详解?
服务注册与发现
ZooKeeper 有很多优良的特性,如自动选举、观察者模式、有序无序节点等。这些特性为服务的注册与发现提供了优质可靠的服务。
服务注册
先说一说 ZooKeeper 作为服务的注册中心,ZooKeeper 的存储结构是类似于 Linux 文件系统的树形存储结构。每个节点都可以存储一些少量的数据信息,我们服务启动时,可以创建 ZooKeeper 临时有序节点用于存储服务所注册的信息,如服务 IP、服务端口、服务的全类名、方法签名等等,为后续服务发现提供便利。
服务发现
服务发现相对比较简单,我们只需要连上 ZooKeeper 注册中心就可以监听我们注册的服务信息,当注册的服务发生变更时,我们也能够及时感知。当需要服务调用时,只需要读取对应节点中的服务信息,然后使用 RPC 框架发起远程调用即可。
服务上下线
ZooKeeper 的数据节点分为持久节点和临时节点,临时节点是当客户端断开连接时,则会删除该节点。此特性正好可以用于我们服务的动态上下线,当服务上线时,创建一个临时有序节点,当我们下线时,ZooKeeper 会自动删除这个节点,并通知其他客户端观察者节点的变更信息。如此我们就实现了服务的动态上下线。是不是非常简单呢。
服务软负载
当一个服务压力较大时,我们第一时间的想法一般是横向拓展,多部署几台服务器对外提供服务,从而产生了一个服务集群。那么这个服务集群每个服务之间的情况是有差异的,会引发一些问题:每台服务器网络延迟不同,单位时间内处理的请求次数不同等等。使用 ZooKeeper 则可以完美的化解这个问题,开发者可自主定制多套软负载均衡策略,可以使用不同的策略让服务集群中的服务合理的处理请求。
实现案例:https://segmentfault.com/a/1190000012185401
分布式锁
在分布式微服务系统中,一个应用会切分为多个服务部署到多台服务器当中,那么业务中的锁就只能锁住当前服务器运行的实例,而不能管控到其他服务器上的实例。那么这种情况下,上锁显然是会有问题的,例如 A 和 B 是部署在不同服务器的相同服务,服务 A 需要更改数据库中的某条记录,加锁;此时服务 B 也需要更改同一条记录,也加锁,那么 A 和 B 都加锁解锁成功,但是记录已被修改了两次,导致数据不一致。
那么多个服务想要锁住某块业务逻辑,势必需要使用同一把锁,进行统一的加锁和解锁。
ZooKeeper 不依赖服务,属于独立的注册中心,集群可靠性和容错性高。当应用获取锁时,在 ZooKeeper 中创建一个临时带序号节点,判断该节点是否时序号最小的临时节点,如果是则成功获取锁,如果不是则监听前一个节点是否释放。直到自己创建的节点成为带序号的最小节点,则获取到锁。释放锁时,删除该临时节点即可。
ZooKeeper 锁框架——Curator
自己使用 ZooKeeper 编写分布式锁可能会有一些考虑不太全面的问题,Apache Curator 是以 ZooKeeper 为基础开发的分布式锁框架,拥有一套完整的分布式锁解决方案。Curator 使用极其简单,具体操作步骤请继续向下阅读。
Apache Curator
官网:http://curator.apache.org/
快速使用:前提是搭建好 ZooKeeper 环境。
1. 从 Maven 仓库中下载对应依赖。
2. 创建一个 ZooKeeper 连接:
RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3)
CuratorFramework client = CuratorFrameworkFactory.newClient(zookeeperConnectionString, retryPolicy);
client.start();
3. 创建一个锁节点:
client.create().forPath("/my/path", myData)
4. 使用分布式锁:
// 获取锁
InterProcessMutex lock = new InterProcessMutex(client, lockPath);
// 上锁, 设置自动解锁时间, 避免死锁
if (lock.acquire(maxWait, waitUnit)) {
try {
// 被锁住的业务
}finally {
// 最终解锁
lock.release();
}
}
ZooKeeper 安装与启动
安装
环境
需要提前准备好 JDK 环境,不会的可以百度安装,本文不再赘述。
版本
提供的是压缩文件,各类系统均可使用。
下载
官方下载:https://zookeeper.apache.org/releases.html
找到想要下载的版本即可,官方默认是 Linux 版本,修改些配置 Win 也可以使用!
下载速度受网速影响,服务器架设在国外因此速度很慢,耐心等待即可。
解压
Linux:使用 FTP 工具,上传到 Linux 服务器,使用 tar -zxvf zookeeper-3.4.7.tar.gz 解压到当前文件夹。
Windows:使用解压工具,作者使用的时 7-zip,需要解压两次,第一次解压为 zookeeper-3.4.7.tar 文件夹,然后进入文件夹,第二次解压 zookeeper-3.4.7.tar 压缩包得到 zookeeper-3.4.7 文件夹。
解压后的目录如下:
启动
配置
刚下载下来的 ZooKeeper 直接启动是会报错的,因此我们下载下来第一步就是要先修改一下配置文件。进入上图的目录下,我们常用的就是 bin 和 conf,进入 conf 目录下:
1. 先复制一份 zoo_sample.cfg,命名为 zoo_bk.cfg,避免以后我们改乱了配置文件没有备份。
2. 将 zoo_samplle.cfg 重命名为 zoo.cfg。
3. 修改配置:
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/tmp/zookeeper
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
一共有五个配置项。
tickTime
通信心跳时间,客户端与服务器的心跳时间,单位:毫秒。
initLimit
leader 和 follower 初始通信时限,即在 10*2000 毫秒内,没有连接上,则认为此次通信失败。
syncLimit
leader 和 follower 同步通信时限,即建立连接后,如果通信时间超过 5*2000 毫秒,则 leader 判定此 follower 挂了。
dataDir
数据存储路径,Windows 修改为你的自定义路径。Linux 切记切记一定要修改为你自己定义的路径,因为默认的路径是 /tmp/zookeeper,当服务器磁盘空间不够时会优先清理 tmp,导致数据丢失。
clientPort
客户端端口,默认 2181。
我们修改一下 dataDir 即可,其他的可以使用默认值,生产环境按照需求配置即可。以下是完整配置:
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=D:/tmp/zookeeper
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
启动
进入 bin 目录,我们可以看到一些脚本,cmd 为 Windows 系统使用,sh 为 Linux 系统使用。
双击启动 zkServer.cmd,发现无响应,使用 cmd 运行,发现报错了,原因是 JAVA_HOME 的路径有问题!
包含路径包含空格,修改一下 JAVA_HOME,使用 " 号将有空格的路径括起来(注意要用英文引号),改为如下图所示:
再次启动,如下图显示,成功!
验证
使用 ZK 客户端连接一下,双击 zkCli.cmd 输入命令:get /,查询根节点成功,验证成功!
ZooKeeper 集群搭建
集群安装多少节点合适?
服务器越多,难道每一台都安装上 ZooKeeper 吗?其实不是的,ZooKeeper 是半数投票表决机制,无论什么操作,只要 leader 发起提案,需要获取超过半数节点的选票才能通过。因此集群节点一般为基数个,如 3、5、7、9。假设有 5 台服务器,那么 3 台安装 ZooKeeper,或者 5 台全部安装 ZooKeeper 都可以。假设有 50 台服务器呢?注意,ZooKeeper 上限推荐为 11 台服务器,因为半数投票机制,需要对所有节点通信,服务器越多则通信代价越大,并不是越多越好。
我们假定我们需要搭建的集群为 3 个节点。
多节点安装
参照上一节,将压缩包上传至 Linux 服务器,解压压缩包,备份配置文件。详细配置放在后面,先别修改配置。
演示安装目录:/opt/module/zookeeper。
创建数据存储目录
我们创建一个数据存储目录 /opt/module/zookeeper/zkData,用于存储数据。和 bin 目录,conf 目录同级。
配置服务器编号
在 /opt/module/zookeeper/zkData 下创建一个 myid 文件(建议在 Linux 系统下创建)。vi myid 写入编号,节点 1 写 1,节点 2 写 2,节点 3 写 3。只需要写一个数字即可,其他什么都不要!此编号用于标识 ZooKeeper 节点,后续会有说明。
配置 zoo.cfg
dataDir=/opt/module/zookeeper/zkData
增加如下配置:
################################## Cluster ############################
server.1=1 号服务器 ip:2888:3888
server.2=2 号服务器 ip:2888:3888
server.3=3 号服务器 ip:2888:3888
配置参数解读:server.A=B:C:D
- A 表示第几号服务器
- B 表示服务器地址
- C leader 和 follower 通信端口号
- D 选举端口
启动集群
进入 ZooKeeper 的 bin 目录下,执行 ./zkServer.sh start 启动 ZooKeeper 服务器。3 台服务器依次启动,使用 ./zkServer.sh status 查看是否启动成功,看到 STARTED 则表示启动成功。
ZooKeeper 选举策略详解
ZooKeeper 第一次选举
ZooKeeper 的第一次选举比较特殊,涉及的东西有些复杂,我画了大量的图来说清楚,加深大家的理解。
第一台服务器启动
ZooKeeper 集群中,一共有 3 台服务器,此时我们启动编号为 1 的 ZK 服务器,服务器启动后先投自己一票,然后发现没有其他节点且选票不够半数,则进入等待阶段。
第二台服务器启动
编号为 2 的服务器启动,首先投自己一票。然后服务器 1 和服务器 2 交换选票,服务器 1 发现自己的 myid 小于服务器 2 的 myid,则把自己的选票给服务器 2,服务器 2 获得半数投票成为 leader。
第 3 台服务器启动
编号为 3 的服务器启动,发现已经存在 leader,自动变为 follower。
至此,第一次 leader 的选举完成。
ZXID、SID、EPOCH 说明:
- ZXID 每一次写操作的事务 ID
- SID 每一台服务器的 ID,不能重复,和 myid 一致
- EPOCH 每个 leader 的任期代号,每次一次选举就会增加
ZooKeeper 非第一次选举
选举时机
当发生以下两种情况会选举:
- 服务器集群第一次启动
- 当无法与 leader 连接时
当服务器进入 leader 选举流程时也会出现两种情况:
- 集群中有 leader 存在
- 集群中 leader 确实挂了
如果集群中存在 leader,机器尝试取选举 leader 时,会被告知当前集群中的 leader 信息。只需要同步信息即可 如果集群中不存在 leader, 则需要进行真正的选举。
开始选举
选举涉及 ZIXD,SID,EPOCH,我们假设 3 个节点的集群,编号为 1,2,3。我们假设 2 是 leader,且已经挂了,那么剩下的 1 和 3 则需要开始选举。
假设 leader 挂之前,1 号节点(EPOCH=1, ZXID=4, SID=1),2 号节点(EPOCH=1, ZXID=4, SID=2),3 号节点(EPOCH=1, ZXID=3, SID=3)。
现在 1 号和 3 号发起选举。
选举原则
- EPOCH 任期 ID 谁大谁胜出
- EPOCH 相同,ZXID 事务 ID 谁大谁胜出
- ZXID 相同,SID 谁大谁胜出
根据这个原则,我们看 1 号和 3 号,EPOCH 相同,1 号 ZXID 事务 ID 大于 3 号事务 ID,1 号成为 Leader。
ZooKeeper 选举原理剖析
说到原理,又要回到起点,也就是 ZooKeeper 的中心思想,这里涉及 Paxos 算法和 ZAB 协议,作者尽量说明白。
Paxos 算法
Paxos 算法是什么?
Paxos 算法是一种基于消息传递且具有高度容错性的一致性算法。也就是说,Paxos 算法是用于保证一致性的。
Paxos 算法解决什么问题?
就是如何快速正确的在一个分布式系统中对某个数据值达成一致,并保证不论发生任何异常,都不会破坏整个系统的一致性。
在一个 Paxos 系统中,首先会将节点划分为 Proposer(提议者)、Acceptor(接受者)、Learner(学习者)。每个节点都可以身兼数职。
Paxos 算法流程
Prepare 准备阶段
Proposer 向多个 Acceptor 发出 Propose 请求 Promise(承诺) Acceptor 针对收到的 Propose 请求进行 Promise(承诺)。
Accept 接受阶段
Proposer 收到多数 Acceptor 承诺的 Promise 后,向 Acceptor 发出 Propose 请求,Acceptor 针对收到的 Propose 请求进行 Accept 处理。
Learn 学习阶段
Propose 将形成的决议发给所有的 Learners。
Paxos 算法流程图
Paxos 算法改进
当一场决议中,如果存在多个 Propose(提议者)且争相抢夺 Accept,导致提议迟迟达不到一致。针对这种情况,一种改进的 Paxos 算法提出:从系统中选举出一个 leader,只有 leader 才能够发起提案。
ZAB 协议
ZAB 算法借鉴了 Paxos 算法,并对 Paxos 进行了改进,是特别为 ZooKeeper 设计的支持崩溃回复的原子广播协议。基于该协议,一个集群中只有一个 Leader,其余均是 Follower,只有 Leader 能够发起提案。
协议内容
- 消息广播
- 崩溃恢复
消息广播
崩溃恢复
重新选举
一旦 leader 崩溃,则需要重新选举 leader,ZAB 协议原则如下:
- 含有未提交的提案的节点,不能参与 leader 选举
- leader 节点必须包含最大的事务 ID,即 ZXID
- 新节点成为 leader 后,必须先确认事务日志中的提案已被半数的 follwer 提交
- leader 确保事务日志中的所有提案都和 follower 同步完成后,才会将 follwer 加入可用的 follwer 列表中
实战操作 ZooKeeper
ZooKeeper 常用命令
[zkshell: 0] help
ZooKeeper -server host:port cmd args
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
delquota [-n|-b] path
get [-s] [-w] path
getAcl [-s] path
getAllChildrenNumber path
getEphemerals path
history
listquota path
ls [-s] [-w] [-R] path
ls2 path [watch]
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]
rmr path
set [-s] [-v version] path data
setAcl [-s] [-v version] [-R] path acl
setquota -n|-b val path
stat [-w] path
sync path
帮助列表中命令较多,我们只需要掌握一些较为常用的 ZooKeeper 命令即可。
查看某个路径的节点
[zkshell: 8] ls /
[zookeeper]
创建节点
create 路径 数据
[zkshell: 9] create /zk_test my_data
Created /zk_test
创建永久节点:
create /zk_test my_data
创建永久有序节点:
create -s /zk_test my_data
查看节点详情
[zkshell: 12] get /zk_test
my_data
cZxid = 5
ctime = Fri Jun 05 13:57:06 PDT 2009
mZxid = 5
mtime = Fri Jun 05 13:57:06 PDT 2009
pZxid = 5
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0
dataLength = 7
numChildren = 0
修改节点值
[zkshell: 14] set /zk_test junk
cZxid = 5
ctime = Fri Jun 05 13:57:06 PDT 2009
mZxid = 6
mtime = Fri Jun 05 14:01:52 PDT 2009
pZxid = 5
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0
dataLength = 4
numChildren = 0
[zkshell: 15] get /zk_test
junk
cZxid = 5
ctime = Fri Jun 05 13:57:06 PDT 2009
mZxid = 6
mtime = Fri Jun 05 14:01:52 PDT 2009
pZxid = 5
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0
dataLength = 4
numChildren = 0
删除节点值
[zkshell: 16] delete /zk_test
[zkshell: 17] ls /
[zookeeper]
[zkshell: 18]
Java 操作 ZooKeeper
本节为拓展内容,因篇幅有限,不做详细介绍,同学们可看推荐链接。
加入依赖
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.5.5</version>
</dependency>
使用 Demo
推荐阅读:https://segmentfault.com/a/1190000021320564
ZooKeeper 常见面试题
1. ZooKeeper 是什么?
ZooKeeper 是一个基于 Java 语言开发的,开源的,可靠的,服务于其他分布式服务产品的一款服务注册与发现的工具。属于 Apache 基金会。
2. ZooKeeper 有那些应用场景?
服务注册与发现(注册中心)
3. 你的 ZooKeeper 分布式锁实现思路是什么?
当应用获取锁时,在 ZooKeeper 中创建一个临时带序号节点,判断该节点是否时序号最小的临时节点,如果是则成功获取锁。如果不是则监听前一个节点是否释放,直到自己创建的节点成为带序号的最小节点,则获取到锁。释放锁时,删除该临时节点即可。
4. 什么是 ZAB 协议?
ZAB 协议是特别为 ZooKeeper 设计的支持崩溃回复的原子广播协议。
协议内容包含两种模式:
- 消息广播
- 崩溃恢复
ZooKeeper 节点类型有那些?
- 持久节点
- 持久有序节点
- 临时节点
- 临时有序节点
5. ZooKeeper 下 Server 工作状态有哪些?
服务器具有四种状态,分别是 LOOKING、FOLLOWING、LEADING、OBSERVING。
- LOOKING:寻找 Leader 状态。当服务器处于该状态时,它会认为当前集群中没有 Leader,因此需要进入 Leader 选举状态。
- FOLLOWING:跟随者状态。表明当前服务器角色是 Follower。
- LEADING:领导者状态。表明当前服务器角色是 Leader。
- OBSERVING:观察者状态。表明当前服务器角色是 Observer。
相关推荐
- 删库之后不要着急跑路,教你神不知鬼不觉找回数据
-
在工作中,我们误删数据或者数据库,我们一定需要跑路吗?我看未必,程序员一定要学会自救,神不知鬼不觉的将数据找回。在mysql数据库中,我们知道binlog日志记录了我们对数据库的所有操作,所以...
- 数据库告警不可用,增删改受阻(数据库限制删除)
-
前言:昨晚,突然出现服务不可用告警,查看日志上线报文入库到数据库很慢并受阻,出现数据不同步问题。排查问题查看发现服务都是在执行update、insert这些DML命令的时候,报的数据库执行超时。经过一...
- Binlog实现MySQL复制,5个关键步骤,务必掌握!
-
复制是MySQL最重要的功能之一,MySQL集群的高可用、负载均衡和读写分离都是基于复制来实现的。Binlog就是实现主从复制的关键,主数据库将修改操作记录到Binlog中,从数据库通过解...
- MySQL数据实时增量同步到Elasticsearch
-
Mysql到Elasticsearch的数据同步,一般用ETL来实现,但性能并不理想,目前大部分的ETL是定时查询Mysql数据库有没有新增数据或者修改数据,如果数据量小影响不大,但如果几百万上千万的...
- MySQL 数据库恢复:如何执行时间点恢复(PITR)以挽救受损数据?
-
天津鸿萌科贸发展有限公司从事数据安全服务二十余年,致力于为各领域客户提供专业的数据恢复、数据备份、数据取证、数据迁移、网络安全、数据清除等解决方案,并针对企业面临的数据安全风险,提供专业的相关数据安全...
- 阿里面试:MySQL Binlog有哪些格式?底层原理?优缺点?
-
binlog的格式也有三种:STATEMENT、ROW、MIXED,下面我详解binlog三种模式@mikechenStatement模式Statement模式:是基于SQL语句的复制(statem...
- 快速带你读懂MySQL的binlog写入机制
-
深入讲解MySQL中的重要日志binlog的写入机制以及影响IO性能的关键配置,并且介绍了如何利用binlog去恢复数据,保证MySQL的可靠性。Q:binlog写入时机binlog的写入逻辑并...
- MySQL 误删除数据恢复全攻略:基于 Binlog 的实战指南
-
在MySQL的世界里,二进制日志(Binlog)就是我们的"时光机"。它默默记录着数据库的每一个重要变更,就像一位忠实的史官,为我们在数据灾难中提供最后的救命稻草。本文将带您深入掌握如...
- 一文了解MySQL Binlog(一文了解肝脏有益和有害的食物)
-
MySQL的Binlog日志是一种二进制格式的日志,Binlog记录所有的DDL和DML语句(除了数据查询语句SELECT、SHOW等),以Event的形式记录,同时记录语句执行时...
- 数据丢失?别慌!MySQL备份恢复攻略
-
想象一下,某个晴朗的午后,你正享受着咖啡,突然接到紧急电话:你的网站或APP彻底挂了!系统崩溃,界面全白。虽然心头一紧,但你或许还能安慰自己:系统崩溃只是暂停服务,数据还在,修复修复就好了。然而,如果...
- Mysql中的bin log、redo log、undo log的区别
-
最近在整理面试题,在看mvcc的时候看到了undolog,今天索性把这三个log都记录一遍。MySQL的逻辑架构说之前先说一下MySQL的基本架构,MySQL主要分为两层:Server层和存储引...
- binlog日志定时清理(binlog清理规则)
-
binlog日志binlog是MySQL数据库的一种日志文件,用于记录所有对数据的修改操作。binlog全称为binarylog,它以二进制格式记录MySQL服务器上所有的修改操作,包括对哪个数据库...
- 茶水间炸锅了!菜鸟误删用户表,运维老张的MySQL救命三招!
-
(公司茶水间,运维老张、开发小王和新人小李围着咖啡机)小李:(紧张兮兮)张哥!我...我好像把测试库的用户表删了!下午演示咋办啊?老张:(淡定喝咖啡)慌啥?昨晚的备份是吃干饭的?走,教你恢复!一、基础...
- 解决运维痛点,提高运维安全性-雷池 SafeLine WAF新功能身份认证
-
雷池介绍使用雷池SafeLineWAF已经两年多了,在1.5.x版本时就已经开始测试使用,并在推出LTS版本后转入LTS分支。近期雷池SafeLineWAF重点更新了身份认证功能,并提供了SS...
- 【Docker 新手入门指南】第十五章:常见故障排除
-
一、前期准备:收集关键信息在排查问题前,建议先获取以下系统数据,便于精准定位故障:1.系统基础信息#查看Docker版本(确认是否为最新稳定版)dockerversion#查看...
你 发表评论:
欢迎- 一周热门
-
-
极空间如何无损移机,新Z4 Pro又有哪些升级?极空间Z4 Pro深度体验
-
UOS服务器操作系统防火墙设置(uos20关闭防火墙)
-
如何修复用户配置文件服务在 WINDOWS 上登录失败的问题
-
手机如何设置与显示准确时间的详细指南
-
如何在安装前及安装后修改黑群晖的Mac地址和Sn系列号
-
日本海上自卫队的军衔制度(日本海上自卫队的军衔制度是什么)
-
爱折腾的特斯拉车主必看!手把手教你TESLAMATE的备份和恢复
-
10个免费文件中转服务站,分享文件简单方便,你知道几个?
-
NAS:DS video/DS file/DS photo等群晖移动端APP远程访问的教程
-
FANUC 0i-TF数据备份方法(fanuc系统备份教程)
-
- 最近发表
- 标签列表
-
- linux 查询端口号 (58)
- docker映射容器目录到宿主机 (66)
- 杀端口 (60)
- yum更换阿里源 (62)
- internet explorer 增强的安全配置已启用 (65)
- linux自动挂载 (56)
- 禁用selinux (55)
- sysv-rc-conf (69)
- ubuntu防火墙状态查看 (64)
- windows server 2022激活密钥 (56)
- 无法与服务器建立安全连接是什么意思 (74)
- 443/80端口被占用怎么解决 (56)
- ping无法访问目标主机怎么解决 (58)
- fdatasync (59)
- 405 not allowed (56)
- 免备案虚拟主机zxhost (55)
- linux根据pid查看进程 (60)
- dhcp工具 (62)
- mysql 1045 (57)
- 宝塔远程工具 (56)
- ssh服务器拒绝了密码 请再试一次 (56)
- ubuntu卸载docker (56)
- linux查看nginx状态 (63)
- tomcat 乱码 (76)
- 2008r2激活序列号 (65)