2.1 自建 MySQL 还是云数据库:算完账我选了后者
社区上线第二个月,某天凌晨两点我收到告警:磁盘 IO 打满。爬起来一看,MySQL 正对一张图片元数据表做临时表排序,临时表落盘把整机 IO 拖垮,跑在同一台 CVM 上的 Python 业务也跟着大面积超时。重启服务、杀慢查询、清临时表,折腾到凌晨四点才完全恢复,第二天整个人都是飘的。
那天我意识到一个问题:数据库和应用挤在同一台机器上,CPU、内存、IO 三样资源互相抢,应用高峰就是数据库高峰,反过来也一样,迟早要再出事。真正稳妥的做法是把数据库拆出去独立部署——哪怕先只拆到同一地域的另一台机器上,也是质的改善。摆在面前的路有两条——再买一台 CVM 自建主从 MySQL,或者直接买云数据库 MySQL。我花了一个下午算账,最后选了后者。这篇把算账过程完整写出来,给同样在纠结的人一个参考。
先把太长不看的结论放这儿:如果只是想把产品稳稳上线、没有专职运维,云数据库几乎在每一个维度上都更适合;只有当你把数据库本身当作核心竞争力、或者有特殊合规要求时,自建才值得认真考虑。下面逐项展开。
上一篇把应用搬上了 CVM,这一篇来解决它的数据存储问题。数据库该怎么放,是每个上云的人绕不过去的选择题。
一、先问自己:我到底有没有时间运维
在算钱之前,我先算了一笔时间账。独立开发者的处境很现实:白天有本职工作,晚上和周末才有空写代码,这几个小时要是花在装数据库、配主从、写备份脚本、半夜处理故障上,产品永远做不完。云服务器我已经在用,远程登录就能管理,而数据库的运维复杂度比 Web 应用只高不低——它对参数、权限、备份容错的要求都更高,每一个都是可以单独出书的领域。
所以真正的选择题不是哪个更便宜,而是:我的时间花在哪一段收益最大。对当时的我来说,答案很清楚:写业务功能、拉新留存,而不是给 MySQL 当兼职 DBA。想通这一点,后面的账就好算了。另一个隐性收益是心态:数据库出问题时,自建方案里你只能指望自己;用云数据库,至少还有厂商的技术支持和工单可以托底,半夜惊醒的次数会明显变少。我见过太多独立项目死在运维拖垮热情上,而不是死在没有市场上,这是一件想想都可惜的事。
二、自建 MySQL 要干的活
先列清单。在一台全新 CVM 上自建一套能用于生产的 MySQL,我至少得操心这些事:
| 事项 | 具体工作 | 我以往踩坑的体验 |
|---|---|---|
| 安装配置 | 装服务、改配置文件、调字符集 | 照抄网上教程,字符集没设对,中文和 emoji 存进去乱码,排查了半天 |
| 主备高可用 | 再买一台机器、配主从复制、写故障切换脚本 | 切换脚本不敢写又不敢不写,写了还得自己测,测了心里也没底 |
| 备份策略 | 定时逻辑备份、脚本传到其他机器、定期验证能否恢复 | 半夜惊醒会想:昨晚的备份到底成功没有 |
| 版本维护 | 跟安全补丁、计划停机升级自己担 | 没人提醒,全靠记性,漏一次就是风险敞口 |
| 监控告警 | 自己搭采集组件、配告警规则 | 又是一项独立工程,还没完没了 |
这不是吓唬自己,清单里每一项我都做过部分。保守估计每月要花我大半天,这还没算半夜爬起来处理故障的隐性消耗。其中最容易被忽略的是第三行:备份不是设置了就行,还得定期验证真的能恢复。很多自建方案的备份脚本跑了半年,出事才发现文件是空的、或者格式根本导不回来——我见过太多人把备份脚本当作已完成的备份,这两者之间差着十万八千里。
三、责任边界:谁在替你值夜班
把两个方案摆在一起看责任归属,思路会清楚很多:
| 维度 | 自建 MySQL | 云数据库 |
|---|---|---|
| 故障响应 | 自己爬起来排查恢复 | 厂商运维团队兜底,自动切换 |
| 备份有效性 | 自己保证,含验证 | 服务自动完成 |
| 安全补丁 | 自己跟踪版本自己升 | 平台自动维护 |
| 扩容方式 | 买机器、搭复制、迁数据 | 控制台升规格,分钟级 |
| 数据误删容错 | 大概率认栽 | 回档到时间点 |
发现规律没有:自建方案里所有责任都指向同一个人,就是你自己。你的精力是瓶颈,而云数据库把这些责任打包转移给了平台。这不是偷懒,而是分工——把标准化的基础设施交给专业的人,自己专注业务里真正有差异化的部分。
四、云数据库帮我省了什么
云数据库 MySQL(产品文档入口见云数据库 MySQL)把这些运维活打包成了服务,我对照清单重新算了一遍:
| 能力 | 云数据库怎么给 | 对我的实际意义 |
|---|---|---|
| 高可用 | 高可用版默认主从双机,主机故障自动切换 | 不用写切换脚本,凌晨能睡着觉 |
| 备份 | 自动按天全量备份,Binlog 支持回档到时间点 | 见 2.3,这条真救过我一次 |
| 版本维护 | 内核小版本自动维护,控制台一键升级 | 安全补丁不用我自己追 |
| 监控 | 自带连接数、慢查询、CPU 等指标 | 配合云监控直接配告警,2.4 就靠它定位问题 |
| 网络 | 与 CVM 同地域走内网通信 | 延迟低,还不消耗外网流量 |
也有代价:超级管理账号拿不到,部分系统参数不能随便改,想装自定义插件没门。但我的业务就是增删改查为主,要的是稳,这些限制从头到尾没碰到过。换句话说,云数据库牺牲的是极端定制自由,换来的是中位水平的稳定——而我恰恰只需要稳定。有一种折中思路也值得记一笔:把核心的、不能丢的数据放云数据库,把可重建的临时数据留在自建机器上,两边各取所长。不过对一个刚起步的小项目来说,维护两套数据栈本身就是负担,我最终一步到位全交给了云数据库。
五、贵不贵,换个算法
单看列表价,同规格的云数据库确实比一台 CVM 贵。但自建方案的真实成本要加上这些:
| 成本项 | 自建方案 | 云数据库 |
|---|---|---|
| 备机硬件 | 主从两台都得花钱 | 打包在实例价格里 |
| 备份存储 | 另备磁盘或机器存放 | 自带备份空间 |
| 运维时间 | 每月大半天起步 | 接近于零 |
| 故障切换 | 手写脚本加人工兜底 | 自动完成 |
| 误操作容错 | 基本只能认栽 | 回档到时间点 |
最后一行是压垮天平的砝码。数据无价,误删整库这种事在自建环境里大概率无法挽回,在云数据库里至少还有一条退路。那段惊险故事我放在 2.3,这里先不剧透。
这笔账我没停在概念层面,真按第一年的量级拆了一遍。下面是我按最低可用配置估的第一年自建成本明细,价格都是按活动价的大概估算,具体以页面为准:
| 项目 | 自建方案第一年(估算) | 说明 |
|---|---|---|
| 主库机器 | 2 核 4G 包年,约几百元 | 跑 MySQL 主库 |
| 备库机器 | 同规格第二台,约几百元 | 从库,高可用就靠它 |
| 备份盘 | 额外云盘或对象存储,约一两百元 | 存定时备份文件 |
| 外网流量 | 量小可忽略 | 内网通信为主 |
| 电费 | 0 | 云端机器不耗自家电 |
| 人工时间 | 每月大半天,折算时薪无法量化 | 全表最贵的一项 |
机器钱加起来其实不比一个入门云数据库实例贵多少,真正把天平压翻的是最后两行:人工时间没法砍价,误操作容错没法补救。
什么情况下我会反过来选自建?大致是这两条:一是有专职 DBA、数据量大到需要深度定制内核和参数;二是对数据驻留有特殊要求,必须自己掌握物理机器。二者我都不沾边,所以这笔账很快就算完了。身边也有朋友选了自建,理由是手里有闲置机器、又享受折腾的乐趣——这没什么不对,前提是他确实享受并且有空。每个人处境不同,我只是把我的处境如实算在这里。
做决定那天晚上我又问了自己一个问题:三年后我希望自己最强的一点是什么?是会把 MySQL 主从搭得比别人溜,还是有一个跑得稳、用户在长的产品?答案显然是后者。自建积累的是运维经验,云数据库买到的是专注业务的时间,而时间对独立开发者来说是不可再生的资源。
退一万步讲,就算云数据库某天涨价了、或者我想换回自建,数据导出迁移的路径始终是通的,这笔投资不会打水漂。可见的退路让人敢于做决定,被锁死的选择才让人犹豫。
六、结论
业务规模小、没有专职 DBA 的时候,把 MySQL 交给云数据库、自己专注写业务代码,是最划算的分工。等哪天规模上去了再考虑自建也完全来得及,云数据库的导出和迁移路径是通的,具体做法见 2.3。给还在犹豫的同学一句大实话:能省下运维精力的方案,长期看都便宜;省下来的时间投入产品,回报率远高于一台机器的差价。
文末帮大家要了个福利:云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中,我第一次买数据库实例就是从活动页下手的,新用户价格比列表价友好不少,试错成本也低。
顺带一提,服务器上的建站环境和管理面板怎么搞,可以看我另一本1Panel 运维面板实战;服务器和数据库出故障的排查套路,我在1Panel 常见问题里整理过一份清单。如果你想先把站跑起来再慢慢补数据库知识,AI 建站实战是条捷径。
下一篇讲具体操作:实例规格怎么选、高可用版和基础版怎么取舍、账号权限怎么划分、内外网地址怎么管。这几件事都在实例买完的第一天完成,属于一次性投入、长期受益的步骤,值得花一个整下午慢条斯理地做扎实。
还有一句实话要补:选了云数据库不等于万事不管,该学的数据库知识一点也不能少——索引、执行计划、事务隔离级别,这些在自建和云上是通用的。云数据库替你兜住的是运维和容错,不是替你写好 SQL。这个分工想清楚了,后面的章节才读得顺。
