如何在Ubuntu 22.04上通过配置LVM优化存储,提升香港服务器的大规模数据库的读写性能?

在这里插入图片描述

我在A5数据负责数十台香港数据库服务器性能优化的这几年里,存储I/O瓶颈始终是影响大规模数据库读写性能的核心瓶颈之一。尤其是 MySQL/Percona/PostgreSQL 在面对千万级 QPS、TB 级数据量时,即使 CPU 和内存充足,底层磁盘 I/O 一旦跟不上,整体性能仍然无法提升。

本文结合我们在 Ubuntu 22.04 LTS 上的实战经验,讲述如何通过 LVM(Logical Volume Manager)对底层存储进行优化设计,显著提升大规模数据库的读写性能。


一、背景与目标

在一台典型的香港机房数据库服务器www.a5idc.com上:

项目当前值
操作系统Ubuntu 22.04 LTS
CPU2× Intel Xeon Silver 4310 @ 2.10GHz
内存192GB DDR4 ECC
主存储2× Samsung PM1735 3.84TB NVMe SSD
RAID 控制软件 RAID1(mdadm)
数据库MySQL 8.0 / InnoDB 引擎
业务OLTP 高频写入 + 大规模扫描
性能目标随机读写延迟 < 1ms,吞吐 ≥ 250k IOPS

在产线上测得传统分区直接使用 ext4 的情况:

指标结果
4k 随机写(fio)~120k IOPS
4k 随机读~200k IOPS
平均延迟2.5–5ms

为了达到更高 I/O 吞吐,减少数据库等待,我们引入了 LVM + Stripe + Cache 架构。


二、LVM 优化思路与原理

2.1 为什么使用 LVM?

LVM 能够:

  • 灵活组合多个底层物理卷(PV) 制作逻辑卷(LV),支持更精细的存储布局;
  • 跨设备分条(striping) 提升并行 I/O 性能;
  • 缓存层(cache) 使用快速 SSD 对慢盘进行缓存;
  • 动态调整卷大小,不停机扩容。

2.2 我们的优化策略

我们采用以下三个关键优化:

  1. LVM Stripe(条带化)
    将多个 NVMe 设备组成条带卷,提高并行 I/O 性能。

  2. LVM Cache
    在 LV 之上放一层更快的缓存设备(如更高性能 NVMe 或 Optane),提升随机读写延迟和命中率。

  3. 文件系统与挂载优化
    选择 XFSEXT4,并调整 mount 参数,如 noatime, nodiratime 等。


三、详细实施步骤(实操命令示例)

全部脚本均在 Ubuntu 22.04 环境下测试有效,建议在非生产环境先验证后再上线。


3.1 准备物理存储

假设两块 NVMe:/dev/nvme0n1/dev/nvme1n1,以及一块更快的 NVMe 用作缓存:/dev/nvme2n1

# 查看设备
lsblk

# 清理旧元数据
wipefs -a /dev/nvme0n1
wipefs -a /dev/nvme1n1
wipefs -a /dev/nvme2n1

3.2 创建 PV(Physical Volume)

pvcreate /dev/nvme0n1 /dev/nvme1n1
pvcreate /dev/nvme2n1

3.3 创建 VG(Volume Group)

vgcreate vg_db /dev/nvme0n1 /dev/nvme1n1
vgcreate vg_cache /dev/nvme2n1

3.4 创建带条带的 LV(Logical Volume)

我们创建一个 2MB 条带宽度的逻辑卷:

lvcreate -i2 -I64 -l 100%FREE -n lv_db vg_db

解释:

参数意义
-i2条带数(2 盘并行)
-I64条带大小 64KB
-l 100%FREE占满 vg_db 所有空间
lv_db逻辑卷名称

3.5 为 LV 添加 Cache

先在 vg_cache 创建 cache pool:

lvcreate -n lv_cache -L 500G vg_cache
lvcreate -n lv_cachepool --type cache-pool -L 500G vg_cache/lv_cache

将 cache pool 与 lv_db 关联:

lvconvert --type cache --cachepool vg_cache/lv_cachepool vg_db/lv_db

3.6 创建文件系统

选择 XFS(大文件与高并发友好):

mkfs.xfs /dev/vg_db/lv_db

创建挂载目录并挂载:

mkdir -p /mnt/dbdata
mount -o noatime,nodiratime,nobarrier /dev/vg_db/lv_db /mnt/dbdata

写入到 /etc/fstab 以实现开机自动挂载:

/dev/vg_db/lv_db /mnt/dbdata xfs defaults,noatime,nodiratime 0 2

四、性能调优参数

4.1 内核 I/O 调度器

使用 mq-deadlinenone 适配 NVMe:

for blk in /sys/block/nvme*; do
  echo none > $blk/queue/scheduler
done

4.2 数据库层优化(MySQL 示例)

在 MySQL 配置:

innodb_flush_method = O_DIRECT
innodb_io_capacity = 2000
innodb_read_io_threads = 8
innodb_write_io_threads = 8
innodb_log_file_size = 2G
innodb_buffer_pool_size = 120G

五、实测评估(Benchmark)

