概述从DAS/NAS/SAN三种存储架构到块/文件/对象存储类型,深入理解存储基础概念与软件RAID实践
时间2026-05-07
分类Ceph集群
标签存储架构 DAS NAS SAN 块存储 文件存储 对象存储 RAID

存储基础概念


🧱 三种存储架构

先搞清楚这三个东西在物理层面是怎么连接的

架构 全称 连接方式 通俗理解
DAS Direct Attached Storage 直接插在服务器上 就像你电脑上插个 U 盘或移动硬盘
NAS Network Attached Storage 通过网络 (以太网) 连接 就像家里买了华为家庭存储,全家设备都能访问
SAN Storage Area Network 通过专用存储网络 (FC / iSCSI) 就像服务器后面的专用高速存储通道

DAS — 直连存储

💡 最原始的方案:硬盘直接接到服务器

# 在 Linux 下你看到的本地磁盘就是 DAS
[root@host ~]# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda      8:0    0   40G  0 disk
├─sda1   8:1    0    1G  0 part /boot
└─sda2   8:2    0   39G  0 part /
'这就是典型的 DAS —— 磁盘直接插在主板上'

NAS — 网络附加存储

💡 把存储变成"共享文件夹":通过网络提供文件级共享

# 挂载 NFS 共享 —— 典型 NAS 使用场景
[root@host ~]# mount -t nfs 192.168.1.100:/data/share /mnt/nas
# 挂载完后就像本地目录一样用,但数据实际存在远端 NAS 设备上

SAN — 存储区域网络

💡 把存储变成"远程硬盘":服务器看到的是一个裸盘,需要自己格式化

# iSCSI 登录后,你会在服务器上看到一块新磁盘 (比如 /dev/sdb)
[root@host ~]# iscsiadm -m discovery -t st -p 192.168.1.100
192.168.1.100:3260,1 iqn.2025-01.com.example:target1
[root@host ~]# iscsiadm -m node --login
# 然后 lsblk 就能看到多了一块盘,后面格式化、挂载和本地盘一样操作

📌 一句话区分


🧱 三种存储类型

上面是从连接架构区分,现在从数据组织方式区分

类型 访问方式 核心特点 典型场景
块存储 裸盘 / Block Device 需要格式化,速度快 数据库、虚拟机磁盘
文件存储 文件夹 + 文件 即开即用,多用户共享 NFS、Samba 共享
对象存储 HTTP API (GET/PUT) 扁平空间,无限扩展 图片、视频、备份归档

块存储 (Block Storage)

💡 最底层的存储形式:数据被切成一块一块 (block) 直接读写

# 块存储的典型操作流
(1)拿到一块盘 /dev/sdb
(2)分区 fdisk /dev/sdb
(3)格式化 mkfs.xfs /dev/sdb1
(4)挂载 mount /dev/sdb1 /data
'你得自己走完这四步,块存储只负责给你"一块空白硬盘"'

文件存储 (File Storage)

💡 最常见的存储形式你已经看到文件夹和文件了,直接读写

# 文件存储用起来就简单多了
[root@host ~]# mount -t nfs 192.168.1.100:/vol/share /mnt
[root@host ~]# echo "hello" > /mnt/test.txt
'挂上去就能用,和本地文件夹一样'

对象存储 (Object Storage)

💡 面向海量数据的存储:没有目录树,数据是扁平存放的

[!WARNING]

    ✅️ 对象存储不 mount,通过 API 操作
    ✅️ 对象存储不是给你"挂载"用的,而是通过 HTTP 上传下载
[root@host ~]# curl -X PUT -T photo.jpg \
  http://s3.example.com/bucket/photo.jpg

📌 用盖房子类比


⚙️ 重点服务详解

之前学过的三个核心服务,这里做对比梳理

特性 NFS Samba iSCSI
所属类型 NAS (文件级) NAS (文件级) SAN (块级)
协议 NFSv3 / NFSv4 SMB / CIFS iSCSI (SCSI over TCP)
权限模型 IP 或域名 + 导出策略 用户名密码 / AD 域 CHAP 认证 + IQN
服务端口 2049 (nfsd) 139 (NetBIOS), 445 (SMB) 3260
拿到的对象 文件夹 文件夹 裸盘 (/dev/sdX)

💡 iSCSI 的核心概念

