全闪存阵列搭建|mdadm 实操 用以下 4 个 SSD 组全闪存阵列(All-Flash Array),与组 raid 同法,简单记录下。
1 2 3 4 5 6 7 8 9 10 11 12 $ lsblk -f NAME        FSTYPE   LABEL UUID FSAVAIL FSUSE% MOUNTPOINT loop0       squashfs             0   100% /snap/core20/2379 loop1       squashfs            0   100% /snap/lxd/24061 loop2       squashfs             0   100% /snap/snapd/21759 loop3       squashfs             0   100% /snap/core20/2434 loop4       squashfs             0   100% /snap/lxd/29619 loop5       squashfs             0   100% /snap/snapd/23258 sda         ext4           a35cd456-e07a-4d50-8118-1556a18a6971                 sdb         ext4           e2a3bb45-0b9b-4d0c-b9db-192dbc1b507e                 sdc         ext4           39a9734c-bfc2-4a6e-99b5-de18082385f8                 sdd         ext4           5f8065ab-88e5-47a5-9729-c1b3c286bf73                 
 
要将 4 个 SSD 组成一个 All-flash Array ,可以通过 RAID 技术来完成,常见的方式是使用 Linux 软件 RAID (mdadm)来配置一个 RAID 阵列。这些 SSD 可以通过不同的 RAID 模式(如 RAID 0、RAID 1、RAID 5、RAID 10 等)组合在一起,具体选择哪种 RAID 取决于你对性能、冗余和容错的需求。
步骤 1:安装 mdadm 工具 mdadm 是用于创建和管理 Linux 软件 RAID 阵列的工具。如果你的系统上没有安装 mdadm,可以使用以下命令进行安装:
Ubuntu/Debian 系列
 
1 2 sudo  apt updatesudo  apt install mdadm
 
步骤 2:清除磁盘上的现有数据 在创建 RAID 阵列之前,你需要确保所有磁盘上没有任何分区或者已有数据。可以使用 wipefs 命令清除磁盘上的任何现有文件系统和分区信息:
1 2 3 4 sudo  wipefs --all /dev/sdasudo  wipefs --all /dev/sdbsudo  wipefs --all /dev/sdcsudo  wipefs --all /dev/sdd
 
步骤 3:创建 RAID 阵列 决定你需要哪种 RAID 级别(0、1、5、10)。以下是几种常见 RAID 阵列的说明:
RAID 0 (条带化):提供最高性能,但没有冗余,任何磁盘故障都会导致数据丢失。 
RAID 1 (镜像):提供数据冗余,但只使用两个磁盘,容量是最小磁盘大小的两倍。 
RAID 5 (带奇偶校验的条带化):提供冗余和良好的性能,至少需要 3 个磁盘。 
RAID 10 (1+0,镜像 + 条带化):提供较好的性能和冗余,至少需要 4 个磁盘。 
 
创建 RAID 0(条带化)阵列 如果你的目标是最大化性能,可以选择 RAID 0:
1 sudo  mdadm --create /dev/md0 --level=0 --raid-devices=4 /dev/sda /dev/sdb /dev/sdc /dev/sdd
 
这将创建一个包含 4 个磁盘的 RAID 0 阵列,设备名为 /dev/md0
创建 RAID 1(镜像)阵列 如果你希望有更高的冗余(需要两对磁盘进行镜像),你可以选择 RAID 1:
1 2 sudo  mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sda /dev/sdbsudo  mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/sdc /dev/sdd
 
这会创建两个 RAID 1 阵列,每对磁盘形成一个镜像。
创建 RAID 5(带奇偶校验的条带化)阵列 如果你希望实现性能和冗余的平衡,RAID 5 是一个不错的选择,它提供奇偶校验,能够承受一个磁盘故障:
1 sudo  mdadm --create /dev/md0 --level=5 --raid-devices=4 /dev/sda /dev/sdb /dev/sdc /dev/sdd
 
