数据库架构之-海量数据分库分表

背景:
互联网业务发展初期,系统很小,所有的业务代码都放在同一个工程,所有数据也都存放在一个DB中。业务持续发展,代码量一天天膨胀,为了提高开发、测试、上线的效率以及线上系统的稳定性,架构上会采用分布式系统,系统被拆分成多个子系统,子系统拥有独立的版本控制和测试发布过程。此时,如果还是一个DB,多个工程会占用很多连接数,多项业务并行增长,数据量会猛增,数据库的瓶颈马上突显。同时,数据库只有一个实例,如果某一业务系统在某一时间点对数据库造成很大压力,导致数据库崩溃,会直接影响到其他业务系统。
互联网业务发展迅猛,用户量和订单等数据日益增加,订单单表的数据量可能达到千万甚至上亿的级别,数据存储可能占到几十上百G,即使采用主从架构,增加多个从库,提高服务器资源配置,各种索引优化,依然存在很多查询不理想的情况。数据库达到瓶颈,应用只能通过限速、异步队列等对其进行保护。为了满足持续增长的业务,数据库架构必须面临升级。

上面提到的场景下,我们分别需要对数据库进行垂直拆分和水平拆分来解决。

[什么是垂直分库?]

  • 一个数据库由很多表构成,每一张表对应一类业务,按照业务进行归类,将不通业务的表分散到独立的数据库中,来达到分散数据库的压力的目的。

[解决方案?]
以电商系统为例

  • 业务初期,一个开发团队,几个人,为了快速实现业务,一套代码,一个数据库实例。前期业务包含用户、商品、订单、支付等。


    分库1.png
  • 业务后期,增加了促销、团购等很多新业务,同时用户量持续上升,订单量不断增加,数据库压力与日俱增。开发人手增加,不同团队维护不同业务, 系统按业务模块拆分,数据库对应做垂直拆分。

分库2.png

潜在的问题:

数据库实例分为了多个,但是某一业务系统还是会关联多个数据库。会有以下痛点:

  1. user数据的查询sql,在登录和下单的工程里面可能存在2份拷贝。当user表发生变更时,下单业务代码也需要修改。一处升级,多处修改。
  2. 促销和下单都会访问到product表,两者的sql逻辑可能不一样,两个工程由不同的团队维护,如果促销代码由初级工程师写出来,sql性能比较差,可能会影响商品数据库的整体稳定性进而影响到下单。所以sql难以收口,不好控制。
  3. 架构升级可能导致product表拆分或者扩展,那么product相关的所有查询可能都要改,促销、下单等所有工程将会受到影响。耦合太大,业务架构优化很难推进。

架构升级必然会带来新的问题,所以为了代码的复用性、屏蔽底层业务的复杂度、实现数据库解藕,在垂直分库的基础上需要继续服务化的改造。服务化之后,提供通用的接口,性能瓶颈统一在服务层优化。

分库3.png

服务化以后,垂直分库的架构得以成功实施。

[什么是水平分库?]

  • 水平分库就是我们常说的分库分表,一张表分成N多个小表,每张表的结构相同。 即将单张表的海量数据,按某个维度将记录行分散到多个数据库的多个表中,以降低单表的数据量来提高性能并支持无限增长的业务数据存储。

[解决方案?]

  • 一旦涉及水平分库,逃不开“分库依据”sharding key的概念,即使用哪一个字段来切分数据库。选择标准是尽量避免应用代码和SQL性能受影响,这就要求当前SQL在分库后,访问尽量落在单个库里,否则单库访问变成多库扫描,读写性能会受较大影响。同时要保证每个数据库的数据分布是均匀的,且每个数据库的请求压力是均匀的。大部分业务场景会使用业务id取模来分库。

举一个例子:
用户库db-user,user表水平切分后变为2个库,分库依据sharding key采用userId。userId%2=0的数据会落到db0,userId=1的数据则路由到db1。

分库4.png

产生的问题:

  1. 表的主键id无法正常使用数据库的自增策略。因为多个库中的记录id不能重复。
    #必须保证auto_increment的初始值不同,且步长统一;或者在应用层采用自定义的主键生成策略。
  2. 对于带聚合运算的查询,如带groupBy/orderby/min/max/avg等关键字,需要多库查询。
    #应用层要有统一的DAL层将单个数据库的查询结果进行汇总,效率比单库的聚合查询效率低很多,且实现起来复杂。
  3. user库暂时切分为2个库,业务发展到一定阶段可能需要拆分成更多的数据库实例。
    #因为采用了hash取模的算法,当数据库切分为更多后,现有数据库的数据需要迁移。假如切分为4个库以后,现在2个库必须各迁移一半到另外2个库中。业务不停增长,数据库实例可能越来越多,我们需要按照2的N次方进行扩展以降低数据的迁移难度。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容