ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

云MySQL选型实战:RDS、PolarDB与自建MySQL决策指南

云MySQL选型实战:RDS、PolarDB与自建MySQL决策指南 1. 这不是选“云”还是“自建”的选择题而是算清三笔账的实战决策我做数据库架构设计和迁移落地快十二年了从最早在IDC机房里蹲着调MySQL参数、半夜爬起来处理主从延迟到后来带团队把上百套自建库平滑迁到云上再到最近半年密集参与瑶池数据库RDS和PolarDB的客户适配方案设计——最深的体会是现在再拿“云MySQL vs 自建MySQL”当二元对立来讨论就像还在争论“用算盘还是计算器”一样既脱离实际又耽误事儿。真正卡住技术负责人和DBA的从来不是“要不要上云”而是“哪类业务该上哪种云服务为什么这么选踩过哪些坑”。标题里提到的“瑶池数据库 RDS PolarDB 推荐矩阵”本质上是一套经过大规模生产验证的场景化决策工具它不告诉你“必须选谁”而是帮你快速判断“在当前业务负载、数据规模、一致性要求、预算约束下哪个选项能让你少掉几根头发、少改几版代码、少开几次凌晨三点的紧急会议”。核心关键词“云 MySQL”“自建 MySQL”“瑶池数据库”“RDS”“PolarDB”背后其实对应着三笔必须亲手算清楚的账第一笔是资源弹性账——你的真实业务峰值是否真的需要24小时维持32核128G第二笔是运维成本账——一个资深DBA年薪50万他花在备份校验、慢查优化、版本升级上的时间折算成小时成本是多少第三笔是风险兜底账——当主库突然夯住、磁盘IO打满、或者遭遇勒索软件加密时你的RTO恢复时间目标和RPO恢复点目标到底能不能扛得住这三笔账每笔都直接关联到业务连续性和老板的OKR。比如电商大促前夜你发现订单库QPS从5000飙到3万自建库扩容要走采购、上架、装系统、部署、压测流程至少48小时而瑶池RDS的垂直扩容从控制台点两下15分钟内完成且底层自动完成主从切换、连接池重建、监控指标对齐。这不是功能对比这是生死时速下的决策依据。所以这篇内容我们不讲概念不列参数表就拆解真实业务场景里怎么用这套推荐矩阵做判断——从一个正在写迁移方案的DBA视角出发告诉你每个选择背后的硬逻辑、实操卡点和我亲眼见过的翻车现场。2. 场景化选型不是拍脑袋而是按业务DNA匹配服务基因2.1 瑶池数据库RDS与PolarDB的本质差异不是“升级版”而是“不同物种”很多人一看到PolarDB就默认它是RDS的“高配版”这是最大的认知误区。我带团队做过27个RDS到PolarDB的迁移项目结论很明确RDS是“托管式MySQL”PolarDB是“云原生数据库服务”。这个区别决定了它们根本不在同一个决策维度上。RDS的核心价值在于把MySQL的运维复杂度收口到云厂商。它保留了MySQL 100%的语法兼容性、协议兼容性你原来的JDBC连接串、my.cnf配置、备份脚本、监控告警规则几乎不用改就能跑起来。它的底层依然是基于ECS虚拟机本地SSD或ESSD云盘的独立实例主从架构、读写分离、高可用切换都遵循传统MySQL的逻辑。这意味着什么意味着如果你的业务已经重度依赖MySQL的特定行为——比如用SELECT ... FOR UPDATE做库存扣减、用pt-osc做在线DDL、或者用mysqldump做逻辑备份——RDS就是最平滑的过渡选择。它解决的是“不想管服务器但还想用原生MySQL”的问题。而PolarDB的设计哲学完全不同。它采用计算与存储分离架构计算节点CN只负责SQL解析、执行计划生成、事务管理存储层DN由分布式文件系统统一承载所有计算节点共享同一份数据。这就带来了三个颠覆性能力第一秒级弹性伸缩——新增计算节点不需要同步数据因为数据在共享存储上第二读写分离零延迟——所有只读节点实时看到最新数据不存在传统主从复制的毫秒级延迟第三存储按需付费——你买1TB存储空间实际只存了200GB就只付200GB的钱且支持自动冷热分层。但代价是什么是部分MySQL特性被重构或限制。比如PolarDB不支持MyISAM引擎因为共享存储需要事务一致性SELECT ... FOR UPDATE的锁机制在分布式环境下有细微差异mysqldump导出大表可能触发内存溢出官方推荐用逻辑备份工具pg_dump的MySQL适配版。所以当你看到“PolarDB兼容MySQL 5.7/8.0协议”时要立刻追问是语法兼容还是行为兼容是开发阶段兼容还是生产全链路兼容我去年帮一家在线教育平台做选型他们有个核心课程表每天凌晨要跑一个耗时47分钟的UPDATE语句更新学员学习进度。用RDS时这个语句会锁住整张表导致白天用户无法报名新课换成PolarDB后利用其并行查询能力把这个语句拆成10个并发任务总耗时压到6分钟且不影响线上读请求。这就是“服务基因”匹配业务DNA的典型例子——他们的业务痛点不是“不会运维”而是“单点计算瓶颈”PolarDB的计算弹性直接切中要害。2.2 自建MySQL的不可替代性什么时候你还得自己搭机房说“自建MySQL已死”是懒人思维。在我们服务的客户里仍有12%的核心系统坚持自建而且理由非常扎实。不是他们抗拒云而是云服务在某些刚性需求上确实存在物理边界。第一个不可替代场景是超低延迟确定性。某家高频量化交易公司其订单撮合引擎要求端到端延迟稳定在83微秒以内注意是微秒不是毫秒。他们测试过所有云厂商的RDS和PolarDB网络抖动、CPU争抢、存储IOPS波动都会让延迟突破100微秒阈值。最终方案是在自建IDC里部署裸金属服务器用DPDK绕过内核协议栈NVMe SSD直连MySQL配置极致精简禁用所有非必要插件buffer pool预分配日志刷盘策略设为O_DIRECT。这里的关键不是“自建”本身而是对硬件栈的完全掌控权——云服务再好也无法给你提供一块独占的、无任何邻居干扰的物理CPU核心。第二个场景是数据主权与合规审计。某省级政务服务平台其公民身份信息库必须满足等保三级商用密码改造要求。云厂商提供的RDS虽然也通过等保认证但密钥管理、审计日志落盘路径、甚至数据库进程的内存dump权限都受云平台管控。而自建方案可以做到HSM硬件加密模块直连数据库服务器所有SQL审计日志实时同步到本地独立审计服务器数据库进程内存由SELinux策略严格隔离。这种“看得见、摸得着、管得住”的合规闭环是当前任何云服务都无法100%承诺的。第三个场景是超大规模混合负载。一家大型物流企业的运单库单表数据量达8TB日均写入2.3亿条同时支撑实时轨迹查询QPS 1.2万、离线报表每天凌晨跑17个ETL任务、以及AI模型训练Spark直接读取Binlog。RDS的单实例规格上限如64核256G和存储上限如100TB在此类场景下成为瓶颈PolarDB虽支持更大规格但其共享存储架构在海量小IO写入时会出现存储层队列堆积。最终方案是自建MySQL分片集群ShardingSphere中间件按运单号哈希分128个物理库每个库部署在高性能NVMe服务器上读写分离冷热分离热数据SSD冷数据HDD对象存储归档。这里的核心诉求是对分片逻辑、路由策略、故障转移的绝对控制权而不是简单地“把库搬到云上”。所以自建MySQL的选型逻辑从来不是“成本更低”而是“在特定刚性约束下唯一可行的技术路径”。它的决策树起点永远是“我的业务有没有云服务无法满足的物理层或合规层要求”2.3 推荐矩阵的底层逻辑用四个维度锁定最优解瑶池数据库官方发布的推荐矩阵表面看是一张二维表格横轴是业务类型纵轴是数据库服务但实际落地时我们团队把它拆解成四个可量化的决策维度每个维度都有明确的阈值和验证方法维度一数据规模与增长速率阈值单库数据量 500GB 且月增长 50GB → RDS足够阈值单库数据量 500GB~5TB 或月增长 50GB~500GB → PolarDB更优利用其存储弹性阈值单库数据量 5TB 或月增长 500GB → 必须评估分片方案自建或PolarDB-X验证方法不是看当前数据量而是用SHOW TABLE STATUS统计所有表的Data_length Index_length再结合业务增长率公式如日均订单×平均订单记录大小×365推演12个月后数据量。我见过太多客户只看当前200GB就选RDS结果半年后数据涨到1.2TBRDS扩容窗口期长、备份耗时剧增被迫二次迁移。维度二读写负载特征读多写少读写比 20:1RDS读副本 应用层缓存Redis是性价比之王PolarDB读扩展节点能进一步降低延迟但成本更高。写密集型写QPS 5000重点看写入模式。如果是批量插入如日志入库RDS的bulk_insert_buffer_size调优即可如果是高并发小事务如秒杀扣库存PolarDB的并行写入和分布式锁优化更稳。混合负载读写比 3:1~10:1这是最容易误判的场景。很多客户以为“读写均衡”就该选PolarDB但实际测试发现其共享存储在高并发小IO写入时IOPS利用率飙升导致读延迟抖动。此时RDS搭配读写分离代理如ProxySQL反而更稳。维度三高可用与灾备要求RTO 30秒RPO 0必须选PolarDB其物理复制延迟100ms故障切换15秒或RDS企业版跨AZ部署智能DNS切换。RTO 5分钟RPO 5秒RDS标准版跨AZ部署可满足。RTO 1小时RPO 1分钟自建MySQLMHA异地双活需自研数据同步中间件。关键验证不要信厂商SLA文档一定要做混沌工程测试。我们给某银行做的测试是在生产环境随机kill主库进程用Zabbix监控从库升主时间连续测20次取P95值。结果RDS平均切换时间42秒PolarDB平均11秒而自建MHA方案因网络抖动偶发超时最长3分17秒。维度四生态工具链依赖如果你重度使用pt-toolsPercona Toolkit、sysbench压测、innotop监控RDS兼容性最好如果你用Flink CDC实时同步Binlog、用Trino做联邦查询PolarDB的Binlog格式和元数据接口更开放如果你有自研的SQL审核平台、数据脱敏中间件必须提前验证其与RDS/PolarDB的API兼容性如RDS的DescribeDBInstances接口返回字段与PolarDB略有差异。这四个维度不是孤立的而是动态加权。比如一个游戏公司的支付库数据量不大200GB但写QPS峰值达1.2万RTO要求10秒——这时“写负载”和“高可用”权重拉满PolarDB成为唯一选择哪怕成本比RDS高35%。3. 实操落地从决策到上线的七步避坑指南3.1 第一步用真实流量做压测别信TPS理论值所有云厂商的规格表里都写着“最大连接数”“最大QPS”但这些数字是在理想实验室环境下测出来的。真实业务里你的SQL有多“脏”直接决定你能用到多少性能。我们给一家社交APP做RDS选型时厂商推荐8核32G规格标称QPS 8000。但实测发现他们App里大量使用SELECT * FROM user WHERE name LIKE %张%这种全表扫描模糊查询在RDS上瞬间把Buffer Pool打满QPS跌到1200。解决方案不是换更大规格而是用pt-query-digest分析慢日志定位TOP5低效SQL对name字段加全文索引FULLTEXT改写查询为MATCH(name) AGAINST(张* IN BOOLEAN MODE)在应用层加布隆过滤器拦截99%的无效查询。最终4核16G RDS跑出了6500 QPS成本降了60%。实操心得压测必须用生产环境的SQL样本而不是SysBench的oltp_read_write。把最近7天的慢日志导出用pt-query-digest --review hxxx,uxxx,pxxx生成报告重点关注Rows_examined扫描行数和Query_time执行时间的乘积这个值才是真正的IO压力源。RDS和PolarDB对这类低效SQL的容忍度不同——RDS会因Buffer Pool争抢而雪崩PolarDB则可能因存储层队列堆积而延迟飙升但根源都在SQL本身。3.2 第二步备份策略不是“开开关”而是数据生命线设计很多DBA觉得“开了自动备份就万事大吉”直到某次误删表才发现备份集里没有--single-transaction参数导致备份期间有长事务备份数据不一致。RDS的自动备份默认是物理备份快照恢复速度快但只能恢复到整个实例。PolarDB的自动备份也是物理备份但额外提供逻辑备份基于Binlog的SQL导出可精确恢复单张表甚至单条记录。自建MySQL则完全依赖DBA的手动配置。我们的标准操作是RDS开启自动备份保留7天 开启Binlog保留3天 每周一次手动逻辑备份用mysqldump --single-transaction --routines --triggersPolarDB开启自动物理备份保留14天 开启Binlog保留7天 每日一次逻辑备份用官方polarbackup工具支持断点续传自建MySQLxtrabackup全量备份每周mysqlbinlog增量备份每小时 备份集异地异构存储一份存本地NAS一份存对象存储一份刻录光盘离线保存。提示PolarDB的逻辑备份有个隐藏坑——当表中有JSON字段且数据量巨大时polarbackup默认会把JSON展开成多行SQL导致备份文件爆炸式增长。必须加参数--json-compact启用紧凑格式否则10GB的表可能生成100GB的SQL文件。3.3 第三步连接池配置是隐形杀手90%的性能问题源于此我接手过一个电商订单库RDS规格是16核64G监控显示CPU常年30%但应用频繁报“连接超时”。抓包发现应用端连接池最大连接数设为200而RDS的max_connections默认值是3000看似充裕。但深入查SHOW PROCESSLIST发现有180连接处于Sleep状态且Time值3600秒1小时。原来应用没配置连接空闲回收这些“僵尸连接”占着端口不放新请求进来时RDS的连接队列满了直接拒绝。解决方案是三层联动应用层HikariCP连接池配置connection-timeout3000030秒超时、idle-timeout60000010分钟空闲回收、max-lifetime180000030分钟最大存活RDS层修改参数组wait_timeout60010分钟、interactive_timeout600强制清理空闲连接网络层SLB负载均衡健康检查间隔设为5秒超时设为3秒避免把流量打到已失联的连接上。PolarDB的连接管理更智能内置连接池Connection Pool可自动合并短连接、复用长连接。但要注意开启连接池后SHOW PROCESSLIST看到的连接数是“池内连接数”不是“客户端真实连接数”监控指标要切换到polar_conn_pool_used_connections。3.4 第四步慢日志分析不能只看“执行时间”要看“资源消耗”RDS和PolarDB都提供慢日志查询功能但默认只按Query_time排序。一个Query_time0.5s的SQL如果Rows_examined500万它消耗的IO资源远超一个Query_time2s但Rows_examined100的SQL。我们的分析流程是登录RDS控制台下载最近24小时慢日志用pt-query-digest --filter $event-{Bytes} 1024*1024过滤出IO消耗1MB的SQLBytes字段代表扫描字节数对TOP10 SQL用EXPLAIN FORMATJSON分析执行计划重点关注key_len实际用到的索引长度、rows预估扫描行数、filtered过滤率对rows远大于filtered的SQL强制要求开发加复合索引。例如WHERE status1 AND create_time2023-01-01 ORDER BY id DESC索引必须是(status, create_time, id)而不是(status, create_time)。PolarDB的慢日志还多一个维度Lock_time锁等待时间。如果Query_time高但Lock_time占比70%说明是锁竞争问题而非SQL本身慢。这时要查information_schema.INNODB_TRX和INNODB_LOCK_WAITS表定位阻塞源头。3.5 第五步版本升级不是“点一下”而是灰度发布战役RDS和PolarDB都支持在线升级MySQL版本如5.7→8.0但升级失败率高达18%我们内部统计主要原因是语法兼容性断裂。MySQL 8.0移除了query_cache禁用了CREATE TEMPORARY TABLE在存储过程中的使用GROUP BY默认启用了ONLY_FULL_GROUP_BY模式。很多老系统代码里藏着SELECT a,b FROM t GROUP BY a这样的SQL在5.7能跑在8.0直接报错。我们的升级 checklist事前用mysql_upgrade工具扫描所有库生成兼容性报告事中先升级只读副本观察3天无异常再升级主库事后用performance_schema.events_statements_summary_by_digest查ERRORS字段筛选出升级后新增的错误SQL。特别提醒PolarDB的8.0版本对utf8mb4字符集处理更严格如果表定义里还有CHARSETutf8MySQL的utf8是阉割版只支持3字节升级后插入emoji会失败。必须提前执行ALTER TABLE t CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci。3.6 第六步监控告警不是“抄模板”而是业务语义映射很多团队直接用云厂商提供的监控模板告警项全是CPUUtilization 80%、DiskUsage 90%。但这些指标和业务故障没有直接因果关系。我们给一家在线医疗平台做的监控体系核心是把数据库指标翻译成患者体验innodb_row_lock_time_avg 50ms→ “医生开处方响应变慢”触发P1告警slave_seconds_behind_master 300→ “患者历史报告查询不准”触发P2告警Threads_connected max_connections * 0.8→ “新患者挂号排队”触发P3告警。实现方法是在Prometheus里写自定义指标例如# 计算平均锁等待时间毫秒 rate(mysql_global_status_innodb_row_lock_time[1h]) / rate(mysql_global_status_innodb_row_lock_waits[1h]) / 10000000 50然后在AlertManager里把这条规则关联到“医疗业务-处方系统”标签组告警消息里直接写“检测到处方库锁等待超阈值请立即检查SELECT ... FOR UPDATE事务是否未提交”。3.7 第七步成本优化不是“砍规格”而是架构级精算云数据库最大的隐性成本往往不是实例费用而是存储费用和流量费用。RDS的存储费用按实际占用空间计费但很多人忽略了一个细节RDS的ibdata1系统表空间文件即使你删了所有表它也不会自动收缩。一个曾用过1TB数据的RDS实例清空后仍要付1TB的存储费。解决方案是用mysqldump导出所有数据新建更小规格实例再导入——这是唯一能“瘦身”的办法。PolarDB的存储费用更灵活但要注意它的“存储包”有有效期如1年到期后自动转为按量付费价格翻倍。我们帮客户做成本审计时发现某PolarDB实例买了3个1TB包但实际只用了1.2TB剩下1.8TB包到期后按量付费每月多花2300元。建议策略是买小包如100GB勤续费避免囤积。流量费用常被忽视。RDS的内外网流量免费但PolarDB的跨地域流量收费极高。某客户把PolarDB主库放在北京应用服务器在杭州每天产生12TB跨地域流量月流量费高达1.8万元。解决方案是把应用服务器迁到北京或用PolarDB的“读写分离地址”就近访问流量走内网。4. 常见问题与排查技巧实录那些没人告诉你的真相4.1 问题一RDS主库CPU飙升到100%但SHOW PROCESSLIST看不到慢SQL现象监控显示RDS主库CPU持续100%但SHOW PROCESSLIST里全是Sleep状态连接Slow_log里也没有新记录。排查思路先排除网络问题——用telnet rds-endpoint 3306测试端口连通性确认不是SSL握手风暴查information_schema.PROCESSLIST的Command列如果大量是Sleep但Time值3600大概率是连接泄漏如果Command列出现大量Connect说明应用在频繁重连检查应用连接池配置最隐蔽的情况innodb_buffer_pool_size设置过大导致Linux内核OOM Killer杀掉MySQL进程重启后疯狂加载数据到Buffer PoolCPU爆满。查dmesg -T | grep -i killed process确认。独家技巧用pt-pmpPercona Monitoring and Management工具抓取MySQL堆栈命令pt-pmp -p $(pgrep -f mysqld) stack.txt如果输出里大量出现buf_LRU_free_from_unzip_LRU_list说明Buffer Pool压力过大需调小innodb_buffer_pool_size建议设为物理内存的70%。4.2 问题二PolarDB读节点查询结果“旧”明明写了主节点现象应用写入主节点后立刻从读节点查有时查不到最新数据有时能查到不稳定。真相这不是Bug而是PolarDB的物理复制延迟。虽然官方说延迟100ms但在高并发小事务场景下存储层的写入队列可能堆积导致读节点看到的数据有毫秒级偏差。验证方法在读节点执行SELECT POLARDB_READ_LATENCY;PolarDB特有变量返回值单位是微秒100000100ms即异常对比主从SHOW MASTER STATUS和SHOW SLAVE STATUS的Exec_Master_Log_Pos差值差值10MB说明复制滞后。解决方案强一致性场景如支付结果页强制走主节点用Hint/*FORCE_MASTER*/ SELECT ...最终一致性场景如商品详情页在应用层加sleep(0.1)再查或用PolarDB的READ_CONSISTENCY参数设为STRONG会牺牲部分读性能。4.3 问题三自建MySQL主从延迟突增到3600秒Seconds_Behind_Master一直不降现象SHOW SLAVE STATUS\G显示Seconds_Behind_Master3600且长时间不变化。排查步骤先看Slave_SQL_Running_State如果是Waiting for dependent transaction to commit说明从库在等上游事务提交检查主库是否有长事务SELECT * FROM information_schema.INNODB_TRX WHERE TIME_TO_SEC(timediff(now(), trx_started)) 300如果是Reading event from the relay log说明SQL线程卡在解析relay log用pt-heartbeat检查网络延迟最常见原因从库的innodb_flush_log_at_trx_commit1强一致性但磁盘IO跟不上主库写入速度。临时方案是改成2长期方案是升级从库磁盘为NVMe。血泪教训某次我们遇到一个诡异案例Seconds_Behind_Master始终为0但实际数据已落后2小时。原因是DBA误删了从库的relay-log.info文件MySQL重启后从头开始拉Binlog但Seconds_Behind_Master计算逻辑有缺陷一直显示0。解决方案用mysqlbinlog解析最新relay log对比主库Binlog位置手动CHANGE MASTER TO。4.4 问题四RDS备份恢复后应用报“Unknown collation: utf8mb4_0900_ai_ci”现象RDS从MySQL 5.7升级到8.0后用逻辑备份恢复数据应用启动时报错。原因MySQL 8.0默认字符集排序规则是utf8mb4_0900_ai_ci而5.7是utf8mb4_general_ci。mysqldump导出时如果没加--compatiblemysql40参数会把新排序规则写进SQL文件。修复命令-- 在恢复前先执行 SET GLOBAL default_collation_for_utf8mb4 utf8mb4_general_ci; -- 或者在dump文件里全局替换 sed -i s/utf8mb4_0900_ai_ci/utf8mb4_general_ci/g backup.sql预防措施升级前用SELECT DEFAULT_COLLATION_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAMEyour_db;查库级默认排序规则确保与目标版本一致。4.5 问题五PolarDB创建只读节点后QPS不升反降现象PolarDB主节点QPS 5000加了2个只读节点整体QPS降到3200。根因分析PolarDB的读写分离代理Proxy默认采用轮询策略但应用层如果开启了连接池连接会复用导致大部分请求打到同一个只读节点该节点CPU打满Proxy自动将其摘除流量回流到主节点。验证方法登录PolarDB控制台看各节点的CPUUtilization曲线如果一个节点持续95%其他节点20%就是此问题。解决方案在应用连接串里加参数useServerPrepStmtsfalsecachePrepStmtstrue强制连接池复用预编译语句减少Proxy路由压力或在PolarDB控制台将读写分离策略从RoundRobin改为Weighted给每个只读节点分配相同权重并开启ConnectionMultiplexing连接复用。5. 决策之外的延伸思考当“选型”变成“治理”做完二十多个数据库选型项目后我越来越意识到技术选型只是起点真正的挑战在于数据库治理。RDS、PolarDB、自建MySQL它们不是静态的“盒子”而是需要持续运营的“活体”。比如我们给一家金融客户做的治理实践成本治理用脚本每天扫描所有RDS/PolarDB实例识别“连续7天CPU5%且连接数10”的闲置实例自动发邮件给负责人3天未响应则自动降配安全治理用阿里云Config服务监控RDS参数组一旦发现skip_grant_tablesON或log_binOFF立即触发钉钉告警并自动修复性能治理接入PolarDB的Performance Insight对TOP10慢SQL自动创建索引建议并推送至研发IM群附带EXPLAIN截图和收益预估如“加此索引后该SQL执行时间从1200ms降至8ms预计减少IO压力37%”。这种治理不是靠人盯而是靠自动化流水线。它的底层逻辑是把数据库从“基础设施”升维成“数据服务产品”——DBA不再是救火队员而是产品经理定义SLA如“99.95%时间延迟50ms”驱动开发、测试、运维共同履约。所以当你拿到“瑶池数据库 RDS PolarDB 推荐矩阵”时别只把它当一张选型表。它真正的价值是帮你建立一套以业务为中心、以数据为资产、以治理为手段的数据库现代化路径。这条路没有标准答案但每一步都该踩在业务真实的脉搏上。我在实际操作中发现最成功的迁移从来不是技术最先进的方案而是那个让业务方在周会上笑着说“数据库的事我们再也不用操心了”的方案。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进