mysql在虚拟机环境中部署的注意事项

1次阅读

虚拟机运行mysql需预留资源余量:内存至少1gb给os,innodb缓冲池设为50%–70%物理内存;cpu≥2核并启用热添加;磁盘优先ssd并调优io调度与挂载参数;强制ntp校时且禁用vm工具时间同步;网络用桥接或host-only避免nat问题。

mysql在虚拟机环境中部署的注意事项

虚拟机资源分配要留足余量

MySQL 对内存和磁盘 I/O 敏感,虚拟机若按最小化配置(比如 1GB 内存、单核 CPU、机械硬盘),mysqld 启动后可能频繁触发 swap,查询响应变慢甚至连接超时。InnoDB 缓冲池(innodb_buffer_pool_size)建议设为物理内存的 50%–70%,但虚拟机内存本身是共享宿主机资源的,必须预留至少 1GB 给 OS 和其他进程。

  • 避免将 innodb_buffer_pool_size 设为虚拟机总内存的 80% 以上
  • CPU 核数建议 ≥2,且开启虚拟机 CPU 热添加(如 VMware 的 cpuid.coresPerSocket 配置)便于后续扩容
  • 磁盘类型优先选 SSD 虚拟磁盘(如 VMware 的 lsilogic-sas + thin provisioned SSD 存储),禁用 ide 控制器

时间同步必须强制启用

虚拟机容易因 CPU 抢占或休眠导致系统时钟漂移,MySQL 的 binlog 时间戳、复制延迟计算、以及基于时间的备份策略(如 mysqldump --single-transaction)都依赖准确时间。若虚拟机时间比主库快 2 秒,GTID 复制可能报错 ER_MASTER_FATAL_ERROR_READING_BINLOG

  • 宿主机上启用 NTP(如 chronyd),并确保虚拟机禁用 vmware-toolsqemu-ga 的时间同步功能(避免双重校准冲突)
  • 虚拟机内运行:
    sudo timedatectl set-ntp true
  • 验证:
    timedatectl status | grep "System clock synchronized"

    输出应为 yes

网络配置需绕过 NAT 模式直连

使用 NAT 模式时,MySQL 客户端连接常出现 Can't connect to MySQL server on 'xxx' (113) 或连接后偶发中断,本质是虚拟交换机对长连接保活支持弱,且源端口映射不稳定。桥接(Bridged)或 Host-only + 端口转发更可靠。

  • 开发/测试环境:用 Bridged 模式,让虚拟机获得与宿主机同网段 IP,直接配置 bind_address = 0.0.0.0 并开放防火墙 3306 端口
  • 生产模拟环境:用 Host-only + iptables DNAT 或 VirtualBox 的端口转发规则,避免暴露到外网
  • 务必检查 skip-networking 是否为 OFF,且 mysql.user 表中用户 host 字段不能全写 localhost(它走 socket,不走 TCP)

磁盘 IO 调度与挂载参数要调优

虚拟机默认的 ext4 文件系统挂载选项(如 data=ordered)和宿主机 IO 调度器(如 cfq)会放大随机写延迟,InnoDB 的 doublewrite bufferredo log 刷盘易卡住,表现为 SHOW ENGINE INNODB STATUSLOG 部分 pending log writes 持续非零。

  • 挂载时加参数:
    mount -o defaults,noatime,nodiratime,barrier=1 /dev/sdb1 /var/lib/mysql
  • 禁用虚拟机内 deadlinecfq 调度器,改用 none(适用于 VMware/VirtualBox 的 paravirtual SCSI):
    echo none | sudo tee /sys/block/sdb/queue/scheduler
  • 确认 innodb_flush_log_at_trx_commit = 1(保障 ACID)但搭配 sync_binlog = 1 时,务必确保磁盘写入性能达标,否则 TPS 会断崖下跌

虚拟机里跑 MySQL,最麻烦的不是装不上,而是性能毛刺和时序错乱——这两样问题往往在压测后期或凌晨备份时才暴露,查日志又没明显报错。动手前先盯紧宿主机资源水位、虚拟机时钟源、以及磁盘 IO 路径是否真正直通。

text=ZqhQzanResources