在阿里云 ECS 上自建数据库,和直接买 RDS(云数据库)完全是两码事。RDS 是托管服务,你只管用;ECS 自建则是“全栈运维”,从操作系统内核到数据库配置,再到网络和安全,所有坑都得自己填。
如果你坚持要在 ECS 上装 MySQL、PostgreSQL 或 MongoDB,以下是几个最容易被忽视但致命的关键点,按优先级排列:
1. 安全组与防火墙:别只开 3306/5432
很多新手买完服务器,第一件事就是去数据库里设置 root@% 允许任意 IP 连接,然后发现连不上。
- 误区:以为开了端口就能通。
- 真相:阿里云有双层防护。
- 系统防火墙:你需要在 Linux 内部开启
firewalld或iptables,放行对应端口。 - 云安全组:这是最容易忽略的。必须在阿里云控制台的安全组入方向添加规则,源地址建议写死你的办公 IP 或公司出口 IP,绝对不要写
0.0.0.0/0,除非你有极强的访问控制逻辑。
- 系统防火墙:你需要在 Linux 内部开启
- 最佳实践:数据库端口永远不要对公网开放。通过 SSH 隧道连接,或者使用内网 IP 让应用服务器通过 VPC 内网访问。
2. 磁盘 IOPS 是性能瓶颈
ECS 自带的本地盘或普通云盘,IOPS 往往不够看。数据库是典型的 IO 密集型应用。
- 注意:购买时务必选择 ESSD PL1 或 PL2 级别的云盘。普通高效云盘在高并发写入下延迟会飙升,导致查询超时。
- 挂载优化:如果数据量大,建议将数据目录(如
/var/lib/mysql)单独挂载一块高性能云盘。不要用系统盘存数据,一旦系统崩溃或重装,数据全丢。 - IO 调度器:Linux 默认的 IO 调度算法(如 deadline 或 cfq)可能不适合高并发数据库。对于 NVMe 磁盘,通常建议设置为
none或mq-deadline,具体需根据内核版本测试。
3. 内存与 Swap:千万别依赖 Swap
数据库最怕频繁交换内存到磁盘(Swap),这会导致性能断崖式下跌甚至进程被 OOM Kill。
- 操作:在
/etc/fstab中注释掉 swap 分区,或者直接swapoff -a。 - 替代方案:如果内存不足,优先升级 ECS 规格(加内存),而不是开启 Swap。数据库需要的是 RAM,不是虚拟内存。
4. 字符集与大小写敏感
- 字符集:安装时务必指定
utf8mb4(MySQL)或UTF8(PG)。默认往往是latin1,后期改字符集极其痛苦,容易乱码且耗时极长。 - 大小写敏感:
- MySQL:Linux 下表名默认区分大小写,Windows 不区分。如果你之前是在 Windows 开发,迁移到 Linux ECS 后可能会报 "Table doesn’t exist"。建议在 my.cnf 中设置
lower_case_table_names=1,但这需要在初始化数据库实例前配置好,中途修改风险极大。 - PostgreSQL:默认区分大小写,需在创建数据库时指定 collation。
- MySQL:Linux 下表名默认区分大小写,Windows 不区分。如果你之前是在 Windows 开发,迁移到 Linux ECS 后可能会报 "Table doesn’t exist"。建议在 my.cnf 中设置
5. 备份策略:云厂商不背锅
RDS 自带自动备份,ECS 自建全靠你自己。
- 冷备:定期执行
mysqldump或pg_dump,脚本自动化,上传到 OSS(对象存储)。OSS 成本低,适合长期归档。 - 热备:
- MySQL:开启 binlog,配合 XtraBackup 工具备份。
- 利用阿里云的 快照功能:对数据盘设置定时快照策略。这是最可靠的底层恢复手段,比数据库层备份更彻底。
- 异地容灾:单点故障是致命的。考虑搭建主从复制(Master-Slave),从库放在另一个可用区(Zone)。
6. 监控与告警:别等挂了才知道
ECS 自带的云监控只能看到 CPU、内存、带宽。你看不到 SQL 慢查询、锁等待、连接数激增。
- 必须部署:
- Prometheus + Grafana:通过 node_exporter 采集主机指标,通过 mysqld_exporter 采集数据库指标。
- 慢查询日志分析:开启 slow_query_log,并设置阈值(如 >1s)。定期分析,否则数据库会越来越慢。
- 告警:当连接数达到最大值的 80%、CPU 持续高于 90%、磁盘空间低于 20% 时,必须通过钉钉、短信或邮件告警。
7. 权限最小化原则
- 禁止 root 远程登录:创建一个专用用户,只授予必要库表的 SELECT/INSERT/UPDATE/DELETE 权限。
- 应用账号隔离:不同业务模块尽量使用不同的数据库账号,避免一个模块被攻破影响全局。
8. 升级与维护窗口
- 内核更新:Linux 系统漏洞补丁要定期打,但不要在业务高峰期重启。
- 数据库版本:MySQL 8.0 比 5.7 性能好,但兼容性有差异。升级前务必在测试环境验证。
- 停机维护:任何大版本升级或硬件变更,都需要提前规划停机窗口,并通知相关业务方。
总结:什么时候该转 RDS?
如果你发现以下情况,建议尽快迁移到阿里云 RDS:
- 团队没有专职 DBA,运维人力紧张。
- 业务增长快,需要弹性扩容(RDS 可秒级升配,ECS 需停机或复杂迁移)。
- 对数据安全性要求极高,无法承受自建备份失败的风险。
- 经常遇到因配置不当导致的性能问题,排查成本过高。
自建数据库是技术人的乐趣所在,也是责任的深渊。每一步都要想清楚“如果明天挂了,怎么救”。
云技术博客