在 CentOS 或 Ubuntu 上部署 MySQL 生产环境时,配置的核心目标是稳定性、高可用性和性能。以下是一份经过验证的推荐配置清单,涵盖系统层、MySQL 层及运维层面。
一、操作系统层优化(CentOS / Ubuntu)
1. 内核参数调优
修改 /etc/sysctl.conf 并执行 sysctl -p:
# 增加文件描述符限制
fs.file-max = 6553500
# 增加进程最大数
kernel.pid_max = 4096
# 网络参数优化(提升并发连接能力)
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 5000
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl = 30
# 内存管理优化
vm.swappiness = 10 # 降低 swap 使用倾向
vm.overcommit_memory = 1 # 允许过度分配内存(适合 MySQL)
💡 注意:Ubuntu 默认可能已启用
transparent huge pages (THP),建议关闭以避免性能抖动:echo never > /sys/kernel/mm/transparent_hugepage/enabled echo never > /sys/kernel/mm/transparent_hugepage/defrag
2. 文件系统与磁盘 I/O
- 文件系统:推荐使用 XFS(CentOS 默认)或 ext4(Ubuntu),避免使用 NFS 作为数据盘。
- 挂载选项:对数据目录所在分区添加
noatime,nodiratime减少写入开销:/dev/sdb1 /var/lib/mysql xfs,noatime,nodiratime,defaults 0 0 - I/O 调度器:SSD 建议使用
none或mq-deadline;HDD 使用deadline或bfq。echo mq-deadline > /sys/block/sda/queue/scheduler
3. 用户与权限
- 创建专用用户运行 MySQL:
useradd -r -s /bin/false mysql chown -R mysql:mysql /var/lib/mysql chmod 750 /var/lib/mysql
二、MySQL 核心配置(my.cnf / my.ini)
将以下内容放入 /etc/my.cnf(主配置文件)的 [mysqld] 段:
[mysqld]
# 基础设置
basedir = /usr
datadir = /var/lib/mysql
socket = /var/lib/mysql/mysql.sock
port = 3306
user = mysql
# 字符集(生产环境推荐 utf8mb4)
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
# 连接相关
max_connections = 500
max_allowed_packet = 128M
wait_timeout = 28800
interactive_timeout = 28800
# InnoDB 关键配置(根据内存调整)
innodb_buffer_pool_size = 70% of total RAM # 例如 16G 内存设为 11G
innodb_log_file_size = 512M
innodb_log_buffer_size = 64M
innodb_flush_method = O_DIRECT # 避免双重缓冲
innodb_flush_log_at_trx_commit = 1 # 保证事务安全(可考虑 2 提升性能但牺牲部分安全性)
innodb_file_per_table = 1
innodb_stats_on_metadata = 0
innodb_read_io_threads = 8
innodb_write_io_threads = 8
innodb_thread_concurrency = 0 # 自动优化
# 日志与备份
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
log_error = /var/log/mysql/error.log
# 其他
skip-name-resolve = 1 # 禁用 DNS 解析提速连接
tmp_table_size = 256M
max_heap_table_size = 256M
⚠️ 内存计算示例:
若服务器有 32GB RAM:
innodb_buffer_pool_size = 22G(约 70%)- 预留 4GB 给 OS + 其他进程
- 避免设置
query_cache_size(MySQL 8.0 已移除,5.7 中生产环境通常禁用)
三、高可用与监控建议
1. 高可用方案(根据需求选择)
- 主从复制(Master-Slave):基础架构必备,用于读写分离和灾备。
- MHA / Orchestrator:自动故障转移。
- InnoDB Cluster / MySQL Group Replication:强一致性集群(推荐用于关键业务)。
- ProxySQL / Proxy:实现智能路由、连接池、缓存等。
2. 监控体系
- Prometheus + Grafana:采集
mysql_exporter指标,可视化展示 QPS、TPS、延迟、锁等待等。 - 慢查询分析:定期分析
slow.log,配合pt-query-digest工具。 - 告警:配置 CPU、内存、磁盘、主从延迟、连接数等阈值告警。
3. 备份策略
- 每日全量备份(XtraBackup / mysqldump),每小时增量备份。
- 备份文件加密存储,异地保留至少 3 份。
- 定期演练恢复流程。
四、安全加固
- 删除默认账户(如
root@localhost以外的 root 登录)。 - 仅允许应用服务器 IP 访问 MySQL 端口(防火墙规则 +
bind-address限制)。 - 启用 SSL/TLS 加密连接。
- 定期更新 MySQL 版本(关注 CVE 漏洞)。
- 最小权限原则:为每个应用创建独立账号,仅授予必要权限。
五、版本选择建议
| 场景 | 推荐版本 |
|---|---|
| 新项目 | MySQL 8.0 LTS(支持 JSON、窗口函数、更好的性能) |
| 旧系统兼容 | MySQL 5.7(仍在维护至 2023 年底,建议尽快迁移) |
| 云原生环境 | 考虑托管服务(如 AWS RDS、阿里云 RDS)减少运维负担 |
六、部署注意事项
- 不要使用官方预编译包直接跑在生产环境,建议通过源码编译或使用官方 RPM/DEB 包。
- 禁止在数据库服务器上运行其他重负载服务(如 Web、Redis 等)。
- 定期执行
ANALYZE TABLE和OPTIMIZE TABLE(针对碎片化严重的表)。 - 压测验证:上线前进行压力测试(如 sysbench),确认配置合理性。
如需针对具体硬件规格(如 CPU 核数、内存大小、磁盘类型)定制配置参数,可提供详细信息,我可进一步给出精细化建议。
CLOUD技术笔记