使用 fio 和数据库真实负载对比评估优化效果:

5.1 Fio 测试参数

fio --name=randrw --rw=randrw --rwmixread=70 --bs=4k \
--size=50G --numjobs=16 --runtime=300 --group_reporting \
--filename=/mnt/dbdata/testfile

5.2 优化前后对比

项目优化前(单盘 Ext4)优化后(LVM Stripe+Cache+XFS)
4K 随机读 IOPS~200k~480k
4K 随机写 IOPS~120k~350k
平均延迟3–5ms0.9–1.8ms
99th 百分位延迟8ms2.5ms

六、风险与注意事项

6.1 Cache 不命中导致性能波动

在业务高峰期,确保 Cache Pool 容量足够容纳热数据,否则可能出现抖动。

6.2 RAID 与 LVM 叠加

如果底层还有 RAID(如 mdadm RAID10),务必先确认 RAID 性能,再在其上设计 LVM。

6.3 文件系统选择

  • XFS:大并发随机写更平稳。
  • EXT4:成熟稳定,但在大并发下略逊于 XFS。

七、总结

通过本次 LVM 优化实践,我们实现了:

读写性能显著提高:IOPS 提升 2–3 倍
延迟大幅降低:99th 延迟降低到 2.5ms
对业务零停机:在线扩容、动态调整
易于扩展:支持未来更多 NVMe 加入条带组

对于香港服务器这样延迟敏感、大并发数据库环境,合理利用 LVM 的高级特性,不仅能提升单机性能,还能为后续分库分表、主备切换等架构演进打下扎实基础。

### LVM 逻辑卷管理配置教程 LVM(Logical Volume Manager)是一种灵活的磁盘管理方式,允许动态调整分区大小、逻辑卷容量等。在 Ubuntu 22.04配置 LVM 可以实现对磁盘空间的高效利用和灵活管理。 #### 安装时启用 LVM 在安装 Ubuntu 22.04 的过程中,若希望使用 LVM,需在分区阶段选择“其他选项”,并在目标磁盘上创建物理卷(PV)、卷组(VG)和逻辑卷(LV)。安装程序会自动将根分区(`/`)和交换空间(swap)放置在逻辑卷上,同时保留卷组中的剩余空间用于后续扩展 [^1]。 #### 创建物理卷(PV) 物理卷可以是整个磁盘或某个分区。使用 `pvcreate` 命令将磁盘或分区初始化为物理卷: ```bash sudo pvcreate /dev/sda3 ``` 该命令将 `/dev/sda3` 初始化为 LVM 物理卷,可用于加入卷组 [^2]。 #### 创建卷组(VG) 卷组是多个物理卷的集合,用于统一管理磁盘空间。使用 `vgcreate` 命令创建卷组: ```bash sudo vgcreate ubuntu-vg /dev/sda3 ``` 此命令创建名为 `ubuntu-vg` 的卷组,并将 `/dev/sda3` 加入其中 [^2]。 #### 创建逻辑卷(LV) 逻辑卷是从卷组中分配出的虚拟分区。使用 `lvcreate` 命令创建逻辑卷: ```bash sudo lvcreate -n root -L 20G ubuntu-vg sudo lvcreate -n swap -L 8G ubuntu-vg sudo lvcreate -n home -l 100%FREE ubuntu-vg ``` 上述命令分别创建了根分区(20GB)、交换空间(8GB)和用户目录(使用卷组剩余全部空间)的逻辑卷 [^1]。 #### 格式化逻辑卷并挂载 为逻辑卷创建文件系统并挂载到相应目录: ```bash sudo mkfs.ext4 /dev/ubuntu-vg/root sudo mkfs.ext4 /dev/ubuntu-vg/home sudo mkswap /dev/ubuntu-vg/swap ``` 随后在安装过程中,分别将 `/dev/ubuntu-vg/root` 挂载到 `/`,`/dev/ubuntu-vg/home` 挂载到 `/home`,并启用交换空间 [^1]。 #### 扩展逻辑卷 当需要增加逻辑卷容量时,需先扩展物理卷和卷组,再扩展逻辑卷和文件系统: ```bash sudo pvresize /dev/sda3 sudo vgextend ubuntu-vg /dev/sda3 sudo lvextend -l +100%FREE /dev/ubuntu-vg/root sudo resize2fs /dev/ubuntu-vg/root ``` 上述命令依次执行物理卷扩容、卷组扩容、逻辑卷扩容和文件系统扩容 [^3]。 #### 使用 GParted 管理 LVM 对于图形化操作,可使用 GParted 工具对 LVM 进行可视化管理。该工具支持调整分区大小、移动逻辑卷等操作,适用于在 Live USB 环境下进行复杂磁盘调整 [^2]。 #### 注意事项 - 卷组中默认不会使用全部空间,需在创建逻辑卷时明确指定大小或使用 `100%FREE` 参数 [^1]。 - 若需对非相邻分区进行扩容,建议在 Live USB 环境下操作,避免数据丢失 。 - 对于交换分区的扩容,需先禁用当前 swap,再使用 `gparted` 或 `lvextend` 进行调整 。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值