创建 RAID 10(镜像 + 条带化)阵列 RAID 10 提供了较好的性能和冗余,适合需要较高性能和数据保护的应用:
1 sudo  mdadm --create /dev/md0 --level=10 --raid-devices=4 /dev/sda /dev/sdb /dev/sdc /dev/sdd
 
步骤 4:查看 RAID 阵列状态 创建 RAID 阵列后,使用以下命令来检查阵列的状态:
1 sudo  mdadm --detail /dev/md0
 
这将显示 /dev/md0 阵列的详细信息,包括阵列的健康状态、磁盘的状态等。
步骤 5:格式化 RAID 阵列 创建 RAID 阵列后,你需要为其创建文件系统。通常使用 ext4 或 xfs 文件系统。以下是格式化 RAID 阵列的命令:
 
步骤 6:挂载 RAID 阵列 创建并格式化 RAID 阵列后,你需要将其挂载到文件系统中。
1 2 sudo  mkdir  /mnt/raidsudo  mount /dev/md0 /mnt/raid
 
步骤 7:自动挂载 /etc/fstab 如果你希望在每次启动时自动挂载 RAID 阵列,可以将其添加到 /etc/fstab 文件中。
 
然后编辑 /etc/fstab 文件并添加以下行:
1 UUID=<uuid_from_blkid> /mnt/raid ext4 defaults 2 0 
 
步骤 8:监控和管理 使用 mdadm 来监控 RAID 阵列的状态,并检查是否有任何磁盘故障或阵列问题。
1 sudo  mdadm --detail /dev/md0
 
针对 AFA 的读写放大问题,可以采用以下这条流程测试和监控:
✍️ 番外篇:iostat 监测磁盘 I/O|fio 压测 1️⃣ 使用 iostat 监控磁盘 I/O iostat 可以显示磁盘的读写性能,但它并不直接提供写放大倍数。不过你可以通过 总写入量  和 实际写入量  来间接推算。例如:
 
详细信息解释:
avg-cpu :显示 CPU 使用情况的平均值:
%user:用户空间的 CPU 使用率 
%nice:以较低优先级运行的进程使用的 CPU 时间百分比 
%system:内核空间的 CPU 使用率 
%iowait:等待 I/O 操作完成时的 CPU 空闲时间百分比 
%steal:虚拟化环境中,被虚拟机监控程序抢占的 CPU 时间百分比 
%idle:CPU 空闲时间百分比 
 
磁盘 I/O 信息:
r/s :每秒读取的请求数(I/O 操作次数) 
w/s :每秒写入的请求数 
rkB/s :每秒读取的数据量(KB) 
wkB/s :每秒写入的数据量(KB) 
rrqm/s : 每秒合并读操作的次数 
wrqm/s : 每秒合并写操作的次数 
r_await :每个读操作平均所需要的时间,不仅包括硬盘设备读操作的时间,也包括在内核队列中的时间 
w_await :每个写操平均所需要的时间,不仅包括硬盘设备写操作的时间,也包括在队列中等待的时间 
svctm :I/O 服务时间(毫秒),表示请求处理的平均时间 
%util :设备的利用率,表示磁盘 I/O 操作的占用程度,如果值接近 100%,说明磁盘已经达到饱和 
 
这个命令会每秒输出一次磁盘的读写性能,包括每个磁盘的读写 I/O 操作次数和每秒的字节数
 
iostat 命令的主要功能是展示每个磁盘(包括 RAID 阵列的虚拟磁盘)以及 CPU 的利用情况,显示磁盘设备的 I/O 性能指标,如每秒的读写字节数、I/O 请求数、等待时间等。
常用的 iostat 参数
-c:显示 CPU 使用情况 
-d:显示磁盘设备的 I/O 统计信息 
-x:显示磁盘设备的扩展统计信息(如磁盘的响应时间、队列长度等) 
-k:以 KB 为单位显示数据(默认单位为字节) 
-m:以 MB 为单位显示数据 
-t:显示时间戳 
-p:显示分区的统计信息 
-z:仅显示有 I/O 操作的设备,不显示没有活动的设备 
interval:更新统计信息的时间间隔,单位为秒 
 
