在单台云服务器上同时部署 MySQL 和 Redis 是常见但需谨慎的操作。虽然适用于开发、测试或轻量级生产场景(如小型网站、内部工具),但不推荐用于中高负载或关键业务的生产环境。以下是兼顾稳定性、性能与安全性的最佳实践总结:
✅ 一、前提评估:是否真的需要共存?
| 场景 | 建议 |
|---|---|
| 开发/测试/POC | ✅ 可接受,需合理隔离资源 |
| 日活 < 1k 的轻量应用(如博客、后台管理) | ⚠️ 可行,但必须严格调优和监控 |
| 高并发读写、核心交易系统、数据一致性要求高 | ❌ 强烈建议分离部署(物理/逻辑隔离) |
💡 关键风险:资源争抢(CPU/内存/IO)、故障传播(OOM kill 影响两者)、安全纵深不足、备份恢复复杂化。
✅ 二、核心最佳实践
1. 资源隔离与限制(最重要!)
-
使用 cgroups(systemd)或容器(Docker)限制资源:
# 示例:通过 systemd 限制 MySQL 内存为 2GB,Redis 为 1GB(假设 8GB 总内存) sudo systemctl edit mysqld # 添加: [Service] MemoryMax=2G CPUQuota=60% sudo systemctl edit redis-server [Service] MemoryMax=1G CPUQuota=30% - Redis 必须配置
maxmemory+ 合理淘汰策略(避免 OOM):# /etc/redis/redis.conf maxmemory 1gb maxmemory-policy allkeys-lru # 或 volatile-lru,按业务选 - MySQL 调优内存参数,避免过度分配:
# /etc/my.cnf 或 /etc/mysql/mysql.conf.d/mysqld.cnf innodb_buffer_pool_size = 2G # ≤ 总内存 50%,预留足够给 OS + Redis + 其他进程 key_buffer_size = 32M max_connections = 100 # 按实际并发调整,避免连接耗尽内存
2. I/O 隔离与优化
- 磁盘分离(强烈推荐):
- MySQL 数据目录(
/var/lib/mysql)→ 独立 SSD 分区(如/dev/nvme0n1p2) - Redis RDB/AOF → 另一分区或至少不同目录(如
/var/lib/redis) - 日志统一到
/var/log(独立小分区或 tmpfs 缓存)
- MySQL 数据目录(
- 禁用 swap(或严格限制):
# Redis 对 swap 敏感,MySQL 在 swap 时性能骤降 sudo swapoff -a # 永久禁用:注释 /etc/fstab 中 swap 行 - 调整 I/O 调度器(SSD 推荐
none或kyber):echo 'none' | sudo tee /sys/block/nvme0n1/queue/scheduler
3. 端口、用户与权限最小化
-
非默认端口 + 绑定本地:
# MySQL: /etc/my.cnf bind-address = 127.0.0.1 # 禁止网络访问 port = 3307 # 避免冲突(若已有服务) # Redis: /etc/redis/redis.conf bind 127.0.0.1 ::1 # IPv4+IPv6 本地 port 6380 # 非默认端口 protected-mode yes requirepass your_strong_password # 必须设密码! - 独立系统用户运行:
sudo adduser --system --group --no-create-home mysql sudo adduser --system --group --no-create-home redis # 修改服务配置确保以对应用户运行
4. 持久化与备份策略
- MySQL:
- 启用
binlog(用于增量恢复 + 主从); - 定期
mysqldump或mydumper+xtrabackup(需额外空间); - 备份脚本加入锁表/一致性检查。
- 启用
- Redis:
- 同时启用 RDB(定时快照)+ AOF(追加日志):
save 900 1 save 300 10 appendonly yes appendfsync everysec - AOF 重写自动触发:
auto-aof-rewrite-percentage 100&auto-aof-rewrite-min-size 64mb
- 同时启用 RDB(定时快照)+ AOF(追加日志):
- 备份存储分离:备份文件同步至对象存储(OSS/S3)或另一台服务器,绝不留在本机。
5. 监控与告警(不可省略)
- 必须监控指标:
- 系统层:
free -h,iostat -x 1,vmstat 1,df -h - MySQL:
Threads_connected,Innodb_buffer_pool_ratio,Slow_queries,Seconds_behind_master - Redis:
used_memory,mem_fragmentation_ratio,evicted_keys,connected_clients,rejected_connections
- 系统层:
- 工具推荐:
- 轻量:
Prometheus + Node Exporter + mysqld_exporter + redis_exporter+ Grafana(免费开源) - 云厂商:阿里云 ARMS、腾讯云可观测平台(一键接入)
- 轻量:
6. 安全加固
- 关闭不必要的服务(如
rpcbind,avahi-daemon); - 防火墙仅放行必需端口(SSH、应用端口),禁止开放 3306/6379 到公网;
- 定期更新系统及软件(
apt update && apt upgrade -y/yum update -y); - MySQL 删除匿名用户、
test数据库;Redis 禁用CONFIG命令(rename-command CONFIG "")。
✅ 三、替代方案(更推荐的演进路径)
| 阶段 | 方案 | 优势 |
|---|---|---|
| 起步 | 单机共存(按上述实践) | 成本低、快速上线 |
| 增长期 | MySQL 上云托管(RDS) + Redis 自建 | RDS 解放 DBA,Redis 仍可控 |
| 成熟期 | 全托管服务: • MySQL → 阿里云 RDS / AWS RDS • Redis → 阿里云 Tair / AWS ElastiCache |
高可用、自动备份、弹性扩缩容、专业运维支持 |
| 极致可靠 | Kubernetes 集群部署(StatefulSet + PVC)+ Helm Chart | 标准化、可复制、CI/CD 友好 |
❌ 四、绝对禁止事项
- ✖️ 不设
maxmemory运行 Redis → 必然 OOM; - ✖️ MySQL
innodb_buffer_pool_size> 总内存 60%; - ✖️ Redis AOF + MySQL binlog 同时写入同一慢速磁盘(如 HDD);
- ✖️ 使用 root 用户运行任一服务;
- ✖️ 开放 3306/6379 到 0.0.0.0/0(公网暴露);
- ✖️ 无监控、无备份、无告警就投入生产。
✅ 总结一句话:
“可以共存,但必须像隔离两个微服务一样严格约束资源、网络、权限与生命周期;一旦业务增长,立即解耦。”
如需,我可为你提供:
- 完整的
systemd资源限制模板 - Prometheus 监控配置 YAML
- 自动化备份脚本(含压缩/加密/异地上传)
- Docker Compose 隔离部署方案
欢迎告知你的具体环境(OS/内存/CPU/云厂商/业务类型),我可进一步定制化建议 👇
CLOUD技术博