如何在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
CPU 2× 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

bash 复制代码
# 查看设备
lsblk

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

3.2 创建 PV(Physical Volume)

bash 复制代码
pvcreate /dev/nvme0n1 /dev/nvme1n1
pvcreate /dev/nvme2n1

3.3 创建 VG(Volume Group)

bash 复制代码
vgcreate vg_db /dev/nvme0n1 /dev/nvme1n1
vgcreate vg_cache /dev/nvme2n1

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

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

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

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

bash 复制代码
lvconvert --type cache --cachepool vg_cache/lv_cachepool vg_db/lv_db

3.6 创建文件系统

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

bash 复制代码
mkfs.xfs /dev/vg_db/lv_db

创建挂载目录并挂载:

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

bash 复制代码
for blk in /sys/block/nvme*; do
  echo none > $blk/queue/scheduler
done

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

在 MySQL 配置:

ini 复制代码
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 测试参数

bash 复制代码
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--5ms 0.9--1.8ms
99th 百分位延迟 8ms 2.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 的高级特性,不仅能提升单机性能,还能为后续分库分表、主备切换等架构演进打下扎实基础。

相关推荐
NineData3 小时前
数据库迁移总踩坑?用 NineData 迁移评估,提前识别所有兼容性风险
数据库·程序员·云计算
赵渝强老师5 小时前
【赵渝强老师】PostgreSQL中表的碎片
数据库·postgresql
全栈老石9 小时前
拆解低代码引擎核心:元数据驱动的"万能表"架构
数据库·低代码
YuMiao11 小时前
gstatic连接问题导致Google Gemini / Studio页面乱码或图标缺失问题
服务器·网络协议
倔强的石头_1 天前
kingbase备份与恢复实战(二)—— sys_dump库级逻辑备份与恢复(Windows详细步骤)
数据库
jiayou642 天前
KingbaseES 实战:深度解析数据库对象访问权限管理
数据库
李广坤3 天前
MySQL 大表字段变更实践(改名 + 改类型 + 改长度)
数据库
Sinclair3 天前
简单几步,安卓手机秒变服务器,安装 CMS 程序
android·服务器
Rockbean4 天前
用40行代码搭建自己的无服务器OCR
服务器·python·deepseek
爱可生开源社区4 天前
2026 年,优秀的 DBA 需要具备哪些素质?
数据库·人工智能·dba