随着业务越来越复杂,数据量越来越大,并发量越来越大,数据库的性能越来越低。好不容易找运维申请了两台机器,让DBA部署了几个实例,想把一些业务库拆分出来,却发现一个库里几百个表,拆不出来,扩不了容,尴尬!
创新互联-云计算及IDC服务提供商,涵盖公有云、IDC机房租用、眉山服务器托管、等保安全、私有云建设等企业级互联网基础服务,联系电话:18980820575
因为数据库强关联在一起,无法通过增加数据库实例扩容,就是一个耦合的典型案例。
举个栗子。
有一个公共用户数据库DB_USER,里面table_user存放了通用的用户数据:
- table_user (uid, name, passwd, …)
在数据量比较小,并发量比较小,业务还没有这么复杂的时候,为了提高资源利用率(程序员才没有考虑什么资源利用率,更多的是图方便),业务A把用户个性化的数据也放在这个库里:
- table_A(uid, A业务的个性化属性)
业务A有一个需求,即要展现用户公共属性,又要展现业务A个性化属性,程序员经常这么实现的:
- select * from table_user, table_A
- where table_user.uid = table_A.uid
- and table_user.uid = $uid
初期关联查询没有任何问题,单条记录访问,命中索引,一次查询所有数据,简单高效。
通过join实现业务,导致通用表table_user和业务表table_A必须存在于一个数据库实例里。
如果业务B也这么做,业务C也这么做,会导致公用业务,业务A,业务B,业务C都必须存在于一个数据库实例里。
假如A业务线上线了一个新功能,不小心进行了全表扫描,导致数据库CPU100%,数据库实例性能下降,由于实例共用,通用业务,业务B和业务C都会受影响。
即某个业务线的数据库性能急剧下降导致所有业务都受影响,这种耦合,历史总是惊人的相似:
额,然而,这个理由,好像在大boss那解释不通…
唉,加了几台机器,加了几个实例,然而并没有什么卵用,都耦合在一个实例里,完全扩不了容。
还是上面的例子,当公共的user数据访问服务化之后,依据服务化的原则:
原来业务方:通过join一次性获取通用的数据和个性化的业务数据数据。
服务化+垂直拆分后,变成两次访问:
两种方式相比:
业务复杂,数据量大,并发老大,对扩展性要求更高的架构,一定是后者。
此时各业务有自己的库,公共有公共的库:
个性业务数据访问垂直拆分,共性数据访问服务化下沉,只是一个很小的优化点,但对于数据库解耦却是非常的有效。
希望大家每天收获一点点,这样架构就能美好一点点。
【本文为专栏作者“58沈剑”原创稿件,转载请联系原作者】
戳这里,看该作者更多好文
分享题目:我C,一个库里Curry几百个表,这谁受得了?
本文网址:http://www.shufengxianlan.com/qtweb/news38/147038.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联