第四章:架构设计
深入了解 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 的核心概念。