🚢 ① Target (目标端) — 存储服务器,负责"提供磁盘" 📦 ② Initiator (发起端) — 客户端,主动去连接拿盘 ⚙️ ③ IQN (iSCSI Qualified Name) — 全局唯一标识名,相当于"磁盘的身份证" 🔹 ④ LUN (Logical Unit Number) — 逻辑单元号,一个 target 可以包含多个 LUN

⚠️ iSCSI 注意事项


📌 小结


项目拓展 —— 集群存储方案设计

在这个拓展章节中,我们将探讨集群文件系统、分布式存储等方案,并最终聚焦于企业级首选——Ceph

集群文件系统 (Clustered File System)

🧱 通俗解释:多个服务器同时挂载同一个文件系统,任何一个节点写入的数据,其他节点立即可见

💡 核心特征:强一致性、需要 STONITH 机制防脑裂、适合小规模高可用场景

分布式文件系统 (Distributed File System)

🧱 通俗解释:把文件切成小块,分散存储在 N 台服务器上,对外表现为一个统一的目录树

特性 集群文件系统 分布式文件系统
数据存储 共享 SAN/NAS 存储 数据分散在本地磁盘
扩展性 受限于存储设备容量 水平扩展,加节点即可
元数据管理 共享锁管理 独立 MDS 服务器
典型场景 小规模高可用集群 大规模数据存储与分析

分布式存储 (Distributed Storage)

🧱 通俗解释:不仅仅是文件——把 块存储文件存储对象存储 统一在一个分布式平台上

分布式存储是分布式文件系统的"进阶版",它不仅提供文件接口,还能:

💡 Ceph 是目前唯一一个同时原生支持块、文件、对象三种存储接口的开源分布式存储系统

链路分布 (Data Striping)

🧱 通俗解释:数据在存储集群中的"分片+打散"策略

一个大文件存入分布式存储后: ① 先被切分为多个固定大小的对象(object),比如每个 4MB ② 通过 CRUSH 算法 计算每个对象应该存放在哪些 OSD 上 ③ 数据被均匀打散到所有磁盘上,避免热点

📌 一句话链路分布解决了"数据该放在哪里"的路由问题

冗余 (Redundancy)

🧱 通俗解释:数据存了不止一份,坏几块盘丢不了数据

去中心化 (Decentralization)

🧱 通俗解释:集群没有"老大",每个节点都是平等的——挂了谁都不影响整体

📌 CRUSH = Controlled Replication Under Scalable Hashing,是 Ceph 实现去中心化的核心

RAID 是什么

💡 RAID (Redundant Array of Independent Disks):把多块物理硬盘组合成一个逻辑磁盘

RAID 级别 数据保护方式 硬盘数量 容量使用率 可坏几块盘
RAID0 不安全 2(1块也行) 1 0 ❌ 坏一块全丢
RAID1 镜像 2(偶数即可) 1/2 1 ✅ 坏一块
RAID3 校验 至少3块 (n-1)/n 1 ✅ 坏一块
RAID5 校验 至少3块 (n-1)/n 1 ✅ 坏一块
RAID6 校验 至少4块 (n-2)/n 2 ✅ 坏两块
RAID10 镜像 + 校验 至少4块 1/2 2 ✅ 每组坏一块
组内最多允许坏1块
组间最多允许坏2块
RAID50 校验 至少6块(2组×3) (n-2)/n(2组 2 ✅ 每组坏一块
组内最多允许坏1块
组间最多允许坏2块
RAID60 校验 至少8块(2组×4) (n-4)/n(2组 4 ✅ 每组坏两块
组内最多允许坏2块
组间最多允许坏4块

环境准备

1)确认磁盘已识别
root@ubuntu ~# lsblk 
NAME                      MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda                         8:0    0   40G  0 disk 
├─sda1                      8:1    0    1M  0 part 
├─sda2                      8:2    0    2G  0 part /boot
└─sda3                      8:3    0   38G  0 part 
  └─ubuntu--vg-ubuntu--lv 252:0    0   30G  0 lvm  /
sr0                        11:0    1  2.6G  0 rom  
nvme0n1                   259:0    0    5G  0 disk 
nvme0n2                   259:1    0    5G  0 disk 
nvme0n3                   259:2    0    5G  0 disk 
nvme0n4                   259:3    0    5G  0 disk 
nvme0n5                   259:4    0    5G  0 disk 
nvme0n6                   259:5    0    5G  0 disk
# sda 是系统盘,其余 6 块为空盘

2)安装 mdadm (Ubuntu 24.04 默认未预装)
root@ubuntu:~# apt update && apt install -y mdadm
'一路回车即可,无需额外配置'
root@ubuntu ~# dpkg -l | grep mdadm
amd64 mdadm amd64 4.3-1ubuntu2.1 [464 kB]

