云联信息:云上数据库做读写分离,什么时候该做
系统一慢,第一反应往往是加一个只读实例,把查询分出去。这个动作看起来简单,实际会带来一串新问题:刚写完读不到、事务里读到旧数据、连接池配置混乱。做之前,先判断该不该做。
先确认瓶颈在数据库
应用层慢、网络慢、SQL 写得差,加只读实例都没用。用慢查询日志和监控确认,CPU 和 IOPS 是不是真的顶到了。
写多读少不适合分离
读写比接近 1:1 的场景,分离收益很小。读远多于写,比如内容站、商品详情,分离才有意义。
延迟问题必须面对
主从复制有延迟,毫秒到秒级不等。写完立刻读的场景,要强制走主库,否则用户会看到自己刚提交的数据不见了。
用中间件还是改代码
中间件能透明分流,但增加了运维复杂度;改代码可控,但要改的地方多。中小项目建议先改代码里的关键查询。
事务内不要跨库
一个事务里的读写必须在同一个连接上完成,跨库会破坏事务语义。这部分逻辑要单独梳理。
只读实例的规格
只读实例不是越小越好。多个只读实例分摊查询,单实例的规格也要跟得上,否则只是把瓶颈挪了个位置。
连接池要分开配
主库和只读库的连接池分开配置,避免只读查询把主库连接占满。上限按实际并发设,不是越大越好。
报表类查询单独走
后台报表、导出、统计这类重查询,最好走独立的只读实例,不要和线上查询抢资源。
延迟监控要做
监控复制延迟,超过阈值自动把读请求切回主库。这个开关必须有,否则延迟一大就是大面积脏读。
故障切换要演练
主库挂了,只读实例能不能顶上,应用能不能自动切换,要实际演练。没演练过的切换方案,等于没有。
先优化 SQL 再拆分
加索引、改写法、减少返回行数,往往能解决大部分问题。这些做完还不够,再考虑读写分离。
从库也要备份
只读实例不等于备份。主库故障时,只读实例未必能直接提升为主库,备份策略要独立设计。
连接数会翻倍
多一个只读实例,就多一份连接数消耗。数据库的最大连接数是硬限制,扩容时要一起算。
读写分离和分库分表
先做读写分离,再考虑分库分表。顺序反了,复杂度会成倍增加。
用影子流量验证
切换前把一部分真实查询引流到只读库,观察结果和延迟。比直接全量切安全得多。
读写分离解决的是读压力,不是所有性能问题。瓶颈判断、读写比、延迟容忍度三件事想清楚,再决定拆不拆。云联信息【资深云服务专家微信:cloud7591】,我们做数据库优化时,通常先看一周的慢查询,再谈架构调整。
