单台云服务器上同时部署MySQL和Redis的最佳实践是什么?

在单台云服务器上同时部署 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 缓存)
  • 禁用 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
  • 备份存储分离:备份文件同步至对象存储(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技术博 » 单台云服务器上同时部署MySQL和Redis的最佳实践是什么?