先说结论:没有统一的“最低”标准,因为 Redis 和 MySQL 都是内存敏感型服务,且你的业务负载(QPS、数据量、连接数)直接决定了资源底线。
但如果我们讨论的是生产环境可用的最低配置(即能跑起来且不立即 OOM 崩溃),在 CentOS 7/8 或 Ubuntu 20.04/22.04 上,建议如下:
一、核心硬件底线(推荐起步配置)
| 组件 | 最低 CPU | 最低内存 (RAM) | 存储要求 |
|---|---|---|---|
| CPU | 2 vCPU / 2 Core | – | – |
| 内存 | – | 4 GB | – |
| 磁盘 | – | SSD/NVMe 优先,至少 20GB 可用空间 | IOPS 很重要 |
为什么是 4GB?
MySQL 默认启动需要 ~512MB-1GB 内存(取决于配置),Redis 如果缓存热点数据,哪怕只存几个 key,也建议预留 1GB+。系统本身 + Swap 交换分区也需要 ~1GB。低于 4GB 极易出现内存抖动、Swap 频繁导致性能断崖式下跌。
二、各服务独立资源分析
1. MySQL 资源需求
MySQL 是多进程/线程模型,每个连接都会消耗内存。
- innodb_buffer_pool_size:这是关键参数。通常设置为物理内存的 50%-70%。
- 在 4GB 机器上,建议设为
1G~2G。 - 如果设为过高,会导致其他进程被挤出内存,引发 Swap。
- 在 4GB 机器上,建议设为
- 连接数限制:
max_connections默认 151。如果应用并发高,需调高,但每增加一个连接,MySQL 会分配约256KB~1MB的线程栈和缓冲区。 - 最低实践:
- 关闭不必要的插件(如 archive, blackhole)。
- 使用 Percona Server 或 MariaDB 可能比原生 MySQL 更轻量。
- 禁用 swap 或使用 zswap/zram:MySQL 对延迟极度敏感,Swap 会导致查询超时雪崩。
2. Redis 资源需求
Redis 是单线程事件驱动模型,所有操作都在内存中完成。
- 内存占用 = 实际数据大小 + 数据结构开销(Hash/List/Set 等内部编码) + 客户端缓冲区。
- 最低实践:
- 设置
maxmemory:务必显式设置!例如maxmemory 1gb,并配合淘汰策略(如allkeys-lru)。 - 避免大 Key:单个 Key 超过 10KB 就可能阻塞主线程。
- AOF/RDB 持久化会增加 CPU 和磁盘 IO 压力,低配服务器建议关闭 RDB,仅用 AOF(每秒刷盘)或两者都关(牺牲持久性换性能)。
- 设置
三、操作系统层面的关键优化(比硬件更重要)
在低配服务器上共存两个重型数据库,系统调优比加钱更有效。
1. 内核参数优化 (/etc/sysctl.conf)
# 增加文件描述符上限(MySQL 和 Redis 都需要大量 FD)
fs.file-max = 655350
net.core.somaxconn = 1024
vm.swappiness = 1 # 强烈建议设为 1,尽量不用 Swap
# 内存管理
vm.overcommit_memory = 1 # Redis 推荐开启,允许超额分配内存
2. 文件系统选择
- Ext4:CentOS 7/Ubuntu 默认,稳定可靠。
- XFS:适合大容量日志和大数据量,随机写入性能略优于 Ext4。
- 禁用 noatime:挂载时加上
noatime参数,减少磁盘写入次数。/dev/sda1 / ext4 defaults,noatime 0 1
3. 隔离与优先级
- 使用
cgroups或systemd限制 MySQL 和 Redis 的最大内存使用,防止一个拖垮另一个。 - 示例(systemd):
[Service] MemoryLimit=2G # 限制 MySQL 最多用 2G
四、常见误区与避坑指南
-
“我只有 2GB 内存,能不能装?”
可以装,但不推荐用于生产。- MySQL 启动后可能占用 1.5GB,剩下 512MB 给系统和 Redis。
- Redis 一旦开始存数据,很快触发 OOM 或 Swap,导致响应时间从 ms 级飙升至 s 级甚至分钟级。
- 解决方案:要么升级内存,要么将 Redis 和 MySQL 拆分到不同服务器。
-
不要共用同一个磁盘 IO 瓶颈
- 如果预算极低,确保使用的是 SSD。HDD 上的 MySQL + Redis 组合在高并发下几乎不可用。
- 如果必须用 HDD,考虑将 MySQL 的数据目录放在 RAID 10 上,Redis 的 dump 文件放在另一块盘上(如果有多盘)。
-
监控告警必做
- 使用
htop、nmon或 Prometheus + Node Exporter 实时监控:- Mem Used vs Mem Available
- Swap In/Out(一旦出现持续 Swap Out,立即扩容或优化 SQL)
- Disk I/O Wait
- 使用
五、总结建议
| 场景 | 推荐配置 | 说明 |
|---|---|---|
| 开发/测试环境 | 2C 2G | 可运行,但需严格限制 MySQL buffer pool 和 Redis maxmemory |
| 小型生产环境(初创) | 4C 8G | 最性价比起点,MySQL 设 4G buffer pool,Redis 设 2G maxmemory |
| 中等生产环境 | 8C 16G+ | MySQL 和 Redis 可分别占 8G~12G,体验良好 |
最终忠告:
在资源紧张的情况下,优先考虑拆分服务。Redis 和 MySQL 都是“吞金兽”,共存于一台低配服务器是典型的“风险集中”。如果可能,至少将 Redis 单独部署在一台小规格实例上(如 2C 4G),MySQL 再部署在另一台,这样即使 Redis 内存溢出,也不会影响 MySQL 的核心事务。
云技术博客