第四章:架构设计

深入了解 MinIO 的分布式架构、纠删码模式、数据写入流程和高可用设计。

最后更新: 2024-01-15
页面目录

第四章:架构设计

4.1 整体架构

4.1.1 MinIO 架构概览

┌─────────────────────────────────────────────────────────────┐
│                        MinIO Cluster                          │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│   ┌─────────────────────────────────────────────────────┐   │
│   │                  MinIO Gateway                        │   │
│   │  ┌───────────┐ ┌───────────┐ ┌───────────┐        │   │
│   │  │  API GW   │ │  IAM      │ │  Bucket   │        │   │
│   │  └───────────┘ └───────────┘ └───────────┘        │   │
│   └─────────────────────────────────────────────────────┘   │
│                                                              │
│   ┌─────────────────────────────────────────────────────┐   │
│   │                  Storage Layer                       │   │
│   │  ┌─────────┐  ┌─────────┐  ┌─────────┐  ┌─────────┐│   │
│   │  │ Disk 1  │  │ Disk 2  │  │ Disk 3  │  │ Disk 4  ││   │
│   │  └─────────┘  └─────────┘  └─────────┘  └─────────┘│   │
│   └─────────────────────────────────────────────────────┘   │
│                                                              │
└─────────────────────────────────────────────────────────────┘

4.1.2 核心组件

组件 说明
MinIO Server 核心存储服务
MinIO Gateway 网关层,支持 S3/GCS/Azure
Erasure Coding 纠删码数据保护
IAM 身份和访问管理
DSync 分布式锁机制
HashiCorp Vault 密钥管理集成

4.2 纠删码模式

4.2.1 什么是纠删码

纠删码(Erasure Coding)是一种数据保护技术,将数据分割成多个块,并计算冗余校验块,即使部分磁盘或节点故障,也能恢复丢失的数据。

原始数据: [D1, D2, D3, D4]
         ↓ Erasure Coding
┌─────────────────────────────────────────────────────────┐
│  EC:4 数据块 + 2 校验块 (RS:4+2)                        │
│                                                          │
│  D1   D2   D3   D4   P1   P2                            │
│   ↓    ↓    ↓    ↓    ↓    ↓                           │
│  Disk1 Disk2 Disk3 Disk4 Disk5 Disk6                   │
│                                                          │
│  可容忍最多 2 块磁盘故障                                  │
└─────────────────────────────────────────────────────────┘

4.2.2 纠删码配置

模式 数据块 校验块 容忍故障
纠删码 4+4 4 4 4
纠删码 6+2 6 2 2
纠删码 8+2 8 2 2
纠删码 12+4 12 4 4
纠删码 16+4 16 4 4

4.2.3 纠删码计算

# 最小配置要求
# 至少 4 个节点,每个节点至少 1 块磁盘

# 推荐配置(8+4 模式)
# 需要至少 12 个磁盘

minio server \
  http://node{1...8}:9000/data/minio{1...2} \
  http://node{1...4}:9000/data/minio{1...2}

4.3 分布式架构

4.3.1 分布式部署模式

┌─────────────────────────────────────────────────────────────┐
│            Distributed MinIO Cluster (8节点)                  │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐          │
│  │   Node 1    │  │   Node 2    │  │   Node 3    │          │
│  │  Set 1      │  │  Set 1      │  │  Set 1      │          │
│  │  D1  D2  P1 │  │  D3  P2  D4 │  │  P3  D5  D6 │          │
│  └─────────────┘  └─────────────┘  └─────────────┘          │
│                                                              │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐          │
│  │   Node 4    │  │   Node 5    │  │   Node 6    │          │
│  │  Set 1      │  │  Set 1      │  │  Set 1      │          │
│  │  D7  P4  D8 │  │  P1  D9  D10│  │  D11 P2  D12│          │
│  └─────────────┘  └─────────────┘  └─────────────┘          │
│                                                              │
│  Set 1: 12 磁盘,4 数据块 + 8 校验块                          │
└─────────────────────────────────────────────────────────────┘

4.3.2 节点池(Pool)

# Kubernetes Pool 配置示例
spec:
  pools:
    # 热存储池
    - name: hot-pool
      servers: 4
      volumesPerServer: 4
      volumeClaimTemplate:
        spec:
          resources:
            requests:
              storage: 100Gi
    
    # 温存储池
    - name: warm-pool
      servers: 2
      volumesPerServer: 4
      volumeClaimTemplate:
        spec:
          resources:
            requests:
              storage: 500Gi

4.3.3 跨区域复制

