feat: 提交

master
old-tom 3 weeks ago
parent 8165ebbcf0
commit d7f1bc48da

@ -0,0 +1,192 @@
这个问题分为两个部分:
1. **Linux 端**:如何正确地安装、配置并启动 NFS 服务。
2. **Windows 端**:如何解决“无法创建映射网络驱动器”的常见问题。
我们将先确保 Linux 服务端配置无误,然后再排查 Windows 客户端的问题。
---
### **第一部分:在 Linux 上开启和配置 NFS 服务**
本教程以 CentOS/RHEL 和 Debian/Ubuntu 这两大主流 Linux 发行版为例。
#### **步骤 1安装 NFS 服务器软件包**
* **在 CentOS / RHEL / Fedora 上:**
```bash
sudo yum install -y nfs-utils
```
* **在 Debian / Ubuntu 上:**
```bash
sudo apt-get update
sudo apt-get install -y nfs-kernel-server
```
#### **步骤 2创建要共享的目录**
假设我们要共享 `/data/nfs-share` 这个目录。
1. 创建目录:
```bash
sudo mkdir -p /data/nfs-share
```
2. **设置正确的权限**。这是一个关键步骤。为了让 Windows 客户端能够读写,我们需要确保 NFS 服务有权限操作这个目录。最简单的方式是将其所有权交给 `nfsnobody` 用户和组,这是一个专门为 NFS 匿名访问设计的用户。
```bash
sudo chown -R nfsnobody:nfsnobody /data/nfs-share
# 也可以设置宽松的权限,但这在生产环境中需谨慎
sudo chmod 777 /data/nfs-share
```
#### **步骤 3配置 NFS 共享**
NFS 的共享配置在 `/etc/exports` 文件中。
1. 编辑该文件:
```bash
sudo vim /etc/exports
```
2. 在文件末尾添加一行来定义共享规则。格式为:
`要共享的目录 客户端IP或网段(选项1,选项2,...)`
**示例配置:**
* **允许特定 IP (例如 `192.168.1.100`) 的 Windows 客户端读写:**
```
/data/nfs-share 192.168.1.100(rw,sync,no_root_squash)
```
* **允许整个 `192.168.1.0/24` 网段的客户端读写(更常用):**
```
/data/nfs-share 192.168.1.0/24(rw,sync,no_root_squash)
```
**常用选项解释:**
* `rw`: (Read/Write) 允许读写。如果是只读,用 `ro`
* `sync`: 数据同步写入磁盘。更安全,但性能稍低。`async` 是异步写入。
* `no_root_squash`: **这是连接 Windows 客户端时非常重要的一个选项**。它允许客户端以 root 用户身份写入文件时,在服务端也保留 root 身份。如果不加这个选项,客户端的 root 会被映射成服务端的匿名用户(`nfsnobody`),可能导致权限问题。
* `all_squash`: 将所有客户端用户都映射为匿名用户。
* `anonuid``anongid`: 与 `all_squash` 配合,指定映射到的匿名用户的 UID 和 GID。
#### **步骤 4启动并设置开机自启 NFS 服务**
* **在 CentOS / RHEL / Fedora 上:**
NFS 依赖 `rpcbind` (或 `portmap`) 服务,需要先启动它。
```bash
sudo systemctl enable rpcbind
sudo systemctl enable nfs-server
sudo systemctl start rpcbind
sudo systemctl start nfs-server
```
* **在 Debian / Ubuntu 上:**
服务通常命名为 `nfs-kernel-server`
```bash
sudo systemctl enable nfs-kernel-server
sudo systemctl start nfs-kernel-server
```
#### **步骤 5使配置生效并检查防火墙**
1. **使 `/etc/exports` 的配置生效:**
```bash
sudo exportfs -a
# 检查当前共享状态
sudo exportfs -v
```
2. **配置防火墙**。NFS 服务需要开放 `nfs` (2049端口), `mountd`, 和 `rpc-bind` 端口。
* **使用 `firewalld` (CentOS/RHEL 默认)**
```bash
sudo firewall-cmd --permanent --add-service=nfs
sudo firewall-cmd --permanent --add-service=mountd
sudo firewall-cmd --permanent --add-service=rpc-bind
sudo firewall-cmd --reload
```
* **使用 `ufw` (Ubuntu 默认)**
```bash
# 允许特定 IP 或网段访问
sudo ufw allow from 192.168.1.0/24 to any port nfs
sudo ufw enable
```
至此,您的 Linux NFS 服务器已经配置完毕并运行。
---
### **第二部分:在 Windows 上排查“无法创建映射网络驱动器”问题**
在 Windows 上连接 NFS 失败,通常有以下几个原因:
#### **1. Windows NFS 客户端功能未安装**
这是最常见的原因。Windows 默认不安装 NFS 客户端。
* **操作方法**
1. 打开 “控制面板” -> “程序” -> “启用或关闭 Windows 功能”。
2. 在列表中找到并展开 **“NFS 服务”**。
3. 勾选 **“NFS 客户端”**。
4. 点击“确定”进行安装,可能需要重启电脑。
#### **2. 网络连接或防火墙问题**
* **确认网络连通性**:在 Windows 的命令提示符(cmd)中,`ping <Linux服务器IP>`,确保可以 ping 通。
* **Linux 防火墙**:请再次确认您已按照**第一部分步骤 5**正确开放了 NFS 相关服务的端口。
* **Windows 防火墙**:尝试暂时关闭 Windows 防火墙,看是否能连接成功。如果可以,说明需要为 NFS 连接在 Windows 防火墙中添加入站/出站规则。
#### **3. 权限和用户映射问题**
这是最棘手的问题。Windows 的用户体系 (SID) 和 Linux 的用户体系 (UID/GID) 完全不同。
* **匿名访问认证**:当 Windows 以普通用户身份连接时NFS 服务端通常会将其视为匿名用户。
* **解决方案**
1. 确保您在 Linux 端的 `/etc/exports` 配置中使用了 `all_squash`,并将权限赋予了匿名用户。
2. **修改 Windows 注册表以匹配匿名 UID/GID**。这是解决权限问题的关键。
a. 按 `Win + R`,输入 `regedit` 打开注册表编辑器。
b. 导航到 `HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ClientForNFS\CurrentVersion\Default`
c. 在右侧窗格中,右键新建两个 `DWORD (32 位) 值`
* `AnonymousUid`
* `AnonymousGid`
d. 双击这两个新建的值,将它们的**基数**改为**十进制**,然后输入 Linux 端 `nfsnobody` 用户的 UID 和 GID。
* **如何查找 `nfsnobody` 的 UID/GID** 在 Linux 上执行:
```bash
id nfsnobody
```
输出可能像这样: `uid=65534(nfsnobody) gid=65534(nfsnobody) ...`
* 那么就在 Windows 注册表中将 `AnonymousUid``AnonymousGid` 的值都设置为 `65534`
e. **重启 Windows 电脑**或**重启 NFS 客户端服务**(在“服务”中找到 `Client for NFS` 右键重启)。
#### **4. 映射驱动器时的语法错误**
* **正确语法**:在“映射网络驱动器”窗口中,路径格式应为:
`\\<Linux服务器IP>\<Linux共享目录的绝对路径>`
**注意**:路径中的斜杠是**反斜杠 `\`**。
* **示例**
`\\192.168.1.50\/data/nfs-share`
* **使用命令行 `mount`**
打开**管理员权限**的命令提示符或 PowerShell。
```cmd
mount \\<Linux服务器IP>\<Linux共享目录> <盘符>:
```
**示例:**
```cmd
mount \\192.168.1.50\data\nfs-share Z:
```
使用命令行通常能看到更详细的错误提示,例如 `Network Error - 53` (找不到网络路径) 或 `Network Error - 67` (找不到网络名) 等,有助于进一步排查。
### **排查流程总结**
1. **先搞定 Linux 端**:安装 -> 创建目录 -> 设置权限 -> 配置 `/etc/exports` -> 启动服务 -> 配置防火墙。
2. **再处理 Windows 端**
* 确认 **NFS 客户端**已安装。
* 确认**网络可达** (`ping`)。
* **关键**:修改**注册表**中的 `AnonymousUid``AnonymousGid`,使其与 Linux 端的 `nfsnobody` 用户匹配。
* **重启** Windows 的 NFS 客户端服务或电脑。
* 使用**正确的语法** (`\\IP\path`) 进行映射。
遵循这个流程,绝大多数 Windows 连接 Linux NFS 的问题都可以得到解决。

@ -0,0 +1,43 @@
当您查询表 `ods_ms_crjry`Doris 需要读取一个或多个数据分片Tablet。对于其中一个 ID 为 **`1173992`** 的分片Doris 找不到任何一个“**健康且版本最新**”的副本Replica来执行查询。
Tablet `1173992` 的所有副本都因为版本落后或损坏,无法满足查询所需的数据版本要求,导致查询失败。
### 一、原因
1. **数据导入失败**:最常见的原因。一个导入任务(如 Stream Load, Broker Load在执行过程中部分失败。FEFrontend已经将元数据中的目标版本更新了但某些 BEBackend节点上的副本未能成功应用这次数据变更。
2. **BE 节点问题**:某个 BE 节点可能存在磁盘问题、网络问题或进程异常,导致它无法完成数据同步或 Compaction数据合并任务。尽管 `backendAlive=true` 表示心跳正常,但它可能无法正常工作。
3. **Compaction 失败**:后台的数据合并任务失败,也可能导致副本版本不一致。
4. **Schema Change 失败**:执行 `ALTER TABLE` 操作失败,也可能使表处于不一致的状态。
### 二、解决方案
#### 1. 查看副本状态
首先,使用管理员命令查看这个表所有副本的状态,重点关注那些状态不是 `OK` 的副本。
```sql
ADMIN SHOW REPLICA STATUS FROM ods_ms_crjry WHERE STATUS != 'OK';
```
执行这个命令,你会看到所有有问题的副本列表。重点关注 `Status` 列,它可能会显示 `VERSION_ERROR`、`SCHEMA_ERROR` 或其他错误状态,这能直接告诉你问题所在。
#### 2. 检查 BE 节点日志
根据上一步找到的有问题的副本所在的 `BackendId`,去对应的 BE 节点的日志目录(通常是 `be/log/`)下查找线索。
- **日志文件**: `be.WARNING` 或 `be.out`。
- **搜索关键词**: 使用 `grep` 命令搜索出问题的 **Tablet ID `1173992`** 和 **失败的版本号 `325968`**
日志中通常会记录失败的具体原因,例如 "disk is full", "file not found", "data quality error" 等。
#### 3. 尝试手动修复副本
如果确定某个副本确实损坏了,并且**确保该 Tablet 还有其他健康的副本**,你可以尝试手动将这个损坏的副本设置为 `bad`
```text
-- 假设 backendId=116608 上的副本有问题
ADMIN SET REPLICA STATUS PROPERTIES("tablet_id" = "1173992", "backend_id" = "116608", "status" = "bad");
```
执行后Doris 的后台修复机制会检测到这个坏副本,并尝试从一个健康的副本克隆一个新的副本过来,以恢复副本数。
**注意:** 如果一个 Tablet 的所有副本都损坏了,这个方法将无效,并且可能会导致数据丢失。
4.如果以上方法都无法解决,或者所有副本都已损坏,最可靠的方法是:
1. **删除有问题的数据**:如果表是分区的,可以考虑只删除有问题的分区。如果无法定位到具体分区,可能需要删除整张表(就像你编辑器里写的那样 `drop table ods_ms_crjry;`)。
2. **重新导入数据**:从你的数据源重新导入这部分数据。
如果连 `DROP TABLE` 都失败,可以尝试强制删除:`DROP TABLE ods_ms_crjry FORCE;`
Loading…
Cancel
Save