⚠️ 如果磁盘之前被创建过 RAID,需要先清除

root@ubuntu:~# mdadm --zero-superblock /dev/nvme0n{1,2,3,4,5,6}

RAID 0 — 条带化 (无冗余)

💡 两块盘拼成一块,数据交替写入,读写速度接近翻倍,但坏一块全丢

root@ubuntu:~# mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/nvme0n1 /dev/nvme0n2
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
--create /dev/md0   # 创建名为 md0 的 RAID 设备
--level=0           # 指定 RAID 0
--raid-devices=2    # 用 2 块活动盘

验证创建结果

1)查看阵列概况
root@ubuntu ~# cat /proc/mdstat
Personalities : [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
md0 : active raid0 nvme0n2[1] nvme0n1[0]
      10475520 blocks super 1.2 512k chunks

2)查看详细状态
root@ubuntu ~# mdadm --detail /dev/md0
/dev/md0:
           Version : 1.2
     Creation Time : Fri May 15 16:17:43 2026
        Raid Level : raid0
        Array Size : 10475520 (9.99 GiB 10.73 GB)
      Raid Devices : 2
     Total Devices : 2
       Persistence : Superblock is persistent

       Update Time : Fri May 15 16:17:43 2026
             State : clean 
    Active Devices : 2
   Working Devices : 2
    Failed Devices : 0
     Spare Devices : 0

            Layout : original
        Chunk Size : 512K

Consistency Policy : none

              Name : ubuntu:0  (local to host ubuntu)
              UUID : 579174b2:1e1c0583:9a4578ac:72afd403
            Events : 0

    Number   Major   Minor   RaidDevice State
       0     259        0        0      active sync   /dev/nvme0n1
       1     259        1        1      active sync   /dev/nvme0n2

格式化与挂载

root@ubuntu:~# mkfs.xfs /dev/md0
log stripe unit (524288 bytes) is too large (maximum is 256KiB)
log stripe unit adjusted to 32KiB
meta-data=/dev/md0   isize=512    agcount=16, agsize=163712 blks
...............

root@ubuntu:~# mount /dev/md0 /mnt
root@ubuntu ~# df -h | grep md0
/dev/md0      10G  228M  9.8G   3% /mnt

'格式化 + 挂载成功,10G 可用 (2×5G)'

root@ubuntu:~# echo "RAID0 test" > /mnt/test.txt
root@ubuntu:~# cat /mnt/test.txt
RAID0 test

停止 RAID 0 (为后续实验释放磁盘):

1)卸载文件系统
root@ubuntu ~# umount /mnt

2)停止阵列
root@ubuntu ~# mdadm --stop /dev/md0
mdadm: stopped /dev/md0

3)释放磁盘 --> 清理元数据
root@ubuntu ~# mdadm --zero-superblock /dev/nvme0n1 /dev/nvme0n2

RAID 1 — 镜像

💡 两块盘互为镜像,数据一模一样,坏一张另一张顶上

root@ubuntu ~# mdadm --create /dev/md1 --level=1 --raid-devices=2 --metadata=1.2 /dev/nvme0n1 /dev/nvme0n2
mdadm: array /dev/md1 started.
'因为会跳选择 [y/N]?' --> 元数据版本是否使用现代格式
--metadata=1.2
# 指定版本 --> 自动回答 yes 并强制创建

⚠️ metadata 1.2 vs 0.90 v1.2 元数据写在磁盘开头 (4K 偏移),v0.90 写在磁盘末尾

1)查看阵列概况
root@ubuntu:~# 
md1 : active raid1 nvme0n2[1] nvme0n1[0]
      5237760 blocks super 1.2 [2/2] [UU] --> '[UU] 表示两块盘都正常在线'
      [=========>...........]  resync = 48.9% xxx speed=213616K/sec
      # 概率观察到同步进度

2)格式化与挂载
root@ubuntu ~# mkfs -t ext4 -F /dev/md1
-F  # 强制格式化,不询问
root@ubuntu ~# mkdir -p /mnt/raid1
root@ubuntu ~# mount /dev/md1 /mnt/raid1
root@ubuntu ~# df -h | grep md1
/dev/md1    4.9G   24K  4.6G   1% /mnt/raid1
'可用的空间只有一块盘的容量' --> 5G
root@ubuntu ~# echo "RAID1 mirror test" > /mnt/raid1/test.txt

