在低配服务器上同时运行 MySQL 和 Redis,核心挑战在于内存竞争。MySQL 和 Redis 都是对内存敏感的数据库,如果配置不当,极易触发 OOM(Out Of Memory)导致服务崩溃。
以下是针对不同场景的推荐配置策略和具体参数建议:
1. 硬件基准假设
为了给出具体数值,我们假设“低配服务器”的典型规格为:
- CPU: 2 核 – 4 核
- 内存: 1GB – 2GB (如果是 512MB,几乎无法同时运行这两个服务)
- 系统盘: SSD (机械硬盘会严重拖慢性能)
2. 核心原则:内存分配策略
黄金法则:预留 30%~40% 的系统内存给操作系统和其他进程。
不要将物理内存全部分配给数据库。
- 总内存 = 1GB: 极其紧张,建议只开一个主库 + 缓存,或者使用 Docker 限制资源。
- 总内存 = 2GB: 可以共存,但必须严格限制 MySQL 的缓冲池大小。
- 总内存 = 4GB: 比较舒适的低配环境。
3. 具体配置推荐
A. Redis 配置 (redis.conf)
Redis 的配置相对简单,主要关注最大内存限制。
| 参数 | 推荐值 (基于 2GB 内存) | 说明 |
|---|---|---|
maxmemory |
512MB | 设置为物理内存的 25%~30%。例如 2GB 机器设 512M。 |
maxmemory-policy |
allkeys-lru |
当内存满时,自动淘汰最久未使用的键。这是生产环境最推荐的策略。 |
appendonly |
yes |
开启 AOF 持久化,保证数据安全(低配机 I/O 弱,建议同步频率设为 everysec)。 |
save |
注释掉或延长间隔 | 低配 CPU 做 RDB 快照可能卡顿,优先依赖 AOF。 |
注意:如果服务器只有 1GB 内存,Redis 建议限制在 256MB 以内。
B. MySQL 配置 (my.cnf / mysql.cnf)
MySQL 是吃内存大户,必须严格控制 innodb_buffer_pool_size。
| 参数 | 推荐值 (基于 2GB 内存) | 说明 |
|---|---|---|
innodb_buffer_pool_size |
384MB – 512MB | 最关键参数。建议设置为物理内存的 25%~30%。不要超过 50%,否则容易 OOM。 |
innodb_log_file_size |
64MB – 128MB | 日志文件不宜过大,减少磁盘写入压力。 |
query_cache_size |
0 | 强烈建议关闭。MySQL 5.7+ 中查询缓存有锁竞争问题,且占用额外内存,低配机直接禁用。 |
key_buffer_size |
32MB – 64MB | 仅针对 MyISAM 引擎,现代项目多用 InnoDB,此项可设小。 |
thread_stack |
256K | 默认值通常足够,无需调大。 |
tmp_table_size / max_heap_table_size |
16MB – 32MB | 限制临时表在内存中的大小,防止溢出到磁盘拖慢速度。 |
sort_buffer_size |
1MB – 2MB | 每个连接都会分配此内存。连接数多时必须设小,避免并发高时瞬间爆内存。 |
join_buffer_size |
1MB – 2MB | 同上,每个连接分配,需保守设置。 |
4. 优化与避坑指南
方案一:Docker 资源限制(强烈推荐)
如果你使用 Docker 部署,直接在启动命令中限制资源是最安全的方法,避免配置写错导致宿主机崩溃。
# 示例:限制 Redis 最多用 256MB,MySQL 最多用 512MB
docker run -d --name redis --memory="256m" --cpus="0.5" redis:alpine
docker run -d --name mysql --memory="512m" --cpus="1.0" mysql:8.0
-e MYSQL_ROOT_PASSWORD=yourpassword
-e MYSQL_DATABASE=testdb
这样即使配置错误,Docker 也会强制杀掉容器,不会把整台服务器搞挂。
方案二:调整交换分区 (Swap)
低配服务器必须开启 Swap 分区作为最后一道防线。虽然 Swap 会降低性能,但它能防止 OOM Killer 直接杀死数据库进程。
- 操作:创建一个 2GB 的 Swap 文件。
sudo fallocate -l 2G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile # 修改 /etc/sysctl.conf 增加 vm.swappiness (建议 10-20,让系统更倾向于用物理内存) vm.swappiness=10
方案三:应用层优化
- 减少长连接:确保应用程序正确管理连接池,避免连接数过多导致 MySQL
sort_buffer_size累积耗尽内存。 - 缓存命中率:尽量提高 Redis 命中率,减少 MySQL 的读请求。
- 慢查询监控:开启 MySQL 慢查询日志(阈值设为 1s),及时优化 SQL,避免全表扫描消耗大量 CPU 和内存。
总结建议表
| 服务器内存 | Redis MaxMemory | MySQL Buffer Pool | Swap 建议 | 适用场景 |
|---|---|---|---|---|
| 1 GB | 256 MB | 256 MB | 必须 (2GB) | 仅适合极轻量级个人博客/测试 |
| 2 GB | 512 MB | 512 MB | 必须 (2GB) | 小型企业官网、SaaS 试用版 |
| 4 GB | 1 GB | 1 GB | 可选 (1GB) | 中小型电商、CRM 系统 |
最后提醒:在上线前,务必进行压力测试(如使用 sysbench 测 MySQL,redis-benchmark 测 Redis),观察 top 和 free -h 命令下的内存变化,根据实际峰值微调上述参数。
CLOUD技术笔记