加油
努力

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

在低配服务器上同时运行 MySQL 和 Redis,核心挑战在于内存竞争。MySQL 是“吃内存大户”(主要靠 buffer pool),而 Redis 是“内存依赖型”(数据全在 RAM)。如果配置不当,极易触发 OOM(内存溢出)导致服务崩溃。

以下是针对低配服务器(通常指 1GB – 4GB 内存)的推荐配置策略:

1. 核心原则:预留系统缓冲

无论服务器配置多低,必须为操作系统内核、文件系统缓存和其他进程预留至少 20%~30% 的内存。不要试图把内存全部分配给数据库。

  • 1GB 内存极不推荐同时运行生产环境的 MySQL + Redis。如果必须运行,建议仅用于开发/测试,且限制非常严格。
  • 2GB 内存:勉强可行,需极度精简配置。
  • 4GB 内存:比较理想的入门级生产环境。

2. 具体配置方案

场景 A:1GB ~ 2GB 内存(极限生存模式)

此场景下,必须牺牲性能换取稳定性,优先保证 Redis 或 MySQL 其中一个存活。

组件 关键参数设置 说明
Redis maxmemory-policy: allkeys-lru
maxmemory: 600MB (约占总内存 50%)
Redis 默认会占用所有可用内存。必须强制限制,否则 MySQL 启动即被杀。开启 LRU 淘汰策略防止内存爆满。
MySQL innodb_buffer_pool_size: 300MB
key_buffer_size: 64MB
query_cache_size: 0 (关闭)
InnoDB 缓冲池要设小,避免抢占 Redis 内存。关闭查询缓存(MySQL 5.7+ 已废弃,但旧版本务必关闭)。
若使用 MyISAM 引擎,可稍调大 key_buffer,但强烈建议全用 InnoDB。
System vm.swappiness: 10 降低系统使用 Swap 的倾向,虽然低配机容易 Swap,但尽量不让 DB 频繁换页。

注意:在此配置下,MySQL 的并发能力极低,仅适合低频访问;Redis 只能存储少量热点数据。

场景 B:4GB 内存(推荐起步配置)

这是大多数小型应用(如个人博客、小型 SaaS)能跑通的底线。

组件 关键参数设置 说明
Redis maxmemory-policy: volatile-lruallkeys-lfu
maxmemory: 2.5GB
保留约 1.5GB 给系统和 MySQL。使用 LFU/LRU 策略让冷数据自动淘汰。
MySQL innodb_buffer_pool_size: 1.5GB
innodb_log_file_size: 256M
tmp_table_size: 64M
此时可以分配更多内存给 InnoDB 以提升查询速度。限制临时表大小,防止复杂查询撑爆内存。
System vm.swappiness: 10 保持低 Swap 倾向。

3. 优化与避坑指南

除了调整参数,以下操作对低配服务器至关重要:

A. 关闭不必要的功能

  • MySQL:
    • 关闭 log_bin(二进制日志):除非你需要主从复制或数据恢复,否则日志写入会消耗大量 I/O 和 CPU。
    • 关闭 slow_query_log:在生产环境高负载时,记录慢查询本身也会产生开销。
    • 调整 max_connections:低配服务器不要开太多连接,设为 50-100 即可,配合应用层连接池使用。
  • Redis:
    • 关闭持久化(RDB/AOF)中的部分选项:如果数据允许丢失,可以只开启 RDB 快照(频率调低),或者完全禁用持久化(仅限纯缓存场景)。
    • 禁用 appendonly yes 并设置为每秒同步一次,减少磁盘 I/O。

B. 监控与告警

低配服务器没有容错空间,必须安装轻量级监控:

  • 使用 htop 实时观察内存。
  • 配置简单的脚本监控:当内存使用率超过 85% 时,发送报警。
  • 检查 Swap 使用情况:如果 Swap 开始频繁使用,说明内存已经严重不足,性能会断崖式下跌。

C. 架构层面的替代方案

如果业务增长发现 4GB 内存不够用了,不要盲目加内存,考虑以下架构调整:

  1. 读写分离:将历史数据归档到冷存储,只留热数据在 MySQL。
  2. 分库分表:缩小单表数据量,减少索引内存占用。
  3. Redis 做唯一缓存:确保 Redis 里只存最热的 Key,不要存大对象(BigKey)。
  4. 迁移到云托管:如果预算允许,将 MySQL 迁移到云厂商的 RDS(按量付费),本地只跑 Redis,这样成本可能更低且更稳定。

总结建议

  • 最低配置:2GB 内存,Redis 限 600MB,MySQL 限 300MB,关闭日志。
  • 推荐配置:4GB 内存,Redis 限 2.5GB,MySQL 限 1.5GB。
  • 红线:永远不要让 MySQL Buffer Pool + Redis Max Memory > 物理内存的 70%

如果您的业务数据量预计会快速增长,建议在初期就规划好升级路线(如增加独立 Redis 节点或迁移至云数据库),而不是在单机上无限压榨配置。

云服务器