支付宝双11的功臣-分布式关系型数据库(oceanbase)

我们都知道阿里双11,除了创造了世界史上的交易奇迹之外,也创造了世界技术史上的奇迹。支付宝的峰值达到了每秒12万笔,这在技术界简直是一个奇迹。为什么说他是一个奇迹呢?简单的来解释一下:其实在日常开发中,打交道最多的就是数据库,好多开发都戏称只会增、删、改。但是千万不要小看增、删、改,因为假设你只有一个用户访问的你的数据库,你怎么写都可以,但是如果有几十万,上百万,上千万,乃至上亿用户呢?如果操作不当,那么你的数据库一定会down掉。所以看上去简单的东西其实一点都不简单,就好像风清扬一样,简单的剑招却蕴含着上千变化。

这里,我主要想揭秘下oceanbase,因为整个支付宝的交易的库都是依赖于它。oceanbase究竟是什么?用官方的话是这样的:OceanBase是一个支持海量数据的高性能分布式数据库系统,实现了数千亿条记录、数百TB数据上的跨行跨表事务,由淘宝核心系统研发部、运维、DBA、广告、应用研发等部门共同完成。那么以前在没有使用ob之前,支付宝都用的什么呢?mysql或者oracle。这两个一个是开源的数据库,一个是甲骨文公司的商业付费数据库。简单的来说都是人家老外搞得!其实这两个数据库已经很强大了,支付宝以前的框架都是基于这两种数据库的。但是随着业务的发展,这两种数据库也带来了弊端。

-------------------------------------------------------------华丽的分割线-------------------------------------------------------------

假设我们要撑起上千万的并发量,上百PB,乃至TB的数据量。如何设计?

方案一、单库(热备)

这个方案完全不行,原因不多说了。

方案二、数据拆分(分库分表)

按照业务特点将数据拆分:

垂直拆分以及水平拆分------比如说利用用户的user_id通过hash取模,然后路由到不同的分区。

这么做带来的问题有两个:1、当数据/负载增加时,需要人工介入,代价非常大。

2、select查询有时候需要便利所有的分区,速度非常慢。

3、每一台机器都要主从同步,管理起来太麻烦。

方案三、参考google的bigtable

主要是将一个bigtable拆分成几百万个子表(主键有序)。

好处:1、数据不会丢失(hdfs),故障迁移,可扩展。2、子表有序,查询快。

这样的话,方案就生成了,参考bigtable,在hbase的开源基础上自己开发一套。后来经过验证发现不行,因为,首先hbase的开源不彻底,每台单机支持的数据有限,然后是必须引入分布式事务2PC,一般时间在2~5s左右,因为对于hbase这种nosql只保证单行事务,如果要跨行跨表操作是支持不了的。并且分布式事务太耗时,所以这个方案只能抛弃!

在设计oceanbase的时候,目标是支持10w+tps,100w+qps,100TB+数据,难道没有方案了么?-------------------------------------------------------------华丽的分割线-------------------------------------------------------------

既要有非关系数据库的海量数据存储,还要有关系型数据库的事务,到底如何该解决呢?

经过数据分析,发现了隐藏在数据中的一个秘密:虽然业务线的数据量庞大,但是修改量实际很少。这个怎么理解。

我打个比喻:

1、人口基数实际上非常大,但是考虑到出生/死亡/失踪,这部分人口实际上在总人口中占比很小。

2、金融账务系统每天要记录很多的流水,但是考虑到一半在线上保存一年的流水,那么每天新增的几乎占比很小。

3、金融交易系统每天虽然要记录很多交易,但是考虑到一半都保存一年以上的交易记录,那么新增的占比很小的。

这就是隐藏在数据中的秘密!

其实大部分的数据,都是基数大,新增,删除,修改量占比不大。

那么可以这么解决。采用单台服务器记录最近一段时间的修改增量(内存中记录),而以前的数据不变(基线数据)。写事务只在单台服务器写,避免了2PC,高效的实现了跨行跨表事务。然后定期合并修改增量到基线数据服务器。

-------------------------------------------------------------华丽的分割线-------------------------------------------------------------

基于上面描述,OB整个系统架构:

整个ob集群包括:rootserver,updateserver,chunkserver,mergeserver这几个类服务器。

client:与mysql兼容,协议相同。

rootserver:管理集群,子表,数据分布,副本。分为主,副(主备数据同步)

updateserver:存储ob中的增量数据(内存)主备

chunkserver:存储基线数据

mergeserver:接受sql,解析,优化,转发给chunkserver或者updateserver,合并结果给客户端。

接下来我们来深入探讨一下:

首先ob部署在多个机房,每个机房一个ob集群。

客户端的请求过程:

1、请求rootserver获取ob集群中的mergeserver列表

2、按照一定策略选择mergeserver

3、请求失败后,重新选择一台mergeserver,如果某一台被请求失败超过一定次数,拉黑。

oceanbase集群会根据路由规则控制流量比,所以不用担心负载的问题。

ob中的基线数据按照主键排序(查询非常快)并划分为子表(每一个256M),并且都有副本。而在rootserver中记录了每个子表在chunkserver的位置。

mergeserver会缓存子表的分部信息,根据请求转发给该子表所在的chunkserver,如果写操作还会转发给updateserver。

在chunkserver中,一般存储子表,而一个子表由多个sstable过程,每个sstable的容量4k~64(主键有序)。

合并操作:

oceanbase定期触发合并/数据分发操作,chunkserver会从updateserver中获取一段时间更新的操作。(业务低谷时操作)

updateserver:

更新操作写入内存,当内存数据量超过一定值时,生成快照存储在SSD中。

定期合并/数据分发:把updateserver增量更新分发到chunkserver中。

1、updateserver冻结当前的活跃的内存表(Active Memory),生成冻结内存表,开启新的活跃内存表后,缓存更新操作写入新的活跃内存表。

2、updateserver通知rootserver数据版本变化,rootserver心跳通知chunkserver。

3、每台chunkserver启动定期合并或数据分发,从updateserver获取每个子表对应的增量更新数据。

为什么分为定期合并和数据分发?

定期合并:chunkserver讲本地sstable中的基线数据与冻结内存表中的增量更新数据归并,生成新的sstable。(因为合并操作对服务器性能影响非常大,需要在业务低估时进行)

数据分发:chunkserver将updateserver中的冻结内存表中的增量缓存到本地。(不受业务高峰限制)

以上就是我对ob的原理的总结,其中也看出一些问题,首先updateserver需要非常大的内存,第二为了避免单点,应该是主备切换,这里面用了zookeeper中的paxos算法,选举主机。整个ob还是非常复杂的,如果想深入探究还需要花费很大的功夫啊!

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

推荐阅读更多精彩内容