`
forchenyun
  • 浏览: 312269 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

海量数据存储之动态Schema的传说

阅读更多

简介

众所周知,对于海量数据的schema修改是一个极其昂贵的代价,MySQL分表的很大原因其实就有500w数据一个表,DDL会比较快。

一般来说,动态schema是指的非固定表结构,schema字段(有时也指索引)的增删对于正常的读写没有任何影响。一般有两个方向的表现形式:

 

  • Online Schema Change
  • Schema-Free

 

NoSQL中一般采用后者,而关系型数据库可能会采用前者,两者的区别是,前者虽然是固定表结构,但是可以通过一定的方式进行在线修改,同时尽可能不影响服务,而后者是原生支持动态schema,是很多NoSQL产品所支持的feature之一,也是它们之于开源关系型数据库的优势所在。下面我将就目前比较通用的动态schema解决方案就一一介绍。

OSC

OSC即Online Schema Change,是Facebook出的一个在线修改Schema的PHP脚本,它解决了MySQL长期以来无法在线进行Schema变更的一大难题,也成功将Facebook曾经添加一个索引需要几个月的滚动升级,变成了现在的几天。

OSC目前包含以下几个步骤:

 

  • copy:制造一个表的副本
  • build:在副本上进行修改,直到它满足新的schema
  • replay:将原始表的变更传播到副本上
  • cut-over:切换原始表和副本,这需要极短时间的downtime,同时还需要一次replay操作

 

看到这个步骤,或许很多人都觉得简单,其实实践过程还是比较复杂的,有兴趣的人可以去看看,这里不做过多介绍。

http://www.facebook.com/notes/mysql-at-facebook/online-schema-change-for-mysql/430801045932

总之,对于关系型数据库来说一般都是采用的Online Schema Change这种解决方案,商业数据库Oracle和DB2都有比较和谐的Online Schema Change解决方案,但是考虑到其成本,这里不做过多介绍了。

 

优点:在线变更,无额外空间消耗

 

Schema-free

一般来说,文档数据库(Document-orient Database)支持Schema-Free,就mongodb来说,它的一行记录可能是以下格式:

 

{name:"mongo",type:"db","x" : 4, "j" : 1}

 

严格来说其实就是JSON,不过mongo采用的是BSON二进制编码,因此空间上来说应该会比JSON省一些的。

因此,对于这种类型的动态schema方式来说,实际是使用key/value存储的,一条记录的多个字段实际是用json方式合并存在value中。解析的时候按照JSON解析即可,不好的地方是有额外的空间消耗,也许有点人觉得把字段名取为一个字母,但是这样可读性就太差了。

 

优点:完全的schema-free,无需任何改变,适用于及其复杂多变的业务。

 

Any More?

这里补充一点,看到有朋友对于此实现有疑问,这里所说的schema-less是针对的key-value存储,不针对mysql数据库,

MySQL还是建议使用OSC。

 

看完前面的两种解决方案,很多人或许就会觉得,是不是NoSQL鼓吹的动态Schema就是一个笑话呢?把字段存到数据库里面,谁都可以做啊,其实不然,让我们看看另外一个解决方案。这个方案好不好,大家看完后评价。

举例说明,对于下面一个Schema:


 

我们对于这样一个Schema,其元数据信息应该是什么样的呢?

首先对于我们的元数据做如下定义:

 

这里的这个元数据信息是对于某一个schema来说的,依次是一个SchemaId,然后是Name(可以理解为表名),然后是当前schema的代数,其实就是一个类似于版本的东西,初始为0,最后一个是创建或修改时间,还有一些其它信息,这里省略掉。

下面是对于字段的一些元数据,两者通过SchemaId关联,包含了所对应的Schema,在schema中的顺序(解析的时候用),类型,是否为空,是否为主键啊之类的。

 

 

我们有了这些元数据信息以后可以做什么呢?

对于我们的一行记录,我们理解为一串二进制字节码,如何从这串字节码中解析我们的字段呢,依靠的就是这些元数据,下面我将物理上存储的格式贴出来,大家就明白了:


大家注意看,物理上我们存储了一个Generation字段来标识当前的Schema是属于该schema的哪个特点的版本。那么根据这个Generation以及这个表名(即StoreName)我们就可以得出一个SchemaId,根据这个SchemaId我们可以得到有序的该Schema的所有字段,那么剩下的就很easy了,如果对于二进制编码不太熟悉的,请看看Protocol Buffer

 

好了,那么我们如果想增加一个字段呢?需要做的仅仅是修改元信息,将新的Schema信息存入上面两个元数据,如果想读取原有的老数据,那么根据generation进行相关解析即可,如果插入新的Schema的数据,使用最新的generation就可以了,一切都非常完美。这个generation字段还可以使用压缩编码的方式,在generation小于128的时候,我们只需要1个字节的额外空间消耗

 

优点:无需额外空间消耗,无需在线修改,透明的使用,几乎无downtime

缺点:如果增加字段,原有老数据的格式仍然是默认值,但我想这一点大部分人都可以将其忽略

 

总结

上面基本上是目前动态schema的主要实现方法,如果大家有新的解决方案,请告诉我。

欢迎大家交流讨论。

  • 大小: 5.7 KB
  • 大小: 6.5 KB
  • 大小: 23 KB
  • 大小: 6.4 KB
34
12
分享到:
评论
10 楼 SrainG 2012-04-25  
对开发复杂度的影响会导致工程质量的下降
9 楼 kingtay 2011-05-16  
no sql 的构思, 已经在海量数据的场景下用了很多了, 比较好的一个数据存储思路
8 楼 clarkht 2011-05-13  
犀利 膜拜
7 楼 forchenyun 2011-05-11  
raymondysq 写道
为什么不知解存储列名呢,虽然会多一些存储,但是通过一般的压缩算法都是可以大大缓解的。
不过这种动态schema的想法不错。

schema变动对于大部分应用来说都是特殊需求,压缩算法带来的是额外的计算开销,况且压缩比率还与你的相似度有很大关系。
当然,对于schema变动很大并且数据量不大的应用来说,直接按照json方式存储也是很不错的。
6 楼 raymondysq 2011-05-11  
为什么不知解存储列名呢,虽然会多一些存储,但是通过一般的压缩算法都是可以大大缓解的。
不过这种动态schema的想法不错。
5 楼 杨俊华 2011-05-02  
海量数据,还要动态修改schema,还是要用上nosql的数据库啦。
4 楼 lavafree 2011-04-29  
这个Schema相当于序列化与反序列的参照。
3 楼 flyinweb 2011-04-28  
forchenyun 写道
flyinweb 写道
你这个类似于以前很流行的一种动态表单的做法,保留核心内容,其他的列用php的序列化存储;
但是你这样基本上损失了数据库的特性,索引用途没了,开发变复杂了,同时mysql内置的一些查找算法也全都没用了。

建议你仔细看看具有Schema-free特性的几个产品实现机制,再来对比你的方案,你这个方案只有在数据量极小的情况下勉强可用。

哦?已经在10亿级别的量下测试,没有见到性能损失。索引一样在正常使用,不知道你的mysql的内置查找算法是什么意思?
另外,我的实现方法是基于key-value存储的级别,不是数据库,数据库的解决方案有OSC脚本

如果你是基于KEY-VALUE存储的没问题,如果基于数据库就问题大了。

数据库本身会收集很多统计信息,便于查找。
2 楼 forchenyun 2011-04-26  
flyinweb 写道
你这个类似于以前很流行的一种动态表单的做法,保留核心内容,其他的列用php的序列化存储;
但是你这样基本上损失了数据库的特性,索引用途没了,开发变复杂了,同时mysql内置的一些查找算法也全都没用了。

建议你仔细看看具有Schema-free特性的几个产品实现机制,再来对比你的方案,你这个方案只有在数据量极小的情况下勉强可用。

哦?已经在10亿级别的量下测试,没有见到性能损失。索引一样在正常使用,不知道你的mysql的内置查找算法是什么意思?
另外,我的实现方法是基于key-value存储的级别,不是数据库,数据库的解决方案有OSC脚本
1 楼 flyinweb 2011-04-26  
你这个类似于以前很流行的一种动态表单的做法,保留核心内容,其他的列用php的序列化存储;
但是你这样基本上损失了数据库的特性,索引用途没了,开发变复杂了,同时mysql内置的一些查找算法也全都没用了。

建议你仔细看看具有Schema-free特性的几个产品实现机制,再来对比你的方案,你这个方案只有在数据量极小的情况下勉强可用。

相关推荐

    FriendFeed如何使用MySQL存储无Schema数据.pdf

    FriendFeed的这种做法展示了在传统关系型数据库中实现无schema存储的可行性,同时也揭示了在大规模数据环境下,如何平衡数据库的扩展性、性能和灵活性。这种方法对于其他面临类似挑战的大型网站具有借鉴意义,特别是...

    基于 XML Schema 的数据存储方案.doc

    在本文中,我们将深入探讨如何基于XML Schema实现数据存储方案,以此替代传统的数据库存储,尤其适合小型项目,以降低成本并提高项目独立性。 首先,XML Schema数据存储的核心思想是将数据存储在遵循特定Schema定义...

    毕业论文设计基于xmlschema的数据存储方案.doc

    对 XML 文件的保存是应用 XML Schema 进行数据存储的最后一步骤。在保存 XML 文件时,需要考虑到数据的组织结构和字段的类型,以确保数据的正确性和完整性。 本文提供了一种基于 XML Schema 的数据存储方案,该方案...

    json转换jsonschema

    而JSON Schema则是一个JSON格式的规范,用于定义JSON数据的结构和限制,类似于XML Schema,它为JSON数据提供了验证规则,确保数据的准确性和一致性。 在JavaScript开发中,有时我们需要将JSON对象转换为JSON Schema...

    动态数据管理神器DMS基于JsonSchema的动态Json数据配置平台

    动态数据管理神器DMS是一个基于JsonSchema的动态Json数据配置平台,主要针对JavaScript开发中的其他杂项需求。这个平台提供了一种模块化的方式来管理和编辑Json数据,极大地提升了开发者在处理复杂、灵活的数据结构...

    Oracle9i数据类型Java数据类型Schema类型对比.doc

    Oracle9i 数据类型、Java 数据类型以及 Schema 类型之间的对比主要关注它们在存储和处理数据时的差异。这些数据类型是编程和数据库管理中的基础,理解它们的关系对于开发与数据库交互的应用程序至关重要。 1. ...

    基于xmlschema的数据存储方案.doc

    《基于XML Schema的数据存储方案》 XML Schema是一种用于定义XML文档结构的语言,它为XML文档提供了严格的语义和格式规范,使得数据存储更加有序和可预测。在某些小型项目中,由于数据量较小,且为了降低成本和提高...

    STAR SCHEMA完全参考手册:数据仓库维度设计权威指南

    STAR SCHEMA模型是数据仓库设计中最常见也是最有效的模式之一。它由一个中心事实表和一组关联的维度表组成,形成星形结构,从而简化查询并优化性能。 1. **事实表**:在STAR SCHEMA中,事实表存储了业务事件的核心...

    JSON Schema 规范(中文版).pdf

    JSON Schema 广泛应用于数据交换、数据验证、数据存储等领域。 JSON Schema 可以用于定义 JSON 数据结构,验证 JSON 数据,生成文档等。 JSON Schema 的优点 JSON Schema 的优点包括: * 轻量级:JSON Schema 是...

    基于xmlschema的数据存储方案大学毕业论文.doc

    《基于XML Schema的数据存储方案》 XML Schema是一种用于定义XML文档结构的语言,它允许开发者创建规范化的XML数据模型,从而确保数据的一致性和准确性。在本文中,我们将深入探讨如何利用XML Schema作为数据存储的...

    XML详解----Schema(精讲)

    * 数据存储:XML Schema可以用于定义数据存储的格式和结构,确保数据的正确性和一致性。 XML Schema的优点: * 提高数据质量:XML Schema可以确保数据的正确性和一致性,提高数据质量。 * 提高开发效率:XML ...

    xml schema的内置类型

    XML Schema 内置类型是 XML 文档中使用的基本数据类型,它们可以分为基础类型和派生类型两类。基础类型是解析系统直接支持的原始类型,而派生类型是对基础类型或其他内置派生类型加以限制生成的。 基础类型 1. ...

    schema相关知识压缩包

    在数据库管理中,Schema定义了数据库的全局视图,包括表、索引、视图、存储过程等对象。每个表都有自己的结构(列名、数据类型、约束条件等),这些结构组合起来形成了数据库的Schema。例如,在SQL中,我们可以通过...

    SpringBoot+Mybatis实现数据源动态切换

    springboot实现数据源动态切换 注意事项: 1. 该demo采用yml配置数据库信息,注意url标签为jdbc-url 2.项目中加了日志输出,可看到完整执行过程 3.在Service中应用事务时,自定义的注解将失效,解决办法:可将注解...

    JSON Schema 校验库——json-schema-validator(java版本).rar

    它提供了一种验证JSON数据是否符合预定义规则的方法,这对于API开发、数据交换和JSON数据存储非常有用。在Java环境中,`json-schema-validator`库是一个强大的工具,用于根据JSON Schema进行数据验证。 `json-...

    基于xmlschema的数据存储方案本科学位论文.doc

    本文主要探讨了一种不依赖传统数据库的、基于XML Schema的数据存储方案,适用于小型项目。XML Schema是一种用于定义XML文档结构和数据类型的规范,通过它,可以将数据以XML格式存储,并以面向对象的方式进行操作,...

    Schema_Workbench

    **Schema_Workbench:Pentaho的数据仓库建模利器** Schema_Workbench是Pentaho Business Analytics Suite中的一个重要组件,专门用于数据仓库的设计和建模。它为用户提供了在关系型数据库上构建维度(Dimension)和...

Global site tag (gtag.js) - Google Analytics