如何将MySQL数据库与NVMe SPDK结合使用?
SPDK接管数据库NVMe存储全链路配置步骤
前置环境准备
- 开启主板BIOS的VT-d/IO虚拟化功能,修改grub配置文件添加内核参数
iommu=pt intel_iommu=on,更新grub后重启系统,执行dmesg | grep -i iommu确认IOMMU已正常开启 - 下载对应版本SPDK源码编译安装,执行SPDK自带的
scripts/setup.sh脚本,将目标NVMe设备从内核原生NVMe驱动解绑,绑定到VFIO/UIO驱动,执行spdk_lspci确认设备已被SPDK成功接管 - 配置系统大页,建议分配系统总内存的70%作为1G尺寸大页,避免SPDK运行时出现内存不足问题
数据库对接配置
分两种场景选择适配方案:
场景1:数据库支持原生SPDK对接
(支持该特性的数据库包括MySQL SPDK分支、PostgreSQL SPDK分支、大部分分布式自研数据库等)
- 编译数据库时开启SPDK编译选项,例如MySQL编译时添加参数
-DWITH_SPDK=ON,同时指定SPDK头文件与动态库路径 - 修改数据库配置文件,指定数据存储路径为SPDK块设备路径(示例:
spdk://nvme0n1),配置SPDK IO队列深度和数据库并发请求量级匹配,建议设置为1024以上 - 启动数据库前加载SPDK环境初始化参数,指定对应NVMe设备的PCIe地址,避免启动时设备识别失败
场景2:数据库不支持原生SPDK对接
- 使用SPDK的NBD模块将SPDK管理的NVMe设备导出为系统块设备,执行命令:
spdk_nbd_start -b <SPDK块设备名> /dev/nbd0 - 将导出的
/dev/nbd0格式化后挂载到数据库数据目录,挂载时添加参数noatime,nodiratime,barrier=0,关闭系统不必要的IO调度和缓存 - 该方案兼容性高,无需修改数据库源码,性能比原生对接损失约10%,适合快速落地的场景
配置生效校验
- 执行
iostat查看原生NVMe设备的IO使用率,正常状态下使用率应为0(设备已被SPDK接管,内核层无感知) - 执行SPDK自带工具
spdk_top查看NVMe设备的IOPS、延迟数据,和数据库监控的请求量匹配即可确认所有IO请求均通过SPDK处理 - 压测验证:相同压力下,SPDK模式的随机写延迟比内核原生NVMe驱动低30%以上,符合该表现则配置正常
注意事项
- 禁止内核原生NVMe驱动和SPDK同时接管同一块NVMe设备,会触发设备冲突导致系统宕机
- 数据库层缓存和SPDK缓存不要重复开启,避免内存浪费和数据一致性问题
- 生产环境建议先做72小时压测验证,确认无IO异常、数据丢失问题后再上线
内容的提问来源于stack exchange,提问作者I am a horse
相关产品推荐
相关产品推荐

