1. 使用Keepalived 实现Nginx的高可用
sudo apt update
sudo apt install nginx keepalived -y配置 Nginx
确保 Nginx 在两台服务器上都正常运行。你可以根据需要配置 Nginx 的站点配置文件。
配置 Keepalived
主服务器(Master)的 Keepalived 配置
编辑 /etc/keepalived/keepalived.conf 文件,添加以下内容:
2. 搭建NFS服务,并使用另一台机器成功挂载NFS
vrrp_script chk_nginx {
script "killall -0 nginx" # 检查 Nginx 是否正在运行
interval 2 # 每2秒检查一次
weight 2 # 如果脚本失败,优先级减少2
}
vrrp_instance VI_1 {
state MASTER # 设置为主服务器
interface eth0 # 绑定虚拟 IP 的网络接口
virtual_router_id 51 # 虚拟路由标识符,主备必须相同
priority 100 # 优先级,主服务器比备份服务器高
advert_int 1 # VRRP 广播间隔时间(秒)
authentication {
auth_type PASS # 认证类型
auth_pass 1111 # 认证密码(主备必须相同)
}
virtual_ipaddress {
192.168.1.100 # 虚拟 IP 地址
}
track_script {
chk_nginx # 使用上面定义的脚本检查 Nginx 状态
}
}备份服务器(Backup)的 Keepalived 配置
同样地,编辑 /etc/keepalived/keepalived.conf 文件,但将 state 和 priority 改为以下值:
vrrp_script chk_nginx {
script "killall -0 nginx"
interval 2
weight 2
}
vrrp_instance VI_1 {
state BACKUP # 设置为备份服务器
interface eth0
virtual_router_id 51 # 必须与主服务器相同
priority 90 # 优先级低于主服务器
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.100
}
track_script {
chk_nginx
}
}启动服务
在两台服务器上启动并启用 Nginx 和 Keepalived 服务:
sudo systemctl enable --now nginx
sudo systemctl enable --now keepalived3. 搭建Samba服务,并使用Windows系统上传下载文件
一、安装 Samba 服务
sudo apt update
sudo apt install samba -y二、配置 Samba 共享目录
创建一个用于共享的目录(例如 /srv/samba/share):
sudo mkdir -p /srv/samba/share设置目录权限:
sudo chmod -R 0777 /srv/samba/share编辑 Samba 配置文件 /etc/samba/smb.conf,在文件末尾添加如下内容:
[Shared]
path = /srv/samba/share
available = yes
valid users = nobody
read only = no
browsable = yes
public = yes
writable = yes三、设置 Samba 用户权限
为了允许匿名访问(适用于测试环境),可以使用 nobody 用户:
sudo smbpasswd -a nobody输入密码后,编辑 /etc/samba/smb.conf 文件,在 [global] 段中添加以下内容以启用匿名访问:
map to guest = Bad User
guest account = nobody四、重启 Samba 服务
sudo systemctl restart smbd六、从 Windows 访问 Samba 共享目录
打开 Windows 文件资源管理器。
在地址栏输入 Samba 服务器的 IP 地址(例如
\\192.168.1.x),按回车。如果提示输入用户名和密码,输入你在 Samba 中设置的用户名(如
nobody)和密码。成功连接后,你可以像操作本地文件夹一样上传、下载或管理文件。
4. 搭建FTP服务,并上传下载文件
以下是搭建 FTP 服务并在 Linux 上实现上传下载文件的步骤(以常用的 vsftpd 为例)。
第一步:安装 vsftpd
sudo apt update
sudo apt install vsftpd -y第二步:启动并设置开机自启 vsftpd
sudo systemctl start vsftpd
sudo systemctl enable vsftpd第三步:配置 vsftpd
编辑配置文件 /etc/vsftpd.conf:
sudo nano /etc/vsftpd.conf推荐修改以下关键配置项:
anonymous_enable=NO # 禁用匿名访问(更安全)
local_enable=YES # 允许本地用户登录
write_enable=YES # 允许写入权限
local_umask=022 # 上传文件的默认权限掩码
dirmessage_enable=YES # 启用目录消息
xferlog_enable=YES # 记录上传/下载日志
connect_from_port_20=YES # 使用端口20进行数据连接
chroot_local_user=YES # 锁定用户在其主目录中
allow_writeable_chroot=YES # 允许 chroot 用户写入其主目录(适用于新版 vsftpd)
listen=NO # 启用独立模式(若使用 systemd)
listen_ipv6=YES # 支持 IPv6
userlist_enable=YES # 启用用户列表控制
userlist_file=/etc/vsftpd.user_list # 用户白名单文件
userlist_deny=NO # 白名单用户才允许登录第四步:创建 FTP 用户
创建一个专门用于 FTP 的用户(例如 ftpuser):
sudo adduser ftpuser输入密码后,将该用户添加到白名单:
echo "ftpuser" | sudo tee -a /etc/vsftpd.user_list确保用户的主目录具有正确权限:
bash第五步:重启 vsftpd 生效配置
bash第六步:Windows 客户端访问 FTP
方法一:使用资源管理器访问
打开 Windows 文件资源管理器。
在地址栏输入:
ftp://服务器IP地址输入用户名和密码(如
ftpuser和你设置的密码)。成功登录后即可上传、下载、删除文件。
方法二:使用 FTP 客户端(如 FileZilla)
下载安装 FileZilla
填写主机 IP、用户名、密码、端口(默认 21),点击“快速连接”
左侧是本地文件,右侧是远程服务器文件,双击即可上传/下载
5. 什么是分布式系统设计中的CAP定理,C、A、P分别表示什么。
在分布式系统设计中,CAP 定理(又称 Brewer’s Theorem)是一个重要的理论基础,由计算机科学家 Eric Brewer 在 2000 年提出,并于 2002 年被 MIT 的 Seth Gilbert 和 Nancy Lynch 证明。
CAP 定理的定义:
在一个分布式系统中,当发生网络分区(Network Partition)时,Consistency(一致性)、Availability(可用性)、Partition Tolerance(分区容忍性)这三者最多只能同时满足两个,无法三者兼顾。
CAP 各字母含义:
一致性(C):
数据在多个副本上保持一致。
当一个节点更新了数据后,其他节点立刻可以看到这个更新。
类似于数据库中的 ACID 特性中的“一致性”。
可用性(A):
即使系统中部分节点不可用,整体服务仍能正常响应客户端请求。
响应可以不是最新的数据,但必须是有效的响应(不能无限等待或报错)。
分区容忍性(P):
分布式系统中不同节点可能部署在不同的网络环境中,网络故障可能导致节点间通信失败。
系统必须在这种情况下继续提供服务(至少一部分功能)。
6. CAP为什么不能全部实现?实际中,必须要实现CAP中的哪一项
CAP 定理指出,在一个分布式系统中,当发生网络分区(Network Partition)时,Consistency(一致性)、Availability(可用性)、Partition Tolerance(分区容忍性)这三项最多只能满足两项。
原因在于:
当 网络分区发生时,系统中的某些节点无法与其他节点通信。这时你必须做出选择:
如果你优先保证 一致性(C):
系统在发现节点之间无法同步数据时,会拒绝部分请求以避免返回过期或不一致的数据。这就牺牲了 可用性(A)。如果你优先保证 可用性(A):
即使节点之间无法通信,系统仍然接受请求并尝试返回结果(即使可能是旧数据)。这就牺牲了 一致性(C)。分区容忍性(P)是必须支持的:
因为现代分布式系统通常部署在多个节点甚至多个数据中心,网络故障不可避免。因此系统必须能够在网络分区的情况下继续运行。
实际中必须实现的是哪一项?
在实际的分布式系统设计中,P(Partition Tolerance)是必须实现的。
因为:
网络故障是常态,不是异常。
分布式系统的本质就是多节点协作,节点之间可能位于不同机房、区域,网络延迟或中断不可避免。
如果不处理网络分区,系统在出现故障时可能会完全不可用。
所以:
💡 一旦选择了 P(分区容忍),你就必须在 C 和 A 之间做出权衡。
7. 什么是zookeeper,适合用于哪些场景,其实现了CAP中的哪两项?
什么是 ZooKeeper?
ZooKeeper 是一个开源的分布式协调服务,由 Apache 开发,主要用于管理和协调分布式系统中的多个节点。它提供了一个高可用、高性能、一致性的分布式协调框架。
ZooKeeper 的核心是一个层次化的文件系统风格命名空间,数据保存在内存中,因此具有很高的吞吐量和低延迟。
ZooKeeper 的主要功能
统一命名服务(Naming)
配置管理(Configuration Management)
集群成员管理(Group Membership)
分布式锁(Distributed Locking)
Leader 选举(Leader Election)
通知机制(Watchers)
CAP 理论中的选择:ZooKeeper 实现了哪两项?
ZooKeeper 是典型的 CP 系统,即:
Consistency(一致性) 和
Partition Tolerance(分区容忍性)
不保证 Availability(可用性)
当网络分区发生时,如果一个节点无法与大多数节点通信(即无法形成法定数量 quorum),它将拒绝服务请求以确保数据一致性。
例如:
如果你写入一个节点,但该节点与其他节点失联,ZooKeeper 将拒绝写入操作。
这样可以保证所有客户端看到的数据是一致的。
架构简述
ZooKeeper 集群通常由奇数个节点组成(如 3、5、7),采用 ZAB 协议(ZooKeeper Atomic Broadcast) 来实现节点间的一致性。
Leader 节点:负责处理所有的写请求。
Follower 节点:转发写请求给 Leader,处理读请求。
所有写操作都必须经过 Leader,然后广播给 Follower,确保数据一致性。
8. zookeeper集群推荐使用几个节点,为什么
ZooKeeper 集群推荐使用奇数个节点,常见的配置是:
3 节点、5 节点 或 7 节点
为什么推荐使用奇数个节点?
ZooKeeper 使用 ZAB 协议(ZooKeeper Atomic Broadcast) 来保证集群中数据的一致性,并通过 法定数量(Quorum)机制 来决定是否可以进行写操作。
Quorum 的计算方式:
Quorum = N / 2 + 1
其中N是集群中的节点总数。
9. zookeeper是使用什么语言开发的,运行的话依赖什么环境
ZooKeeper 是使用 Java 语言开发的。
它由 Apache 软件基金会维护,源码托管在 Apache Subversion 和 GitHub 上,是一个基于 JVM 的应用程序。ZooKeeper 是基于 Java 开发的,因此必须安装 Java 运行环境(JRE)或 Java 开发工具包(JDK)。
10. zookeeper默认使用哪些端口,各自有什么用途,搭建一个3节点的zk集群
ZooKeeper 默认使用的端口及其用途
ZooKeeper 在运行时使用多个端口来处理不同的通信需求,以下是默认使用的三个主要端口:
搭建一个 3 节点的 ZooKeeper 集群
以下是在 Linux 环境下搭建一个 3 节点 ZooKeeper 集群的步骤。
步骤 1:安装 Java 环境
确保每台服务器上安装了 JDK 8 或更高版本:
java -version如果没有安装,可以使用如下命令安装 OpenJDK:
sudo apt update && sudo apt install openjdk-11-jdk -y步骤 2:下载并解压 ZooKeeper
在每台节点上执行:
wget https://downloads.apache.org/zookeeper/zookeeper-3.8.4/apache-zookeeper-3.8.4-bin.tar.gz
tar -zxvf apache-zookeeper-3.8.4-bin.tar.gz
mv apache-zookeeper-3.8.4-bin zookeeper步骤 3:配置 zoo.cfg
在每台节点上编辑配置文件:
cd zookeeper/conf
cp zoo_sample.cfg zoo.cfg
nano zoo.cfg修改或添加以下内容(假设三个节点 IP 分别为 192.168.1.101, 192.168.1.102, 192.168.1.103):
dataDir=/home/user/zookeeper/data
clientPort=2181
initLimit=5
syncLimit=2
server.1=192.168.1.101:2888:3888
server.2=192.168.1.102:2888:3888
server.3=192.168.1.103:2888:3888dataDir:ZooKeeper 存放数据的目录,需要手动创建。clientPort:客户端连接端口(默认 2181)server.x:表示集群节点列表,格式为IP:peerPort:leaderPort
步骤 4:创建 myid 文件
在每台节点的 dataDir 路径下创建 myid 文件,内容为该节点的 ID(对应 server.x 中的 x):
mkdir -p /home/user/zookeeper/data
echo "1" > /home/user/zookeeper/data/myid在 192.168.1.102 上执行:
echo "2" > /home/user/zookeeper/data/myid在 192.168.1.103 上执行:
echo "3" > /home/user/zookeeper/data/myid步骤 5:启动 ZooKeeper 服务
在每台节点上执行:
cd zookeeper/bin
./zkServer.sh start查看状态:
./zkServer.sh status步骤 6:客户端连接测试
在任意节点执行:
./zkCli.sh -server 127.0.0.1:2181进入命令行后,可执行如:
create /test "hello"
get /test
11. zk的常用版本有哪些?稳定分支是哪个版本
Apache ZooKeeper 有几个主要版本分支,每个版本在功能、性能和稳定性方面都有所不同。以下是常见的 ZooKeeper 版本分类 和 当前推荐的稳定版本。
一、ZooKeeper 常用版本(发布版本)
二、当前推荐使用的稳定版本
ZooKeeper 3.8.x 是目前官方推荐的稳定版本(截至 2025 年)
12. znode是什么,每个节点都可以拥有子节点吗?每个节点都可以存储数据吗?
13. zk上一般都会存储什么数据,推荐存储文本还是json或者是ymal格式内容,不适合存储什么数据
在 ZooKeeper(简称 zk)中,ZNode 是存储数据的基本单元。由于其设计特点(如轻量级、强一致性、低延迟),ZooKeeper 并不适合存储大量数据或频繁更新的内容。以下是 ZooKeeper 中适合和不适合存储的数据类型,以及 推荐的存储格式。
一、ZooKeeper 上一般存储什么数据?
ZooKeeper 通常用于存储 分布式系统中的元数据、状态信息和协调信息,例如:
二、推荐的存储格式
ZooKeeper 节点(ZNode)中存储的是 二进制数据(byte[]),可以是任意格式的字符串或编码后的数据。常见的推荐格式如下:
推荐首选 JSON,因为:
易读性强
多语言支持好
适合结构化数据
易于调试和日志记录
三、不适合存储的数据类型
尽管 ZooKeeper 支持存储数据,但并不适合以下类型的存储:
14. 什么是临时节点,什么是持久节点,各自有什么使用场景
一、临时节点(Ephemeral Node)
定义:
临时节点是与客户端会话(Session)绑定的节点。当客户端与 ZooKeeper 服务器的连接断开(或会话超时),该节点会自动被删除。
特点:
二、持久节点(Persistent Node)
定义:
持久节点是 ZooKeeper 中长期存在的节点,除非客户端显式删除,否则不会自动消失。
特点:
15. 什么是有序节点,什么是无需节点,有什么使用场景
一、什么是有序节点(Sequential Node)?
有序节点是一种自动编号的节点。当你创建一个有序节点时,ZooKeeper 会在你指定的节点名称后面自动追加一个单调递增的序号。
这个序号是 全局唯一且递增的,用于确保节点名称的唯一性。
二、什么是无序节点(Non-Sequential Node)?
无序节点就是不带自动编号的节点,也就是默认的节点类型。你需要手动指定节点名称,并且如果节点已存在,创建会失败。
使用场景对比
16. 在上面搭建的集群中创建持久节点临时节点和有序节点,并存储一些数据。
一、连接到 ZooKeeper 集群
你可以连接到任意一个节点:
./zkCli.sh -server 127.0.0.1:2181127.0.0.1可换成机器ip
二、创建各种类型的 ZNode 并存储数据
1. 创建持久节点(Persistent Node)
create /persistent_node "This is persistent data"节点路径:
/persistent_node数据内容:
"This is persistent data"
2. 创建临时节点(Ephemeral Node)
create -e /ephemeral_node "Temporary data, deleted when session ends"如果客户端断开连接,这个节点会被自动删除。
不可以有子节点。
3. 创建持久有序节点(Persistent Sequential Node)
create -s /sequential_node "Sequential data - 1"每次创建都会自动生成唯一递增序号。
适合用于任务队列、分布式锁等场景。
4. 创建临时有序节点(Ephemeral Sequential Node)
create -e -s /ephemeral_sequential_node "Ephemeral sequential data"
三、查看节点和数据
查看节点列表:
ls /查看节点数据:
get /persistent_node
17. 有哪些与zk类似的服务,哪些服务可以替代zk
18. 我的服务上了k8s,是不是可以不再使用zk了?
可以,Kubernetes 自身已经提供了许多 原本由 ZooKeeper 实现的功能,例如: