淘宝开源的PB级分布式数据库系统OceanBase简介
作者 zhuyanhai | 2011-08-31 15:18 | 类型 专题分析, 中国系统软件, 云计算 | 13条用户评论 »
[ 编者注: OceanBase是一个支持海量数据的高性能数据库系统,实现了数千亿条记录、数百TB数据上的跨行跨表事务,由淘宝网核心系统研发部、运维、DBA、广告、应用研发等部门共同完成。其源代码已于8月31日遵照GPL2开源。 本文第一部分转载于淘宝网核心系统研发部博客, 原始链接位于http://rdc.taobao.com/blog/cs/?p=956 第二部分转载于OceanBase主程序员杨传辉同志的个人博客 , 原始链接位于 http://www.nosqlnotes.net/archives/tag/oceanbase OceanBase的源码可于http://code.taobao.org/project/view/587/ 处得到] OceanBase是什么OceanBase是一个支持海量数据的高性能数据库系统,实现了数千亿条记录、数百TB数据上的跨行跨表事务,由淘宝核心系统研发部、运维、DBA、广告、应用研发等部门共同完成。 OceanBase解决什么问题许多公司的核心资产是各种各样的商业数据,例如淘宝的商品、交易、订单、购物爱好等等,这些数据通常是结构化的,并且数据之间存在各种各样的关联,传统的关系数据库曾经是这些数据的最佳载体。然而,随着业务的快速发展,这些数据急剧膨胀,记录数从几千万条增加到数十亿条,数据量从百GB增加到数TB,未来还可能增加到数千亿条和数百TB,传统的关系型数据库已经无法承担如此海量的数据。许多公司,尤其是互联网公司,正在探索各自的解决之路。 OceanBase的一些基本概念OceanBase逻辑架构简图主键row key,也称为primary key,类似于DBMS的主键,与DBMS不同的是,OceanBase的主键总是二进制字符串(binary string),但可以有某种结构。OceanBase以主键为顺序存放表格数据 sstable一种数据存储格式,OceanBase用来存储一个或几个表的一段按主键连续的数据 tablet一个表按主键划分的一个(前开后闭的)范围,通常包含一个或几个sstable,一个tablet的数据量通常在256MB左右 基准数据和动态数据OceanBase以增量方式记录一段时间内的表格数据的增删改,从而保持着表格主体数据在一段时间内相对稳定,其中增删改的数据称为动态数据(通常在内存,也称为内存表),而一段时间内相对稳定的主体数据称为基准数据,基准数据和转储后(保存到SSD固态盘或磁盘)的动态数据以sstable格式存储 ChunkServer保存基准数据的服务器,通常是多台,为了避免软件硬件故障导致的服务中断,同一份基准数据通常保存了3份并存储在不同ChunkServer上 UpdateServer保存动态数据的服务器,一般是单台服务器。为了避免软件硬件故障导致的服务中断,UpdateServer记录commit log并通常使用双机热备 MergeServer进行静态动态数据合并的服务器,常常与ChunkServer共用一台物理服务器。MergeServer使得用户能够访问到完整的最新的数据 RootServer配置服务器,一般是单台服务器。为了避免软件硬件故障导致的服务中断,RootServer记录commit log并通常采用双机热备。由于RootServer负载一般都很轻,所以它常常与UpdateServer共用物理机器 冻结指动态数据(也称为内存表)的更新到一定时间或者数据量达到一定规模后,OceanBase停止该块动态数据的修改,后续的更新写入新的动态数据块(即新的内存表),旧的动态数据块不再修改,这个过程称为冻结 转储出于节省内存或者持久化等原因将一个冻结的动态数据块(内存表)持久化(转化为sstable并保存到SSD固态盘货磁盘上)的过程 数据合并(merge)查询时,查询项的基准数据与其动态数据(即增删改操作)合并以得到该数据项的最新结果的过程。此外,把旧的基准数据与冻结的动态数据进行合并生成新的基准数据的过程也称为数据合并 联表(join)一张表与另一张或几表连接的关系,类似于DBMS的自然连接 COWCopy on Write的缩写,在OceanBase中特指BTree在更新时复制数据备份写入,避免系统锁的技术手段 OceanBase有什么特点OceanBase设计和实现的时候暂时摒弃了许多不需要的DBMS的功能,例如临时表,视图(view),SQL语言支持等,这使得研发团队能够把有限的资源集中到关键的功能上,例如数据一致性、高性能的跨表事务、范围查询、join等。
上述的DBMS和云计算技术的优势互补使得OceanBase既具有传统DBMS的跨行跨表事务、数据的强一致性以及很短的查询修改响应时间,还有云计算的海量数据管理能力、自动故障恢复、自动负载平衡以及良好的扩展性。 OceanBase现在有什么应用OceanBase现在已经应用于淘宝收藏夹,用于存储淘宝用户收藏条目和具体的商品、店铺信息,每天支持4~5千万的更新操作。后续将陆续推广至其他淘宝应用。 OceanBase的创新之处在哪里?ppt已上传到Slideshare上。 从大学的数据结构课程可以知道,数据量比较大时,有两种数据结构很常用:哈希表和B+树,分布式系统也是类似的。如下图: Amazon的系统实现了一个分布式哈希表,而Google Bigtable, Yahoo PNUTS,Microsoft SQL Azure实现了一颗分布式B+树。分布式哈希表实现相对简单,但只支持随机读取;而分布式B+树支持范围查询,但实现比较复杂,主要有两个难点: 1, 状态数据的持久化和迁移。更新操作改变系统的状态,数据库系统中更新操作首先以事务提交日志(MySQL称为binlog, NOSQL称为commit log)写入到磁盘,为了保证可靠性,commit log需要复制多份并保证它们之间的一致性。另外,机器宕机时需要通过commit log记录的状态修改信息将服务迁移到集群中的其它节点。 2, 子表的分裂和合并。B+树实现的难点在于树节点的分裂与合并,在分布式系统中,数据被顺序划分为大小在几十到几百MB大小的数据范围,一般称为子表,相当于B+树结构中的叶子节点。由于每个子表在系统中存储多份,需要保证多个副本之间的分裂点是一致的。由于子表在分裂的同时也有更新操作,保证多个副本之间一致是比较困难的。 对于这两个问题,不同的系统有不同的解决方法: 1, 状态维持。Google Bigtable将状态数据写入到GFS中,由GFS提供可靠性保证,但GFS本身是一个巨大的工程;Yahoo PNUTS将状态数据写入到分布式消息中间件,Yahoo内部称为Yahoo Message Broker;Microsoft SQL Azure直接通过网络将数据复制到多机,由于一台机器服务多个子表,这些子表的副本可能分布在整个集群中,因此,任何两台机器都可能建立数据复制的网络通道,需要处理与这些通道有关的异常情况。 2, 子表分裂。由于底层有GFS保证可靠性,Google Bigtable设计时保证每一个子表同时只被一台机器(Tablet Server)服务;Yahoo PNUTS通过引入复杂的两节点提交(Two-phase commit)协议协调多个副本之间的一致性,使得他们的分裂点相同;Microsoft SQL Azure干脆不支持子表分裂,牺牲一部分扩展性从而简化系统设计。 淘宝Oceanbase设计之初对淘宝的在线存储需求进行分析发现:淘宝的数据总量比较大,未来一段时间,比如五年之内的数据规模为百TB级别,千亿条记录,另外,数据膨胀很快,传统的分库分表对业务造成很大的压力,必须设计自动化的分布式系统;然而,在线存储每天的修改量很小,大多数情况下单机的内存就能存放下。因此,我们采用将动态数据和静态数据分离的办法。动态数据的数据量小,采用集中式的方法解决,这样,状态数据维持从一个分布式的问题转化为单机的问题;静态数据的数据量大,采用分布式的方法解决,因为静态数据基本不变,实现时不需要复杂的线程同步机制,另外,保证静态数据的多个副本之间一致性是比较容易的,简化了子表的分裂和合并操作。通过这样的权衡,淘宝Oceanbase以一种很简单的方式满足了未来一段时间的在线存储需求,并且还获得了一些其它特性,如高效支持跨行跨表事务,这对于淘宝的业务是非常重要的。另外,我们之所以敢于做这样的权衡,还有一个重要的原因:我们内部已经思考了很多关于动态数据由集中式变为分布式的方案,即使我们对需求估计有些偏差,也可以很快修改原有系统进一步提高可扩展性。 | |
雁过留声
“淘宝开源的PB级分布式数据库系统OceanBase简介”有13个回复
学习了,性能相对于其他基于No-SQL的分布式系统有多大差别?
为啥要开源?谁给个解释?
为了回报感恩消费者,庆祝建党90周年。
显示技术实力? 别人照搬来用估计还是很有难度的
大赞一下淘宝的开源精神。
别家都有开源的东西,咱也来一个,显得咱也与时俱进。源是开了,你们都别来瞎掺乎,麻烦。
主要是为了吸引更多的注意力,外部用户的使用、反馈和参与显然有助于其更快成熟.
还是给我们提供了解决问题的思路。虽然我们没有机会实现这么大的数据库。但是,个人并不认为这个思想有多先进,可以表述为另外一种巨大的cache,或许并行才是终极方案?
估计是实现原理,代码,部分或者大部分是从开源得到的,所以遵循协议,也保持开源。
另外,终极方案貌似是量子计算机,这种查询貌似对量子计算机是小case。
No-SQL数据管理系统同传统数据库系统(比如,MySQL)的差别就是:大多针对自己的应用特点做选择性的设计。这些大的系统在实现上有都各自的特点,也没有统一的管理接口(比如SQL这样的标准模式),别的公司拿过去安装、运维基本不可能。所以,开源的意义就在于介绍自己的产品和实力了。
我想,NoSQL最后的模式应该是逐渐形成一个可以裁剪的完善方案,该方案用户接口更加统一、简便,小公司可以根据需求进行配置、裁剪。典型的就是Apache基金会的hbase,随着不断的扩充覆盖的特性将更加完善,加上apache的其公益性,方案将更加普及。不过,开源社区还是需要淘宝这样的实力贡献者的。
国内,一大堆的公司,在开源的基础上改的,几乎都没有开源,而且还藏的严严实实的。
不过东西怎么样,淘宝的开放,还是很棒的,尤其是在中国的大环境下。
确实, 相比许多大公司天天玩拿来主义,淘宝的这个Open Source,非常漂亮。
非常高兴,国内这一步终端迈得有些豪迈了。