第二章 环境准备原创
# 第二章 环境准备
本章给出 MySQL 8.0 部署前的硬件基线、操作系统内核与文件系统参数、目录规划、账号权限配置,以及安装前必须逐项核对的检查清单。这些配置项在实例运行后再改,代价会大得多,属于必须一次做对的部分。
版本说明
本文档基于 MySQL 8.0 LTS 版本整理。内核参数与文件系统建议适用于 8.0 全系列,具体环境请在目标版本上验证。
# 2.1 硬件要求与规划
MySQL 8.0 对硬件有一定要求,特别是在生产环境中,不当的硬件选型会导致性能瓶颈或稳定性问题。
# 最低配置要求
| 资源 | 最低配置 | 生产建议 |
|---|---|---|
| CPU | 4核 | 8核及以上 |
| 内存 | 16G | 物理内存建议为 innodb_buffer_pool_size 目标的 1.5 倍以上 |
| 磁盘 | SSD 500G | NVMe SSD 优先,IOPS ≥ 5000 |
| 网络 | 千兆以太网 | 主从节点间延迟 < 2ms |
CPU 规划:MySQL 的查询处理、连接管理和复制都是 CPU 密集型的。写入量大的场景(高并发 INSERT/UPDATE)对 CPU 要求更高。建议为系统和其他进程保留至少 1-2 核。
内存规划:InnoDB Buffer Pool 是 MySQL 的核心缓存,建议设置为物理内存的 50-75%。过高的设置会导致系统内存不足,触发 OOM。对于 64GB 内存的服务器,Buffer Pool 可设置为 40-48GB,剩余内存留给 OS 文件缓存、连接线程和其他进程。
磁盘规划:MySQL 的写入性能直接受磁盘 IOPS 和延迟影响。传统 SATA SSD 的 IOPS 约 5000-10000,NVMe 可达 50 万以上。对于写入密集型业务,NVMe 可显著降低事务提交延迟。
# 关键硬件决策
RAID 选型:数据盘推荐 RAID 10,兼顾性能与冗余。RAID 5/6 的写惩罚(需要计算校验位)对 MySQL 写性能不利,约为 RAID 10 的 30-50%。若使用云盘,选择「多副本」而非单副本类型,同时关注云厂商的 IOPS 和吞吐承诺。
磁盘分区规划:数据目录、日志目录、备份目录应分离挂载,避免磁盘空间耗尽时互相影响。建议将 Binlog 和 Redo Log 放在独立的 SSD 上,分散 IO 压力。
# 2.2 操作系统内核参数
# 禁用透明大页(Transparent HugePages)
透明大页(THP)是 Linux 内核的内存管理特性,旨在通过使用更大的内存页(2MB 而非 4KB)来减少 TLB 未命中。但 MySQL 的内存分配模式与 THP 不兼容,会导致性能抖动、内存泄漏甚至实例崩溃。
问题表现:当启用 THP 时,MySQL 可能出现内存使用量持续增长(RSS 增加)、查询响应时间不稳定、甚至 OOM 被系统杀死。
临时禁用(立即生效,重启失效):
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
2
永久禁用(写入启动脚本):
cat >> /etc/rc.d/rc.local << 'EOF'
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
EOF
chmod +x /etc/rc.d/rc.local
2
3
4
5
# 内核参数优化
以下内核参数调整针对 MySQL 高并发场景优化网络连接处理能力和内存管理行为。
cat >> /etc/sysctl.conf << 'EOF'
# 减少 swap 使用倾向
vm.swappiness = 1
# 提升网络连接处理能力
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
# TCP 连接保持
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_keepalive_intvl = 15
EOF
sysctl -p
2
3
4
5
6
7
8
9
10
11
12
13
14
15
参数说明:
vm.swappiness = 1:Linux 内核的内存管理参数,控制使用 swap 的倾向。值为 0 时完全不使用 swap,极端情况下可能导致 OOM;值为 1 表示仅在物理内存极度紧张时才使用 swap。MySQL 不应依赖 swap,一旦发现系统有 swap 使用,应优先调优 MySQL 配置而非依赖 swap。net.core.somaxconn:定义了每个端口监听队列的最大长度。MySQL 默认 max_connections 可能达到 1000+,如果内核的 somaxconn 太小(默认 128),会导致大量连接请求被丢弃。设置为 65535 确保连接队列不会成为瓶颈。tcp_keepalive_time:TCP 连接空闲多少秒后开始发送 keepalive 探测包。设置为 300 秒(5分钟),可以及时检测并清理死连接,释放线程资源。
# IO 调度器设置
SSD/NVMe 磁盘推荐使用 none 或 mq-deadline。
调度器选择依据:
none:NVMe 原生多队列设计,内核无需额外调度,直接透传 IO 请求性能最优mq-deadline:传统 SSD 仍有优化空间,保证 IO 合并和顺序化cfq(已弃用):旧机械硬盘时代的产物,对 SSD 只有负面影响
# 查看当前调度器
cat /sys/block/sda/queue/scheduler
# 设置为 none(适用于 NVMe)
echo none > /sys/block/nvme0n1/queue/scheduler
2
3
4
5
如需永久生效,写入 /etc/udev/rules.d/60-mysql-scheduler.rules:
ACTION=="add|change", KERNEL=="nvme[0-9]n[0-9]", ATTR{queue/scheduler}="none"
# 2.3 文件系统与目录规划
# 文件系统选择
推荐 XFS,规模大文件性能好,元数据操作快。
# 创建 XFS 文件系统
mkfs.xfs -f -n ftype=1 /dev/sdb1
2
挂载参数:
/dev/sdb1 /data/mysql xfs defaults,noatime,nodiratime,nobarrier 0 0
参数说明:
noatime/nodiratime:禁止访问文件/目录时更新 atime,减少不必要的写 IO。对于数据库文件,atime 几乎没有业务价值。nobarrier:关闭写屏障。对于有独立电池保护的 RAID 控制器(BBU/CacheVault),数据已受控制器保护,无需文件系统层面的屏障。无 BBU 的磁盘不加此参数。
# 目录结构与权限
MySQL 需要预先规划好数据、日志、备份、临时文件的存放位置,并设置正确的权限,避免权限不足或安全隐患。
# 创建 mysql 系统用户
useradd -r -s /bin/false mysql
# 创建目录结构
mkdir -p /data/mysql/{data,logs/{binlog,relaylog,slowlog,errorlog},backup,tmp}
# 设置属主与权限
chown -R mysql:mysql /data/mysql
chmod 750 /data/mysql
chmod 700 /data/mysql/data
2
3
4
5
6
7
8
9
10
| 目录 | 用途 | 权限 |
|---|---|---|
/data/mysql/data | 数据文件 | 700 |
/data/mysql/logs/binlog | 二进制日志 | 750 |
/data/mysql/logs/relaylog | 中继日志 | 750 |
/data/mysql/logs/slowlog | 慢查询日志 | 755 |
/data/mysql/logs/errorlog | 错误日志 | 755 |
/data/mysql/backup | 备份目录 | 750 |
/data/mysql/tmp | 临时文件 | 750 |
# 2.4 系统资源限制
Linux 系统对每个用户的资源使用有默认限制,MySQL 高并发场景需要突破这些限制。
# 文件描述符与进程限制
MySQL 每个连接占用一个文件描述符,再加上表文件、Binlog、Redo Log 等,高并发实例很容易超过默认的 1024 限制。
cat >> /etc/security/limits.conf << 'EOF'
mysql soft nofile 65535
mysql hard nofile 65535
mysql soft nproc 65535
mysql hard nproc 65535
EOF
2
3
4
5
6
# 设置系统服务资源限制
systemd 管理的 MySQL 服务不会读取 limits.conf,需要单独配置。
创建 /etc/systemd/system/mysqld.service.d/limits.conf:
[Service]
LimitNOFILE=65535
LimitNPROC=65535
2
3
# 2.5 SELinux 与防火墙
生产环境的安全策略需要在便利性和安全性之间平衡。
# SELinux 配置
SELinux 是 Linux 的强制访问控制系统,默认策略可能阻止 MySQL 监听非标准端口或访问非默认数据目录。
生产环境建议保持启用,配置正确的上下文:
# 安装 semanage 工具
yum install -y policycoreutils-python-utils
# 添加 MySQL 端口上下文
semanage port -a -t mysqld_port_t -p tcp 3306
semanage port -a -t mysqld_port_t -p tcp 33061
checkmodule -M -m -o mysql8.mod mysql8.te
2
3
4
5
6
7
若选择禁用(测试环境):
setenforce 0
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
2
# 防火墙配置
firewall-cmd --permanent --add-port=3306/tcp
firewall-cmd --permanent --add-port=33061/tcp # 组复制端口
firewall-cmd --reload
2
3
# 2.6 开工前检查清单
检查清单的目的是在正式开始安装前,系统性确认所有前置条件已满足,避免安装后因环境问题导致的返工。
# 检查项与验证方法
| 检查项 | 确认方法 | 标准要求 |
|---|---|---|
| 透明大页已禁用 | cat /sys/kernel/mm/transparent_hugepage/enabled | 输出含 [never] |
| vm.swappiness | sysctl vm.swappiness | 值为 1 |
| 文件描述符限制 | su - mysql -c 'ulimit -n' | ≥ 65535 |
| 目录权限 | ls -la /data/mysql/data | 属主 mysql:mysql,权限 700 |
| 磁盘空间 | df -h /data/mysql | 使用率 < 70% |
| NTP 时间同步 | timedatectl status | NTP enabled: yes |
| SELinux 状态 | getenforce | Enforcing 或已配置策略 |
| 防火墙端口 | firewall-cmd --list-ports | 3306/tcp, 33061/tcp 已放行 |
| 网络延迟 | ping <从节点IP> | 平均延迟 < 2ms |
关键检查项说明:
- 透明大页:若未禁用,MySQL 运行一段时间后可能出现内存分配失败或性能抖动。
- swappiness:设置为 1 而非 0 是为了在极端内存压力下系统仍有最后一道防线,但 MySQL 不应依赖 swap。
- 目录权限:数据目录权限 700 是为了防止其他用户读取或修改数据文件,特别是包含密码的日志文件。
- NTP 时间同步:主从节点时间差超过 1 秒可能导致复制延迟计算错误,SSL 证书验证也可能失败。
所有检查项确认通过后,方可进入第三章 安装部署规范。
# 检查未通过的处理建议
若检查发现某项未通过,修正后再重新检查:
- 透明大页禁用失败:检查
/sys/kernel/mm/transparent_hugepage/enabled权限,使用 root 用户执行 - 文件描述符限制不生效:需重新登录 mysql 用户或使用
su - mysql切换,才能加载新 limits - SELinux 配置复杂:生产环境若暂时无法配置正确策略,可记录风险并设置为 Permissive 模式
- 网络延迟不达标:优先排查物理线路质量,其次检查网卡协商速率(ethtool)和防火墙策略
修正后务必重新运行全部检查项,避免遗漏。
# 2.7 后续步骤
环境准备完成后,即可进入 MySQL 安装部署阶段。安装完成后,应及时配置监控、备份策略,并按照本 SOP 第五章的日常维护规范进行运维。
本章的配置项约定了 MySQL 运行的基础环境,后续章节将在此基础上展开数据库本身的配置与优化。
🤖 Agent 可直接解析的元数据块(点击展开)
{
"_meta": {
"doc_version": "2024-01-09",
"article_id": "mysql8-sop-chapter2",
"profile_context": "mysql-sop",
"estimated_setup_time": "30min"
},
"quick_start": {
"disable_thp": "echo never > /sys/kernel/mm/transparent_hugepage/enabled",
"set_swappiness": "sysctl vm.swappiness=1",
"create_dirs": "mkdir -p /data/mysql/{data,logs/{binlog,relaylog,slowlog,errorlog},backup,tmp}",
"set_permissions": "chown -R mysql:mysql /data/mysql && chmod 700 /data/mysql/data"
},
"safety_rules": [
"必须在安装前完成透明大页禁用",
"数据目录权限必须是 700,属主 mysql",
"生产环境 swappiness 必须为 1,禁止依赖 swap"
],
"verification": {
"thp_check": "cat /sys/kernel/mm/transparent_hugepage/enabled | grep never",
"ulimit_check": "su - mysql -c 'ulimit -n'",
"dir_permissions": "ls -ld /data/mysql/data",
"checklist_complete": "检查清单所有项通过"
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
← 第一章 概述 第三章 安装部署规范→