┌──────────────────┐                    ┌──────────────────┐
│   MinIO Site A   │                    │   MinIO Site B   │
│   (北京)          │                    │   (上海)          │
│                  │   异步复制          │                  │
│  ┌────────────┐  │ ─────────────────► │  ┌────────────┐  │
│  │  Bucket A  │  │                    │  │  Bucket A  │  │
│  └────────────┘  │                    │  └────────────┘  │
└──────────────────┘                    └──────────────────┘

4.4 数据写入流程

4.4.1 写入流程详解

客户端写入请求
┌─────────────────┐
│   API Gateway   │  ─── 认证与授权
└────────┬────────┘
┌─────────────────┐
│   IAM Service   │  ─── 验证访问凭证
└────────┬────────┘
┌─────────────────┐
│  Bucket Routing │  ─── 确定目标存储桶
└────────┬────────┘
┌─────────────────┐
│  Erasure Coding │  ─── 数据分片与编码
│     Layer       │
└────────┬────────┘
    ┌────┴────┐
    ▼         ▼
┌───────┐ ┌───────┐
│Disks  │ │Disks  │  ─── 并行写入多个磁盘
└───────┘ └───────┘

4.4.2 写入路径

// 数据写入关键步骤
Write Path:
1. 接收客户端请求
2. 验证 IAM 策略
3. 计算纠删码块
4. 并行写入磁盘
5. 等待 quorum 确认
6. 返回成功响应

4.4.3 Quorum 机制

# 写入 quorum
# 纠删码 N+M 模式下,需要 N 个块写入成功

# 例如 4+2 模式
# 需要至少 4 个数据块写入成功(共 6 块)

# 读取 quorum
# 需要读取任意 N 个块即可重建数据

4.5 数据读取流程

4.5.1 读取流程详解

客户端读取请求
┌─────────────────┐
│   API Gateway   │
└────────┬────────┘
┌─────────────────┐
│  Erasure Coding │  ─── 确定读取路径
│     Layer       │
└────────┬────────┘
    ┌────┴────┐
    ▼         ▼
┌───────┐ ┌───────┐
│ 任意  │ │ 重建   │  ─── 优先读取可用的块
│ N块   │ │ 丢失块  │
└───────┘ └───────┘
    数据恢复与组装
    返回完整数据

4.5.2 故障恢复

正常状态:
Disk1: [D1]  Disk2: [D2]  Disk3: [D3]  Disk4: [D4]

磁盘 2 故障:
Disk1: [D1]  Disk2: [X]   Disk3: [D3]  Disk4: [D4]
            从 D1, D3, D4 重建 D2

恢复后:
Disk1: [D1]  Disk2: [D2']  Disk3: [D3]  Disk4: [D4]

4.6 高可用设计

4.6.1 故障容忍

部署规模 数据块 校验块 容忍节点故障 容忍磁盘故障
4 节点 4 4 4 每个节点全部
8 节点 8 4 4 每个节点全部
16 节点 16 4 4 每个节点全部

4.6.2 元数据高可用

# 元数据存储在高可用的 etcd 中
# 支持分布式锁和配置管理

# 检查集群健康
mc admin info myminio

# 输出示例
# ●  MinIO
#    Uptime   : online
#    Version  : 2024.01.01
#    Network  : 4/4 OK
#    Drives   : 16/16 OK

4.7 性能优化架构

4.7.1 并行 I/O

┌─────────────────────────────────────────┐
│           多节点并行写入                  │
│                                          │
│   客户端 ──► ┌─────────────────┐         │
│              │  Striping       │         │
│              │  (数据分条)      │         │
│              └────────┬────────┘         │
│         ┌────────────┼────────────┐      │
│         │            │            │      │
│         ▼            ▼            ▼      │
│    ┌─────────┐ ┌─────────┐ ┌─────────┐  │
│    │ Node 1  │ │ Node 2  │ │ Node 3  │  │
│    └─────────┘ └─────────┘ └─────────┘  │
└─────────────────────────────────────────┘

4.7.2 缓存层

# 配置 SSD 缓存
export MINIO_CACHE_DRIVES="/mnt/cache1,/mnt/cache2"
export MINIO_CACHE_EXCLUDE="*.log,*.tmp"
export MINIO_CACHE_QUOTA=80
export MINIO_CACHE_AFTER=3

# MinIO 会自动将热点数据缓存到 SSD

4.8 总结

本章深入介绍了 MinIO 的架构设计,包括纠删码模式、分布式部署、数据读写流程和高可用设计。理解这些架构概念对于正确部署和维护 MinIO 集群至关重要。下一章将学习 MinIO 的核心概念。