diff --git a/work常用/linux/windows 配置NFS客户端并连接.md b/work常用/linux/windows 配置NFS客户端并连接.md new file mode 100644 index 0000000..157db93 --- /dev/null +++ b/work常用/linux/windows 配置NFS客户端并连接.md @@ -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 `,确保可以 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. 映射驱动器时的语法错误** + +* **正确语法**:在“映射网络驱动器”窗口中,路径格式应为: + `\\\` + **注意**:路径中的斜杠是**反斜杠 `\`**。 + +* **示例**: + `\\192.168.1.50\/data/nfs-share` + +* **使用命令行 `mount`**: + 打开**管理员权限**的命令提示符或 PowerShell。 + ```cmd + mount \\\ <盘符>: + ``` + **示例:** + ```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 的问题都可以得到解决。 \ No newline at end of file diff --git a/问题排查/doris/Failed to get scan range, no queryable replica found in tablet (副本之间版本号不一致).md b/问题排查/doris/Failed to get scan range, no queryable replica found in tablet (副本之间版本号不一致).md new file mode 100644 index 0000000..fe0c69d --- /dev/null +++ b/问题排查/doris/Failed to get scan range, no queryable replica found in tablet (副本之间版本号不一致).md @@ -0,0 +1,43 @@ + +当您查询表 `ods_ms_crjry` 时,Doris 需要读取一个或多个数据分片(Tablet)。对于其中一个 ID 为 **`1173992`** 的分片,Doris 找不到任何一个“**健康且版本最新**”的副本(Replica)来执行查询。 +Tablet `1173992` 的所有副本都因为版本落后或损坏,无法满足查询所需的数据版本要求,导致查询失败。 + +### 一、原因 +1. **数据导入失败**:最常见的原因。一个导入任务(如 Stream Load, Broker Load)在执行过程中部分失败。FE(Frontend)已经将元数据中的目标版本更新了,但某些 BE(Backend)节点上的副本未能成功应用这次数据变更。 +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;` +