全闪存阵列|mdadm 实操

用以下 4 个 SSD 组全闪存阵列(All-Flash Array),与组 raid 同法,简单记录下。

bash 复制代码
$ 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 软件 RAIDmdadm)来配置一个 RAID 阵列。这些 SSD 可以通过不同的 RAID 模式(如 RAID 0、RAID 1、RAID 5、RAID 10 等)组合在一起,具体选择哪种 RAID 取决于你对性能、冗余和容错的需求。

步骤 1:安装 mdadm 工具

mdadm 是用于创建和管理 Linux 软件 RAID 阵列的工具。如果你的系统上没有安装 mdadm,可以使用以下命令进行安装:

Ubuntu/Debian 系列

bash 复制代码
sudo apt update
sudo apt install mdadm

步骤 2:清除磁盘上的现有数据

在创建 RAID 阵列之前,你需要确保所有磁盘上没有任何分区或者已有数据。可以使用 wipefs 命令清除磁盘上的任何现有文件系统和分区信息:

bash 复制代码
sudo wipefs --all /dev/sda
sudo wipefs --all /dev/sdb
sudo wipefs --all /dev/sdc
sudo 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:

bash 复制代码
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:

bash 复制代码
sudo mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sda /dev/sdb
sudo mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/sdc /dev/sdd

这会创建两个 RAID 1 阵列,每对磁盘形成一个镜像。

创建 RAID 5(带奇偶校验的条带化)阵列

如果你希望实现性能和冗余的平衡,RAID 5 是一个不错的选择,它提供奇偶校验,能够承受一个磁盘故障:

bash 复制代码
sudo mdadm --create /dev/md0 --level=5 --raid-devices=4 /dev/sda /dev/sdb /dev/sdc /dev/sdd

创建 RAID 10(镜像 + 条带化)阵列

RAID 10 提供了较好的性能和冗余,适合需要较高性能和数据保护的应用:

bash 复制代码
sudo mdadm --create /dev/md0 --level=10 --raid-devices=4 /dev/sda /dev/sdb /dev/sdc /dev/sdd

步骤 4:查看 RAID 阵列状态

创建 RAID 阵列后,使用以下命令来检查阵列的状态:

bash 复制代码
sudo mdadm --detail /dev/md0

这将显示 /dev/md0 阵列的详细信息,包括阵列的健康状态、磁盘的状态等。

步骤 5:格式化 RAID 阵列

创建 RAID 阵列后,你需要为其创建文件系统。通常使用 ext4xfs 文件系统。以下是格式化 RAID 阵列的命令:

bash 复制代码
sudo mkfs.ext4 /dev/md0

步骤 6:挂载 RAID 阵列

创建并格式化 RAID 阵列后,你需要将其挂载到文件系统中。

bash 复制代码
sudo mkdir /mnt/raid
sudo mount /dev/md0 /mnt/raid

步骤 7:自动挂载 /etc/fstab

如果你希望在每次启动时自动挂载 RAID 阵列,可以将其添加到 /etc/fstab 文件中。

bash 复制代码
# 首先,获取阵列的 UUID
sudo blkid /dev/md0

然后编辑 /etc/fstab 文件并添加以下行:

shell 复制代码
UUID=<uuid_from_blkid> /mnt/raid ext4 defaults 2 0

步骤 8:监控和管理

使用 mdadm 来监控 RAID 阵列的状态,并检查是否有任何磁盘故障或阵列问题。

bash 复制代码
sudo mdadm --detail /dev/md0

针对 AFA 的读写放大问题,可以采用以下这条流程测试和监控:

✍️ 番外篇:iostat 监测磁盘 I/O|fio 压测

1️⃣ 使用 iostat 监控磁盘 I/O

iostat 可以显示磁盘的读写性能,但它并不直接提供写放大倍数。不过你可以通过 总写入量实际写入量 来间接推算。例如:

bash 复制代码
iostat -x 1

详细信息解释:

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:更新统计信息的时间间隔,单位为秒
bash 复制代码
$ iostat [options] [interval] [count]
  • interval:统计的更新频率,单位为秒。例如,每 5 秒刷新一次统计信息。
  • count:显示多少次统计信息。例如,iostat 5 3 表示每隔 5 秒输出一次统计信息,总共输出 3 次。

2️⃣ 使用 fio 进行基准测试

fio 可以用来生成 I/O 工作负载,测试不同类型的读写模式,从而间接估算 RAID 阵列和 SSD 的性能表现。

你可以通过特定的测试配置来模拟写操作,并计算写放大,比如:

bash 复制代码
# 全盘顺序写
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)情况

bash 复制代码
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.
相关推荐
m0_694938011 小时前
Leetcode打卡:字符串及其反转中是否存在同一子字符串
linux·服务器·leetcode
飞的肖2 小时前
从测试服务器手动热部署到生产环境的实现
java·服务器·系统架构
看星星的派大星2 小时前
rk3588 android12 root
linux
飘飘燃雪2 小时前
Linux Modbus协议详解,代码示例
linux·运维·服务器·modbus
蜗牛hb2 小时前
Kali基础知识
linux·运维·服务器
乐维_lwops3 小时前
安全筑堤,效率破浪 | 统一运维管理平台下的免密登录应用解析
运维·服务器·安全
云飞云共享云桌面3 小时前
如何让企业研发设计团队低配电脑流畅做3D大装配设计?
服务器·3d·电脑
恩爸编程3 小时前
深入浅出 Linux 操作系统
linux·运维·服务器·linux系统介绍·linux操作系统介绍·linux操作系统是什么·linux操作是什么
马船长3 小时前
RCE-PLUS (学习记录)
java·linux·前端
Liveweb视频汇聚平台3 小时前
FFmpeg来从HTTP拉取流并实时推流到RTMP服务器
服务器·http·ffmpeg