在低配服务器上同时运行MySQL和Redis,推荐什么配置?

在低配服务器上同时运行 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

方案三:应用层优化

  1. 减少长连接:确保应用程序正确管理连接池,避免连接数过多导致 MySQL sort_buffer_size 累积耗尽内存。
  2. 缓存命中率:尽量提高 Redis 命中率,减少 MySQL 的读请求。
  3. 慢查询监控:开启 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),观察 topfree -h 命令下的内存变化,根据实际峰值微调上述参数。

云服务器