3)停止 (保留磁盘给下一个实验)
root@ubuntu ~# umount /mnt/raid1
root@ubuntu ~# mdadm --stop /dev/md1
mdadm: stopped /dev/md1
root@ubuntu ~# mdadm --zero-superblock /dev/nvme0n1 /dev/nvme0n2

RAID 5 + 热备盘⭐

💡 4 块盘 --> 3 块活动盘 + 1 块热备盘

1)创建 RAID 5 + 热备
root@ubuntu ~# mdadm --create /dev/md5 --level=5 --raid-devices=3 --spare-devices=1 --metadata=1.2 \
    /dev/nvme0n1 /dev/nvme0n2 /dev/nvme0n3 /dev/nvme0n4
--spare-devices=1 # 1 块作为热备 (nvme0n5)

2)查看阵列概况
root@ubuntu:~# cat /proc/mdstat
md5 : active raid5 nvme0n3[4] "nvme0n4[3](S)" nvme0n2[1] nvme0n1[0]
      10475520 blocks super 1.2 level 5, 512k chunk, algorithm 2 "[3/3] [UUU]"
# nvme0n4[3](S) --> (S) 即 Spare 热备
# [3/3] [UUU] --> 3块活动盘  --> 都已同步 && 全部就绪

3)查看详细状态
root@ubuntu ~# mdadm --detail /dev/md5
/dev/md5:
           Version : 1.2
     Creation Time : Fri May 15 16:45:06 2026
        Raid Level : raid5
        ....................
              Name : ubuntu:5  (local to host ubuntu)
              UUID : 4343f479:179002a2:b2ba6cd2:009bebd7
            Events : 18

    Number   Major   Minor   RaidDevice State
       0     259        0        0      active sync   /dev/nvme0n1
       1     259        1        1      active sync   /dev/nvme0n2
       4     259        2        2      active sync   /dev/nvme0n3

       3     259        3        -      spare   /dev/nvme0n4
"3 块 active sync + 1 块 spare"

4)格式化并挂载
root@ubuntu ~# mkfs -t ext4 -F /dev/md5
root@ubuntu ~# mkdir -p /mnt/raid5
root@ubuntu ~# mount /dev/md5 /mnt/raid5
root@ubuntu ~# df -h | grep md5
/dev/md5    9.8G   24K  9.3G   1% /mnt/raid5
'共10G可用'
root@ubuntu ~# echo "RAID5 hot-spare test" > /mnt/raid5/test.txt

故障模拟与热备重建

💡 模拟一块盘挂掉 → 观察热备自动接管 → 移除坏盘 → 添加新热备

1)模拟磁盘故障  标记 nvme0n1  faulty
root@ubuntu ~# mdadm /dev/md5 --fail /dev/nvme0n1 
mdadm: set /dev/nvme0n1 faulty in /dev/md5

2)立即查看  热备自动启动,开始重建
root@ubuntu ~# cat /proc/mdstat
Personalities : [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
md5 : active raid5 nvme0n3[4] nvme0n4[3] nvme0n2[1] "nvme0n1[0](F)"
      10475520 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [_UU]
      [===>.................]  recovery = 16.2% (850332/5237760) finish=0.3min speed=212583K/sec
# nvme0n1[0](F) → (F) = Faulty 已标记故障
# nvme0n4 自动从 (S) 变成活动盘,接管重建
'热备自动顶上,无需人工干预!'

3)重建完成
root@ubuntu ~# cat /proc/mdstat
Personalities : [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
md5 : active raid5 nvme0n3[4] nvme0n4[3] nvme0n2[1] "nvme0n1[0](F)"-->故障
      10475520 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]

4)查看最新详情
root@ubuntu ~# mdadm --detail /dev/md5
/dev/md5:
           Version : 1.2
     Creation Time : Fri May 15 16:45:06 2026
        Raid Level : raid5

    Number   Major   Minor   RaidDevice State
       3     259        3        0      active sync   /dev/nvme0n4 <-- 原热备已接手
       1     259        1        1      active sync   /dev/nvme0n2
       4     259        2        2      active sync   /dev/nvme0n3

       0     259        0        -      faulty   /dev/nvme0n1 <-- 标记故障
'热备消失 (Spare Devices: 0),因为它已经转正了'

5)移除故障盘
root@ubuntu ~# mdadm /dev/md5 --remove /dev/nvme0n1
mdadm: hot removed /dev/nvme0n1 from /dev/md5

