在阿里云 ECS 上部署多个数据库,这事儿看似简单,实则是个“技术坑”与“管理术”的结合体。很多初级运维或开发者为了省钱,喜欢把 MySQL、Redis、MongoDB 甚至 Nginx 都塞进一台低配机器里,结果往往是 CPU 跑满、磁盘 IO 瓶颈,最后排查问题比从头搭建还累。
如果你非要这么干(或者受限于架构必须这么做),以下是我从实战角度总结的几个核心注意事项,分为资源隔离、配置优化、备份安全、监控告警四个维度。
1. 资源隔离是生死线:别让你的数据库互相“抢命”
这是最容易被忽视的一点。不同数据库对资源的需求模型完全不同:
- MySQL/PostgreSQL:吃 CPU 和内存(Buffer Pool),对磁盘随机读写(IOPS)敏感。
- Redis:纯内存型,对网络延迟和 CPU 单核性能极其敏感。
- MongoDB:吃磁盘顺序写能力和内存。
你需要做的:
- 限制进程资源(cgroups):
不要依赖操作系统的默认调度。对于 Linux 系统,建议使用systemd的CPUQuota和MemoryLimit参数来硬性限制每个数据库服务的最大资源占用。- 例子:如果这台 ECS 是 4核 8G,你可以给主业务 MySQL 分配 2核 4G,给 Redis 分配 0.5核 2G,剩下的留给系统和应用服务。这样即使 MySQL 发生慢查询拖垮 CPU,Redis 依然能保持毫秒级响应。
- 磁盘分区与挂载策略:
千万不要把所有数据放在同一个/dev/vda1根目录下。- 方案 A(推荐):使用阿里云云盘快照功能,为每个数据库创建独立的云盘并挂载。例如,
/dev/vdb挂给 MySQL 数据目录,/dev/vdc挂给 Redis dump 文件(虽然 Redis 主要靠内存,但持久化文件最好独立)。 - 方案 B(低成本):如果只有一块盘,务必将日志目录(如 MySQL 的 binlog, slow log)和数据目录分离到不同的物理路径,减少 IO 竞争。
- 方案 A(推荐):使用阿里云云盘快照功能,为每个数据库创建独立的云盘并挂载。例如,
2. 端口冲突与网络绑定:别让服务“串门”
- 监听地址绑定:
除非你有特殊的跨进程调用需求,否则严禁让所有数据库监听0.0.0.0。- MySQL 应绑定
127.0.0.1或内网 IP。 - Redis 同样建议绑定
127.0.0.1。 - 这样可以从操作系统层面切断外部直接连接数据库的风险,所有访问必须通过你的应用服务器(Web/App)转发,增加了安全屏障。
- MySQL 应绑定
- 端口规划:
避免使用默认端口进行非标准部署,虽然这不能替代防火墙,但能减少自动化扫描脚本的攻击概率。同时,确保没有两个服务监听同一个端口,这在 Docker 环境下容易出错,裸金属/ECS 下通常由管理员负责。
3. 配置文件调优:单机多实例的“中庸之道”
在多实例环境中,全局变量(Global Variables)往往不是最优解,你需要针对每个实例进行精细化调整。
- MySQL 示例:
innodb_buffer_pool_size:如果是单实例,通常设为物理内存的 50%-70%。但在多实例环境下,假设你分配了 4G 内存给 MySQL,那么这里就设 3.5G,而不是总内存的 70%。max_connections:根据并发量调整,但不要盲目调大,每个连接都消耗内存。
- Redis 示例:
maxmemory:必须设置!并且要设置为分配给该 Redis 实例的最大内存减去保留空间(比如预留 10% 给内部结构)。maxmemory-policy:设置为allkeys-lru或volatile-lru,防止 OOM(Out Of Memory)导致整个 Redis 崩溃,进而影响其他服务。
- 通用原则:
查看每个数据库的ps aux和top,确认其实际内存峰值是否超过了你预期的配额。如果发现某个数据库频繁 Swap,说明内存分配过大,需要立即缩减。
4. 备份与恢复:单点故障的最后一道防线
在一台 ECS 上跑多个数据库,最大的风险是“一损俱损”。如果磁盘损坏或误操作删除了一个库,另一个库可能也受影响。
- 物理备份 vs 逻辑备份:
- MySQL:推荐使用 XtraBackup 进行热备,生成的是物理文件,恢复速度快,且不影响业务。
- Redis:开启 AOF(Append Only File)持久化,并设置
appendfsync everysec。定期 RDB 快照作为冷备。
- 异地备份至关重要:
绝对不要把备份文件只存在本地 ECS 上!- 编写脚本,将 MySQL 的
.sql或备份目录、Redis 的.rdb文件,通过ossutil命令实时同步到阿里云 OSS(对象存储)。 - OSS 设置生命周期规则,自动清理过期的备份,节省成本。
- 这样即使 ECS 实例彻底毁灭,你也能从 OSS 拉取数据重建环境。
- 编写脚本,将 MySQL 的
5. 监控与告警:不要等到挂了才知道
阿里云有免费的 CloudMonitor(云监控),但你不能只依赖它看整体 CPU 利用率。
- 自定义监控项:
- 安装
mysql_exporter或类似的 Agent,采集 MySQL 的 QPS、TPS、连接数、InnoDB 缓冲池命中率等指标。 - 对于 Redis,可以使用
redis-sentinel或简单的脚本监控内存使用率、连接数、Key 数量。
- 安装
- 告警阈值设置:
- CPU 使用率 > 80% 持续 5 分钟 -> 通知。
- 磁盘使用率 > 85% -> 紧急通知(防止写满导致服务不可用)。
- 内存使用率 > 90% -> 警告。
- 关键:为每个数据库设置独立的告警联系人或群组,避免一个服务的异常报警淹没其他重要信息。
6. 安全合规与权限最小化
- 账号权限:
每个应用使用的数据库账号,只能拥有其所需的最小权限。不要用 root 账号直连生产库。 - 安全组(Security Group):
这是阿里云的第一道防线。确保 ECS 的安全组规则中,数据库端口(3306, 6379 等)仅允许来自应用服务器内网 IP 的访问,禁止 0.0.0.0/0 开放这些端口。 - 密码复杂度:
强制要求强密码,并定期轮换。
总结建议
虽然在一台 ECS 上部署多个数据库可以节省成本,但从长期维护和稳定性角度看,不推荐用于生产环境的核心业务。
更优的实践路径是:
- 核心数据库:直接使用阿里云 RDS(MySQL/Redis/PolarDB)。RDS 提供了高可用、自动备份、性能洞察,比你手动维护 ECS 上的数据库可靠得多,且初期成本差异不大。
- 非核心/测试环境:如果确实是测试机或非核心业务,可以采用上述的多实例部署方案,但务必做好资源隔离和OSS 异地备份。
记住,云计算的本质是用服务换时间。除非你有极强的运维能力且预算极度紧张,否则尽量让专业的事交给专业的服务(RDS)去做。
云技术博客