分库分表案例1

贝聊亿级数据库分库分表实践

qiuhanrui

7 个月前

文章作者:唐璜,贝聊资深JAVA工程师,曾长期就职于网易

方案实施:郑晓滨,贝聊高级JAVA工程师,曾就职于网易

首先说明一下,这是贝聊2016年针对班级动态所实施的一个数据库分库分表方案,经过一年多的验证,证明我们的方案是可行的,因此分享给大家。

一、业务场景

班级动态是贝聊为家长和老师提供的一个核心功能,类似于微信朋友圈、微博、QQ空间等的好友动态功能,是幼儿园家长老师使用频率最高的功能之一。在贝聊,老师和家长都可以在班级里发布动态、评论动态、点赞动态,内容可以包含文字、图片或者视频等内容。目前只要涉及到好友、粉丝之类的APP或者是网站基本都有这个功能,所以这个业务场景大家应该都很熟悉,就不多介绍了,附一张贝聊APP里班级动态的截图:

二、现状(2016年)

贝聊从2013年成立,至2016年,使用贝聊的幼儿园已经达到几万所,班级动态业务涉及的数据也已经达到亿级,且每天以几十万的速度在增长,预计三年左右就能达到数十亿。与此同时,动态的回复和点赞的数量更大,通常是动态量的几倍到十几倍的样子。

而班级动态、评论与点赞三个表,当时跟幼儿园、班级等主业务数据表放在一起,直接存储在阿里云RDS(MySQL数据库)上,虽然有做主从,但未做分库分表处理(这应该是创业公司初期的通病)。

三、存在问题

容量瓶颈: 单机数据库随着数据量和访问量的增长一定会遇到服务瓶颈。

扩展困难: 单机数据库扩展最终需要依赖硬件升级,扩展过程复杂、对业务影响大。

使用成本高: 单机数据库为获得更高的服务能力,依赖特定的高端设备,成本高昂。

可靠性低: 单机数据库的数据集中存储,宕机时直接影响所有数据库数据的访问。

四、目标

优化后,未来三到五年不需要进行大规模的优化。同时,在避免性能问题的基础上,能支撑几亿甚至几十亿的动态。

五、实施方案

1、独立班级动态数据库

从主业务数据库里剥离班级动态相关数据表,独立成库。原因很简单,一是独立出来方便做处理,二是任何一方有问题,都不会影响另一业务的正常运行。

2、切分班级动态数据库的数据

在要支撑几亿甚至几十亿的数据,同时有频繁的插入和查询的业务场景,不进行数据切分肯定是行不通的。

这里说的数据切分是水平切分,水平切分主要目的是为了突破单节点数据库服务器的 I/O 能力限制,解决数据库扩展性问题。水平切分时首先是通过一系列的切分规则将数据分布到不同的DB或table中,再通过相应的DB路由或者table路由规则找到需要查询的具体DB或者table,最后进行相关操作。

以下看看我们的班级动态、评论与点赞三个表:

由此可见,班级动态表、回复表与点赞表都与幼儿园id相关。实际业务场景就是如此,用户必须在其所在的幼儿园下发布动态,也只能查看、回复与点赞所在幼儿园的动态。那么选择幼儿园id字段作为分库与分表的键,不论是拆分、插入、查询都是没问题的。

那么,分多少个库合适,分多少个表合适,根据什么规则分,一旦单表数量再次达到性能瓶颈怎么办?针对这些问题,我们经过了充分的调研讨论,最后决定采用阿里云 DRDS方案来实施。

DRDS(Distributed Relational Database Service,分布式关系型数据库服务 )是阿里巴巴自主研发,致力于解决单机数据库瓶颈而推出的分布式数据库中间件产品。

先看看阿里云官网关于DRDS的产品介绍(这块好像DRDS的软文,阿里云是不是该付我们广告费呢): DRDS 高度兼容 MySQL 协议和语法,支持水平拆分、平滑扩容、弹性扩展、透明读写分离和分布式事务等特性,具备分布式数据库全生命周期的运维管控能力。

DRDS 支持库级拆分、表级拆分和分库分表拆分。拆分键暂时只支持单个字段。

分库键:DRDS 根据分库键的值将数据水平拆分到后端的每一个 RDS 分库里。键值相同的数据,一定会位于同一个 RDS 数据库里。

分表键:每一张逻辑表都可以定义自己的分表键,键值相同的数据,一定会位于同一个 RDS 数据表里。

由于我们在使用阿里云的RDS,同时我们只需要根据单个字段(幼儿园id)拆分,所以我们用阿里云 DRDS作为分库分表方案完全没毛病,对吧?切分方案确定后,丢给阿里搞,少死好多脑细胞,马云也一边偷着乐去了。

根据阿里云DRDS的官方建议:未来2年预估班级动态数据总量 = DRDS建议单表容量 X 分表数量 X 分库数量

3、独立动态业务

重构现有的班级动态模块,并将其独立成一个Dubbo服务组件。代码重构的目标主要有以下几点:

1)保证大部分的SQL语句能够使用分库分表键,避免全表扫描

2)避免使用JOIN语句,使用单表查询替代

3)灵活使用缓存策略减少DB压力

六、效果比较

1、 性能大幅度提升

响应速度提升5至10倍,以当时获取班级动态列表接口为例:

分库分表实施前:响应时间大致为200ms至1500ms级之间。

分库分表实施后:响应时间提升至大致为30ms至300ms之间。

2、 可方便快速进行横向扩容

如果需要扩容,直接按照阿里云DRDS指引,增加新的分库即可。

3、 架构的优化

独立动态业务,通过Dubbo提供服务,对系统进行解耦,让业务具备快速横向扩容能力。

4、后遗症

独立后,暂时没有做分布式事务,在业务中需要避免跨库事务。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容