6)添加新热备  模拟更换硬盘
root@ubuntu:~# mdadm --zero-superblock /dev/nvme0n5
'先清空新盘的元数据'
root@ubuntu ~# mdadm /dev/md5 --add /dev/nvme0n5
mdadm: added /dev/nvme0n5
==========================
root@ubuntu ~# mdadm --detail /dev/md5 | grep spare
       5     259        4        -      spare   /dev/nvme0n5
# 新热备就位!

验证数据完整性

root@ubuntu ~# cat /mnt/raid5/test.txt
RAID5 hot-spare test
# 数据完好无损,故障期间完全不受影响!

"数据清理"
root@ubuntu ~# umount /dev/md5
root@ubuntu ~# mdadm --stop /dev/md5
root@ubuntu ~# mdadm --zero-superblock /dev/nvme0n{1,2,3,4,5,6}

RAID 6 — 双重校验

1)使用 4 块盘创建 RAID 6 (无热备)
root@ubuntu:~# mdadm --create /dev/md6 --level=6 --raid-devices=4 --metadata=1.2 \
    /dev/nvme0n1 /dev/nvme0n2 /dev/nvme0n3 /dev/nvme0n4
mdadm: array /dev/md6 started.

2)等待同步
root@ubuntu ~# cat /proc/mdstat
Personalities : [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
md6 : active raid6 nvme0n4[3] nvme0n3[2] nvme0n2[1] nvme0n1[0]
      10475520 blocks super 1.2 level 6, 512k chunk, algorithm 2 "[4/4] [UUUU]"
      [=========>...........]  resync = 49.7% (2603648/5237760) finish=0.2min speed=216970K/sec

3)同步完成
root@ubuntu:~# cat /proc/mdstat
Personalities : [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
md6 : active raid6 nvme0n4[3] nvme0n3[2] nvme0n2[1] nvme0n1[0]
      10475520 blocks super 1.2 level 6, 512k chunk, algorithm 2 [4/4] [UUUU]

配置持久化

⚠️ 重启后 RAID 设备名称可能变化,必须将阵列信息写入配置文件

1)生成配置
root@ubuntu ~# mdadm --detail --scan
ARRAY /dev/md6 metadata=1.2 UUID=04852c0f:c021750a:ed6a8074:a96c200d

2)写入配置文件 (Ubuntu 路径为 /etc/mdadm/mdadm.conf)
root@ubuntu ~# mdadm --detail --scan >> /etc/mdadm/mdadm.conf
root@ubuntu ~# tail -1 /etc/mdadm/mdadm.conf
ARRAY /dev/md6 metadata=1.2 UUID=04852c0f:c021750a:ed6a8074:a96c200d

⚠️ Rocky Linux / RHEL 的配置文件是 /etc/mdadm.conf,Ubuntu 是 /etc/mdadm/mdadm.conf,注意区分

重新扫描激活 (对已停止的阵列):

root@ubuntu:~# mdadm --stop /dev/md6
mdadm: stopped /dev/md6
'停止后查看不到相关配置'

root@ubuntu ~# cat /proc/mdstat
Personalities : [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
unused devices: "<none>"

root@ubuntu ~# mdadm --assemble --scan
mdadm: /dev/md6 has been started with 4 drives.
"根据配置文件自动扫描并启动所有阵列"

# 再次查看
root@ubuntu ~# cat /proc/mdstat
Personalities : [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
md6 : active raid6 nvme0n1[0] nvme0n4[3] nvme0n3[2] nvme0n2[1]
      10475520 blocks super 1.2 level 6, 512k chunk, algorithm 2 [4/4] [UUUU]

📋 日常监控命令速查

任务 命令
查看所有阵列概况 cat /proc/mdstat
监控重建进度 (实时刷新) watch -n 1 cat /proc/mdstat
查看阵列详细信息 mdadm --detail /dev/mdX
检查磁盘超级块信息 mdadm --examine /dev/sdX
标记磁盘故障 mdadm /dev/mdX --fail /dev/sdY
移除故障磁盘 mdadm /dev/mdX --remove /dev/sdY
添加磁盘 (热备/替换) mdadm /dev/mdX --add /dev/sdY
停止阵列 mdadm --stop /dev/mdX
清除磁盘 RAID 元数据 mdadm --zero-superblock /dev/sdX
扫描并重新组装 mdadm --assemble --scan
生成配置文件 mdadm --detail --scan
设置邮件通知 /etc/mdadm/mdadm.conf 中添加 MAILADDR root

📌 小结