在阿里云 ECS 上同时部署 MySQL 和 Redis 多个实例,核心逻辑其实并不复杂:关键在于端口隔离、进程管理以及资源分配。只要不冲突,它们完全可以跑在同一台机器上。
这里分几种常见场景来拆解,从“单机多实例”到“高可用架构”,你根据你的业务量和预算对号入座。
一、 单机多实例(低成本方案)
如果你只是测试环境、小型项目或者想省钱,可以在一台 ECS 上装多个 MySQL 和 Redis。
1. 部署多个 MySQL 实例
MySQL 支持通过不同的配置文件启动多个实例,每个实例监听不同的 TCP 端口。
- 原理:复制 MySQL 的数据目录和配置文件,修改
port、socket、pid-file等关键参数。 - 操作步骤简述:
- 安装基础版:先正常安装一个 MySQL(比如默认端口 3306)。
- 创建新数据目录:
mkdir /data/mysql_3307,并设置权限为 mysql:mysql。 - 初始化数据库:使用
mysqld --initialize-insecure --user=mysql --datadir=/data/mysql_3307初始化第二个实例。 - 编写配置文件:新建
/etc/my.cnf.3307,重点配置:[mysqld] port=3307 datadir=/data/mysql_3307 socket=/tmp/mysql3307.sock pid-file=/var/run/mysqld/mysqld3307.pid # 其他参数按需调整 - 启动服务:指定配置文件启动:
mysqld_safe --defaults-file=/etc/my.cnf.3307 & - 验证:
mysql -u root -P 3307 -S /tmp/mysql3307.sock
注意:单机跑多实例对 CPU 和内存竞争很严重。如果两个 MySQL 都写负载高,I/O 瓶颈会非常明显。建议至少配备 8G+ 内存,且 SSD 云盘。
2. 部署多个 Redis 实例
Redis 部署多实例比 MySQL 简单得多,因为它是单线程模型,主要靠端口区分。
-
方法 A:修改端口(推荐用于少量实例)
- 复制一份 redis.conf,例如
redis_6380.conf。 - 修改关键参数:
port 6380 dir /data/redis_6380 dbfilename dump_6380.rdb logfile "/var/log/redis/redis_6380.log" - 启动:
redis-server /etc/redis_6380.conf
- 复制一份 redis.conf,例如
-
方法 B:使用 systemd 管理(更规范)
为每个实例创建一个 systemd service 文件,方便开机自启和管理。 -
方法 C:Redis Cluster(集群模式)
如果是生产环境,强烈建议使用 Redis Cluster。虽然还是在一台机器上,但通过虚拟节点(virtual slots)实现分布式。不过单机做 Cluster 意义不大,通常用于学习或极小规模测试。
二、 阿里云原生产品方案(生产环境推荐)
既然用了阿里云,为什么不直接用 PaaS 层的服务?自建虽然灵活,但运维成本高,故障恢复慢。
1. 阿里云 RDS for MySQL + 阿里云 Redis(Tair/Redis 版)
这是最稳妥的方案。
- 优势:
- 免运维:备份、监控、补丁自动完成。
- 高可用:主备切换自动处理。
- 性能稳定:底层硬件独享或共享优化较好。
- 连接方式:
- 你的 ECS 应用直接通过内网 IP 连接 RDS 和 Redis 的内网地址。
- 注意:确保 ECS 和安全组允许访问 RDS/Redis 的白名单。
2. 容器化部署(Docker/Kubernetes)
如果你希望保留“自己掌控”的感觉,但又想隔离资源,推荐使用 Docker。
-
方案:
# 启动第一个 MySQL docker run -d --name mysql1 -p 3306:3306 -v /data/mysql1:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=xxx mysql:8.0 # 启动第二个 MySQL docker run -d --name mysql2 -p 3307:3306 -v /data/mysql2:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=yyy mysql:8.0 # 启动第一个 Redis docker run -d --name redis1 -p 6379:6379 redis:7-alpine # 启动第二个 Redis docker run -d --name redis2 -p 6380:6379 redis:7-alpine -
优势:环境隔离好,升级方便,快照备份容易。
-
劣势:需要掌握 Docker 运维知识,网络配置稍复杂。
三、 关键注意事项(避坑指南)
-
端口冲突:
- 确保所有实例监听的端口不重复。
- 检查阿里云安全组(Security Group)是否放行了这些自定义端口(如 3307, 6380 等)。很多人只开了 3306,忘了开其他端口,导致网络连不上。
-
资源争抢:
- CPU:MySQL 是 CPU 密集型(尤其是复杂查询),Redis 是内存/IO 密集型。不要让它们在高峰时段同时做大量计算。
- 内存:Redis 全量数据通常在内存中。如果多个 Redis 实例数据量大,务必计算总内存需求。ECS 内存不足会导致 Swap,性能暴跌。
- 磁盘 IOPS:多个 MySQL 实例并发写入会打满云盘 IOPS。选择 ESSD PL1 或更高规格的云盘。
-
防火墙与安全:
- 不要将所有数据库端口暴露给 0.0.0.0/0。
- 最佳实践:仅在 ECS 内部通信,或通过堡垒机访问。如果应用也在同一台 ECS 上,可以用 Unix Socket 或 localhost 连接,减少网络开销和安全隐患。
-
备份策略:
- 自建多实例,备份脚本要写好,避免覆盖。
- 利用阿里云 EBS 快照功能,定期为系统盘和数据盘创建快照,一键回滚。
四、 总结建议
| 场景 | 推荐方案 | 理由 |
|---|---|---|
| 个人学习/测试 | 单机多实例(手动或 Docker) | 成本低,熟悉原理 |
| 小型企业官网 | 1 台 ECS + 1 个 MySQL + 1 个 Redis | 简单,维护方便 |
| 中型业务/电商 | 阿里云 RDS + 阿里云 Redis | 高可用,省心,性能有保障 |
| 大型微服务架构 | K8s + 云数据库 | 弹性伸缩,隔离性强 |
最后提醒:在生产环境中,不建议将核心业务的 MySQL 和 Redis 全部堆在一台普通配置的 ECS 上。一旦某一方出现内存泄漏或死锁,整个服务器都会瘫痪。能拆分就拆分,能用云数据库就用云数据库。
云技术博客