1 $ iostat [options] [interval] [count] 
 
interval:统计的更新频率,单位为秒。例如,每 5 秒刷新一次统计信息。 
count:显示多少次统计信息。例如,iostat 5 3 表示每隔 5 秒输出一次统计信息,总共输出 3 次。 
 
2️⃣ 使用 fio 进行基准测试 fio 可以用来生成 I/O 工作负载,测试不同类型的读写模式,从而间接估算 RAID 阵列和 SSD 的性能表现。
你可以通过特定的测试配置来模拟写操作,并计算写放大,比如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 sudo  fio \  --name=seq_write_test \   --filename=/dev/md0 \   --size=100% \   --bs=4k \   --rw=write \   --iodepth=64 \   --numjobs=4 \   --direct=1 sudo  fio \  --name=rand_write_test \   --filename=/dev/md0 \   --size=100% \   --bs=4k \   --rw=randwrite \   --iodepth=64 \   --numjobs=4 \   --direct=1 
 
3️⃣ 使用 smartctl 检查磁盘/硬盘状态 smartctl 检查和控制硬盘驱动器(HDD)和固态硬盘(SSD)SMART(Self-Monitoring, Analysis, and Reporting Technology)状态,smartctl 工具可以提供磁盘的健康状况、温度、错误信息等,通常用于监控单个硬盘的健康状况。
不过 smartctl 只能查看单个磁盘/硬盘的 SMART 数据,无法直接查看整个 RAID 阵列(如 /dev/md0)的读写放大(Write Amplification)情况 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 wyk 20:20:37 ~ $ sudo  smartctl -a /dev/sda smartctl 7.1 2019-12-30 r5022 [x86_64-linux-5.4.0-198-generic] (local  build) Copyright (C) 2002-19, Bruce Allen, Christian Franke, www.smartmontools.org === START OF INFORMATION SECTION === Device Model:     Fanxiang S103Pro 1TB Serial Number:    2036E4AD5054 LU WWN Device Id: 5 00a075 1e4ad5054 Firmware Version: 22Z4VBND User Capacity:    1,000,204,886,016 bytes [1.00 TB] Sector Sizes:     512 bytes logical, 4096 bytes physical Rotation Rate:    Solid State Device Form Factor:      2.5 inches Device is:        Not in  smartctl database [for  details use: -P showall] ATA Version is:   ACS-3 T13/2161-D revision 5 SATA Version is:  SATA 3.3, 6.0 Gb/s (current: 6.0 Gb/s) Local Time is:    Fri Dec 27 20:21:44 2024 UTC SMART support is: Available - device has SMART capability. SMART support is: Enabled === START OF READ SMART DATA SECTION === SMART overall-health self-assessment test  result: PASSED General SMART Values: Offline data collection status:  (0x80) Offline data collection activity                                         was never started.                                         Auto Offline Data Collection: Enabled. Self-test  execution status:      (   0) The previous self-test routine completed                                         without error or no self-test has ever                                          been run. Total time  to complete Offline  data collection:                (    0) seconds. Offline data collection capabilities:                    (0x7b) SMART execute Offline immediate.                                         Auto Offline data collection on/off support.                                         Suspend Offline collection upon new                                         command .                                         Offline surface scan supported.                                         Self-test  supported.                                         Conveyance Self-test  supported.                                         Selective Self-test  supported. SMART capabilities:            (0x0002) Does not save SMART data before                                         entering power-saving mode.                                         Supports SMART auto save timer. Error logging capability:        (0x01) Error logging supported.                                         General Purpose Logging supported. Short self-test routine  recommended polling time :        (   2) minutes. Extended self-test routine recommended polling time :        (  30) minutes. Conveyance self-test routine recommended polling time :        (   2) minutes. SCT capabilities:              (0x0031) SCT Status supported.                                         SCT Feature Control supported.                                         SCT Data Table supported. SMART Attributes Data Structure revision number: 16 Vendor Specific SMART Attributes with Thresholds: ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE   1 Raw_Read_Error_Rate     0x0000   100   100   000    Old_age   Offline      -       0   5 Reallocated_Sector_Ct   0x0000   100   100   000    Old_age   Offline      -       0   9 Power_On_Hours          0x0000   100   100   000    Old_age   Offline      -       575  12 Power_Cycle_Count       0x0000   100   100   000    Old_age   Offline      -       52 148 Unknown_Attribute       0x0000   100   100   000    Old_age   Offline      -       37557 149 Unknown_Attribute       0x0000   100   100   000    Old_age   Offline      -       302 150 Unknown_Attribute       0x0000   100   100   000    Old_age   Offline      -       78 151 Unknown_Attribute       0x0000   100   100   000    Old_age   Offline      -       146 159 Unknown_Attribute       0x0000   100   100   000    Old_age   Offline      -       0 160 Unknown_Attribute       0x0000   100   100   000    Old_age   Offline      -       0 161 Unknown_Attribute       0x0000   100   100   000    Old_age   Offline      -       93 163 Unknown_Attribute       0x0000   100   100   000    Old_age   Offline      -       23 164 Unknown_Attribute       0x0000   100   100   000    Old_age   Offline      -       16394 165 Unknown_Attribute       0x0000   100   100   000    Old_age   Offline      -       14 166 Unknown_Attribute       0x0000   100   100   000    Old_age   Offline      -       1 167 Unknown_Attribute       0x0000   100   100   000    Old_age   Offline      -       5 168 Unknown_Attribute       0x0000   100   100   000    Old_age   Offline      -       3000 169 Unknown_Attribute       0x0000   100   100   000    Old_age   Offline      -       100 177 Wear_Leveling_Count     0x0000   100   100   050    Old_age   Offline      -       3751 181 Program_Fail_Cnt_Total  0x0000   100   100   000    Old_age   Offline      -       0 182 Erase_Fail_Count_Total  0x0000   100   100   000    Old_age   Offline      -       0 192 Power-Off_Retract_Count 0x0000   100   100   000    Old_age   Offline      -       7 194 Temperature_Celsius     0x0000   100   100   000    Old_age   Offline      -       25 195 Hardware_ECC_Recovered  0x0000   100   100   000    Old_age   Offline      -       0 196 Reallocated_Event_Count 0x0000   100   100   016    Old_age   Offline      -       0 199 UDMA_CRC_Error_Count    0x0000   100   100   050    Old_age   Offline      -       0 232 Available_Reservd_Space 0x0000   100   100   000    Old_age   Offline      -       100 241 Total_LBAs_Written      0x0000   100   100   000    Old_age   Offline      -       144248 242 Total_LBAs_Read         0x0000   100   100   000    Old_age   Offline      -       102956 245 Unknown_Attribute       0x0000   100   100   000    Old_age   Offline      -       172137 SMART Error Log Version: 1 No Errors Logged SMART Self-test  log  structure revision number 1 No self-tests have been logged.  [To run self-tests, use: smartctl -t] SMART Selective self-test log  data structure revision number 1  SPAN  MIN_LBA  MAX_LBA  CURRENT_TEST_STATUS     1        0        0  Not_testing     2        0        0  Not_testing     3        0        0  Not_testing     4        0        0  Not_testing     5        0        0  Completed [00% left] (0-65535) Selective self-test flags (0x0):   After scanning selected spans, do  NOT read-scan remainder of disk. If Selective self-test is pending on power-up, resume after 0 minute delay.