> For the complete documentation index, see [llms.txt](https://docs.verge.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.verge.io/learn-the-platform/zh/mo-kuai-5-cun-chu/01-vsan-architecture.md).

# vSAN 架构与 VergeFS

## VergeFS：集成存储服务

第 1 模块从整体上介绍了 vSAN 概念。本页将更深入介绍内部架构——块是如何进行哈希并分发的，读写如何在系统中流动，以及诸如重复数据删除、加密和快照等功能如何在块级别实现。

## 块级架构

VergeFS 的核心是一个 **块级存储引擎**。写入 vSAN 的每一份数据——无论是 VM 磁盘、快照、ISO 镜像还是系统元数据——都会被划分为 **数据块**。每个块都会分配一个 **SHA-1 内容哈希** ，作为其在系统中的唯一标识符。这里使用 SHA-1 进行内容寻址和分发，而不是用于加密安全。

这个哈希几乎是所有 vSAN 功能的基础：

* **分发** —— 哈希决定哪些节点存储该块的主副本和冗余副本
* **重复数据删除** —— 相同的块会生成相同的哈希，因此只存储一份副本
* **完整性** —— 哈希用于验证块内容，从而实现持续的位腐检测
* **位置推导** —— 哈希结合 Tier 0 上的各层设备映射，可确定性地推导出每个块的物理位置

### 哈希映射与 Tier 0

vSAN 中的块放置是 **基于 SHA-1 内容哈希推导出来的** ，并与存储在 **0 层** 驱动器（高耐久 NVMe SSD）上的各层设备映射结合：

* 每一层都维护一个 `0.map` （主副本设备映射）和 `1.map` （次副本设备映射）
* SHA-1 哈希被用作确定性放置计算的输入，与这些映射一起进行运算——不存在一个中央表记录“块 X 位于节点 Y、驱动器 Z”
* 引用计数是 **不** 以持久化方式存储在哈希映射中的——它们会通过差异 **vSAN Walk** 在遍历活动哈希时重建
* Tier 0 文件系统索引和各层设备映射就是 Tier 0 实际保存的内容，连同 vSAN 元数据一起

**Tier 0 仅用于元数据。** 它存储 vSAN 文件系统索引和各层设备映射。它是 **不** 一个性能缓存，并且 **不** 不存储工作负载数据。由于 vSAN 元数据操作依赖 Tier 0，因此 Tier 0 驱动器的性能会直接影响整个系统的响应速度。

{% hint style="warning" %}
**Tier 0 仅存储元数据**

Tier 0 不 **不** 充当性能缓存或热数据层。它只存储 vSAN 文件系统索引和各层设备映射。工作负载数据位于 Tier 1–5。Tier 0 始终应使用额定为 3 DWPD 或同等规格的企业级 NVMe 驱动器，并至少保留 30% 的可用空间。
{% endhint %}

### 哈希映射如何工作

下图展示了 VM 数据在 vSAN 块级架构中的流动方式：

![vSAN 哈希映射架构](/files/c8f1b1a8745a5d9f088dffead59b444ff8e8c595)

流程如下：

1. VM 将数据写入其虚拟磁盘
2. VergeFS 将写入拆分为数据块
3. 每个块都会分配一个 SHA-1 内容哈希
4. 针对各层设备映射（存储在 Tier 0 上）的放置计算会选出一个主位置和一个冗余位置
5. 块会同时写入主节点和冗余节点
6. Tier 0 的元数据更新会批量处理并异步应用

## 基于哈希的数据分发

vSAN 使用一个 **基于哈希的分布算法**在所有参与存储的节点之间分发数据块。这确保了 I/O 负载均衡、容错性和高效扩展。

### 写入路径

当 VM 写入数据时：

1. VergeFS 将数据拆分为块，并为每个块计算 SHA-1 内容哈希
2. 针对各层设备映射的放置计算决定一个 **主节点** 和一个 **冗余节点** —— 控制器处于 **不** 数据写入路径中
3. 如果已存在相同的哈希，则该写入会被 **重复数据删除** （不会写入新的数据块；去重是内容寻址的自然结果）
4. 对于新块，会写入两个副本 **同时** 通过 Core Fabric 网络直接发送到目标节点
5. 该写入仅在 **两个副本都确认后才会被应答** —— 从而在 VM 收到写入完成信号之前确保数据持久性
6. Tier 0 上的元数据更新会 **批量处理** 并异步应用，而不是通过中央索引将数据路径串行化

### 读取路径

当 VM 读取数据时：

1. 块的位置由其内容哈希和各层设备映射推导得出
2. 系统 **优先从主副本读取**
3. 如果冗余副本存在于 **与请求该数据的 VM 相同的节点上**，VergeFS 会读取 **本地副本** 以尽量减少网络流量（优先本地读取）
4. 如果主副本缓慢或无响应，VergeFS 会自动 **故障切换到冗余副本** —— 透明进行，不会中断 VM

```mermaid
flowchart TB
    VM["VM 读取请求"] --> LOOKUP["从内容哈希<br/>推导位置"]
    LOOKUP --> LOCAL{"本地副本<br/>可用？"}
    LOCAL -->|是| READLOCAL["读取本地<br/>冗余副本"]
    LOCAL -->|否| PRIMARY["从<br/>主节点读取"]
    PRIMARY --> HEALTHY{"主副本<br/>响应正常？"}
    HEALTHY -->|是| RETURN["将数据返回<br/>给 VM"]
    HEALTHY -->|否| FAILOVER["故障切换到<br/>冗余副本"]
    READLOCAL --> RETURN
    FAILOVER --> RETURN

    style VM fill:#e3f2fd,stroke:#1565c0
    style LOOKUP fill:#fff3e0,stroke:#e65100
    style RETURN fill:#e8f5e9,stroke:#2e7d32
```

### 跨节点分布

数据块分布在 **所有参与存储的节点上** ，并在每一层内进行分布。这种设计提供：

* **均衡性能** —— I/O 负载分散到所有节点，避免热点
* **容错能力** — 没有任何单个节点持有某个数据集的全部副本
* **高效扩展** — 添加节点会自动扩展存储池并触发重新平衡
* **并行 I/O** —— 多个节点同时提供数据，提高整体吞吐量

## 内联全局重复数据删除

VergeOS vSAN 执行 **内联、全局重复数据删除** ，始终开启且无需任何配置。由于每个数据块都由其内容哈希标识，重复数据删除是该架构的自然结果：

1. 当写入新块时，会计算其哈希
2. 如果已存在相同的哈希，则该块就是重复的——去重是内容寻址的自然结果
3. 对于重复块，不会消耗额外存储——现有块只是再次被引用
4. 这在 **内联** （写入路径期间）执行，而不是作为后台任务

重复数据删除可在 **所有 VM、所有层以及所有数据类型之间** 生效。重复数据删除可带来显著空间节省的常见场景包括：

* 运行相同操作系统的多个 VM（共享 OS 块）
* 基于模板的 VM 部署（克隆基础镜像）
* 配置相似的开发环境
* 迭代之间数据变化极小的备份快照

重复数据删除比率可在 VergeOS 存储仪表板中查看，通常会显示各层的实际容量节省。

{% hint style="info" %}
**VMware 桥接**

从 VMware vSAN 迁移而来？VergeOS 重复数据删除始终开启、内联执行，并且在所有层类型（NVMe、SSD、HDD）上全局生效——没有切换开关，也无需单独启用。
{% endhint %}

## 压缩

VergeOS vSAN 不 **不** 会对静态数据进行压缩。与对已存储块应用内联压缩的平台不同，VergeFS 会在磁盘上以原始形式存储数据。

**压缩仅在站点同步复制期间应用** —— 即数据通过网络在 VergeOS 站点之间传输时。在这种情况下，压缩可在 WAN 传输期间减少带宽消耗，而不会影响本地存储性能。

这一设计选择让本地 I/O 路径保持简单且快速。重复数据删除（如上所述）为已存储数据提供了主要的空间效率收益。

## 静态数据 AES-256 加密

vSAN 支持 **静态 AES-256 加密**，在 VergeOS 初始安装期间配置。关键细节：

| 方面           | 详细说明                |
| ------------ | ------------------- |
| **算法**       | AES-256             |
| **配置时间**     | 仅在初始安装期间            |
| **可逆性**      | 安装后不可逆              |
| **范围**       | 所有层上的所有数据都会被透明加密    |
| **密钥存储选项 1** | 插入前两个控制器节点的 USB 驱动器 |
| **密钥存储选项 2** | 每次系统启动时手动输入密码       |

加密对 VM 和应用程序是透明的——它们正常读写数据，而 VergeFS 在块级别处理加密和解密。加密配置是系统级的；你不能只加密某些层而让其他层保持未加密。

要验证加密状态：请导航到 **节点 > 节点 1 > 驱动器**，双击第一个驱动器，并检查 **已加密** 复选框。

## 冗余模型

vSAN 为每个数据块维护多个副本，以防止硬件故障。冗余在 **系统级** 级别配置，并且应用于 **每一层** —— 而不是按 VM 或按存储容器。

| 功能             | N+1（RF2）— 默认 | N+2（RF3） |
| -------------- | ------------ | -------- |
| **数据副本数**      | 2            | 3        |
| **可容忍的同时故障数**  | 1 个节点        | 2 个节点    |
| **最少控制器节点数**   | 2            | 3        |
| **推荐节点数**      | 3            | 5        |
| **存储开销** （去重前） | 约 2 倍        | 约 3 倍    |

**N+1（RF2）** 是默认配置，适用于大多数生产环境。它会在不同节点上维护每个块的两个副本，可容忍一次同时发生的节点故障。

**N+2（RF3）** 在三个或更多节点上维护三个副本，可容忍两次同时故障。该模式适用于超关键工作负载或替换硬件无法快速到达的远程/边缘站点。

一次故障只会影响 **失败驱动器所在的层** —— 其他层仍可完全运行。例如，在 N+2 系统中，如果两个节点上的 Tier 1 驱动器故障，且第三个节点上的一个 Tier 4 驱动器故障，集群仍可正常运行且不会丢失数据。

{% hint style="success" %}
**修复服务器**

为了在已配置的冗余级别之外获得额外保护，可以配置一个 **修复服务器** ，以便在故障超过已配置冗余级别时自动从同步目标检索缺失的数据块——从而可能避免完整快照回滚。
{% endhint %}

## 自我修复

当节点或驱动器发生故障时，vSAN 会自动检测故障并在无需人工干预的情况下开始恢复：

```mermaid
flowchart LR
    A["检测到驱动器或节点<br/>故障"] --> B["读/写重定向到<br/>冗余副本"]
    B --> C["VM 继续运行<br/>—— 零停机"]
    B --> D["自动重建<br/>立即开始"]
    D --> E["缺失块<br/>重新复制到<br/>健康节点"]
    E --> F["完全冗余<br/>已恢复"]

    style A fill:#fce4ec,stroke:#c62828
    style C fill:#e8f5e9,stroke:#2e7d32
    style F fill:#e8f5e9,stroke:#2e7d32
```

自我修复过程：

1. **检测** —— vSAN 持续监控驱动器和节点健康状况。故障会被自动检测。
2. **故障切换** —— 读写会立即重定向到冗余副本。VM 不会经历停机。
3. **重建** —— 缺失的数据块会从幸存副本重新复制到其余健康节点。这一过程在后台进行，同时工作负载继续运行。
4. **恢复** —— 一旦所有块都重新复制完成，该层就会恢复到其配置的冗余级别。

### 数据完整性

除了故障恢复之外，vSAN 还会执行 **持续位腐检测** ，利用哈希验证。每个块存储的哈希都会定期与其内容进行校验。如果检测到损坏，该块会自动从有效的冗余副本中修复。

## 节省空间的快照与克隆

vSAN 的块级架构支持 **节省空间的快照** ，仅消耗极少的额外存储：

* 快照记录的是 **某一时间点的文件系统索引状态** —— 它不会复制数据块
* 快照引用的块会被保留，即使原始 VM 删除了它们（引用计数）
* 克隆的工作方式类似——它们引用相同的底层块，只有在数据发生分化时才会占用额外空间（写时复制）
* 快照可以通过一个可选标志变为 **不可变** ，并具有未锁定/已锁定/解锁中状态；一旦锁定，解锁会延迟七天；默认快照可删除。当需要勒索软件防护或保留保障时，请锁定快照。

### 删除与垃圾回收

当 VM、驱动器或快照被删除时：

1. 该文件的哈希会从 vSAN 目录树中移除
2. 该 **vSAN Walk** 差异遍历会从剩余的活动哈希中重新推导引用计数——计数不会被存储，它们会在遍历过程中被重建
3. 引用数降为零的块会等待大约 **10 次遍历（约 70 秒）** 之后才有资格被回收，从而提供一个防止快速反复变更的安全窗口
4. 当遍历回收这些块时，物理存储空间会异步释放

这就是为什么删除后存储空间可能不会立即减少——回收是在后台 vSAN Walk 操作期间异步进行的。

## 要点总结

| 概念          | 摘要                                                              |
| ----------- | --------------------------------------------------------------- |
| **VergeFS** | 集成式分布式存储——无需外部 SAN/NAS，无 CVM 开销                                 |
| **块架构**     | 所有数据都被划分为块，每个块都由 SHA-1 内容哈希标识                                   |
| **0 层**     | 仅元数据（文件系统索引 + 各层设备映射）。不是缓存。必须位于控制器节点上（N+1 为节点 1–2，N+2 为节点 1–3）。 |
| **分发**      | 基于哈希，按每层在所有参与存储的节点上分布                                           |
| **重复数据删除**  | 内联、始终开启、跨所有层全局生效——零配置                                           |
| **压缩**      | 非静态存储时不压缩——仅在站点同步复制期间压缩                                         |
| **加密**      | 静态数据 AES-256，加密在安装时配置，不可逆                                       |
| **冗余**      | N+1（2 份副本，默认）或 N+2（3 份副本）——按层级在系统范围内生效                          |
| **自我修复**    | 故障时自动故障切换与重建，持续位腐检测                                             |
| **快照**      | 时间点哈希引用，空间高效；不可变性为可选开启（未锁定/已锁定/解锁中，7 天解锁延迟）                     |

## 下一步

既然你已经了解了 vSAN 的内部架构，下一主题将介绍分层系统在实际中的工作方式——如何配置各层、分配驱动器、规划容量以及扩展存储： [**存储层级**](/learn-the-platform/zh/mo-kuai-5-cun-chu/02-storage-tiers.md)


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.verge.io/learn-the-platform/zh/mo-kuai-5-cun-chu/01-vsan-architecture.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
