`
forchenyun
  • 浏览: 310049 次
  • 性别: 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特性的几个产品实现机制,再来对比你的方案,你这个方案只有在数据量极小的情况下勉强可用。

相关推荐

    node-v12.20.1-sunos-x64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    基于Springboot+Vue的乡政府管理系统-毕业源码案例设计.zip

    网络技术和计算机技术发展至今,已经拥有了深厚的理论基础,并在现实中进行了充分运用,尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代,所以对于信息的宣传和管理就很关键。系统化是必要的,设计网上系统不仅会节约人力和管理成本,还会安全保存庞大的数据量,对于信息的维护和检索也不需要花费很多时间,非常的便利。 网上系统是在MySQL中建立数据表保存信息,运用SpringBoot框架和Java语言编写。并按照软件设计开发流程进行设计实现。系统具备友好性且功能完善。 网上系统在让售信息规范化的同时,也能及时通过数据输入的有效性规则检测出错误数据,让数据的录入达到准确性的目的,进而提升数据的可靠性,让系统数据的错误率降至最低。 关键词:vue;MySQL;SpringBoot框架 【引流】 Java、Python、Node.js、Spring Boot、Django、Express、MySQL、PostgreSQL、MongoDB、React、Angular、Vue、Bootstrap、Material-UI、Redis、Docker、Kubernetes

    一名合格的程序猿修炼手册.md

    一名合格的程序猿修炼手册.

    5MHz 函数发生器使用说明书

    5MHz 函数发生器使用说明书

    99- 矿山工业互联网平台解决方案.pptx

    99- 矿山工业互联网平台解决方案.pptx

    基于Python大学生社会实践申报系统的设计与实现带vue前后端分离毕业源码案例设计.zip

    网络技术和计算机技术发展至今,已经拥有了深厚的理论基础,并在现实中进行了充分运用,尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代,所以对于信息的宣传和管理就很关键。系统化是必要的,设计网上系统不仅会节约人力和管理成本,还会安全保存庞大的数据量,对于信息的维护和检索也不需要花费很多时间,非常的便利。 网上系统是在MySQL中建立数据表保存信息,运用SpringBoot框架和Java语言编写。并按照软件设计开发流程进行设计实现。系统具备友好性且功能完善。 网上系统在让售信息规范化的同时,也能及时通过数据输入的有效性规则检测出错误数据,让数据的录入达到准确性的目的,进而提升数据的可靠性,让系统数据的错误率降至最低。 关键词:vue;MySQL;SpringBoot框架 【引流】 Java、Python、Node.js、Spring Boot、Django、Express、MySQL、PostgreSQL、MongoDB、React、Angular、Vue、Bootstrap、Material-UI、Redis、Docker、Kubernetes

    工厂工资明细表Excel模版

    基于提供的字段介绍,我们可以设计一个基础的工厂工资明细表Excel模板结构如下: | 序号 | 姓名 | 工种 | 工作天数 | 工时费/天 | 小计(正常工资) | 加班时间 | 加班费率/小时 | 小计(加班工资) | 预借 | 合计(实发工资) | 签字 | 备注 | | ---- | ---- | ---- | -------- | ---------- | -------------- | -------- | -------------- | --------------- | ---- | -------------- | ---- | ---- | | 1 | | | | | | | | | | | | | | 2 | | | | | =D2*C2

    供应链管理 高成本、高库存、重资产的解决方案.rar

    随着市场竞争的不断加剧和客户需求的多样化,传统的供应链管理模式面临着高成本、高库存和重资产等一系列挑战。为了有效应对这些挑战,企业亟需通过数字化转型来重塑供应链管理,实现效率提升和成本降低。本资料《供应链管理:高成本、高库存、重资产的解决方案》提供了针对这些问题的综合性数字化解决方案。在这份精品资料中,读者将了解到如何利用先进的信息技术手段,如大数据、云计算、物联网(IoT)和人工智能(AI),对供应链进行优化。通过实时数据分析,企业能够精准预测市场需求,从而减少过剩库存,降低仓储成本。同时,智能化的供应链协同平台可以加强供应商与制造商之间的合作,提高响应速度和灵活性,缩短产品交付周期。此外,资料还深入探讨了如何通过数字技术实现供应链的可视化管理,使企业能够全面掌握供应链的每一个环节,及时发现并解决问题,避免成本浪费。通过采用轻资产运营模式,企业能够减轻固定资产负担,提高资本使用效率。最终,这份资料不仅为企业提供了一套完整的供应链数字化转型路径,还结合具体案例分析,展示了数字化转型如何在实际操作中带来显著成效,帮助企业在激烈的市场竞争中保持领先地位。重新回答||

    五相感应电机矢量控制模型MATLAB

    适合相关科研人员,新手借鉴啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊

    node-v10.14.0-x64.msi

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    基于STM32F103C8单片机-FLASH读写程序KEIL工程源码.zip

    STM32学习软件编程资料,STM32F103C8单片机经典外设应用设计实例软件源代码,KEIL工程文件,可供学习参考。

    node-v12.22.8-sunos-x64.tar_3.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v12.16.2-sunos-x64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    菜鸟自制流密码.docx

    菜鸟自制流密码.docx

    基于大数据的房产估价.doc

    基于大数据的房产估价 基于大数据的房产估价是一种利用海量数据和分析技术来评估房地产价值的方法。它通过收集、整合和分析各种与房地产相关的数据,以提供更加准确、全面的房产估价服务。 首先,大数据在房产估价中的应用主要体现在数据收集和处理上。这些数据可能包括不同时间点的房产属性、成交量、成交额、成交时长等,以及消费者线上行为数据和市场交易数据等。这些数据可以来自于多个渠道,如政府部门、房地产机构、互联网平台等。通过对这些数据的收集、清洗、整合和分析,可以更加准确地判断房地产市场的现状和趋势,为房产估价提供有力的数据支持。 其次,基于大数据的房产估价方法还可以结合地理信息系统(GIS)和其他技术工具,对房地产价格进行精细化分析。例如,可以利用GIS系统判断各类城市生活配套设施对房地产价格影响的权重,或者结合消费者行为数据和交易数据,分析目标消费者的核心需求和迫切程度,从而更准确地判断房地产项目的可行性和市场潜力。 此外,基于大数据的房产估价还可以利用机器学习、人工智能等先进技术,构建预测模型,对房地产市场的未来发展进行预测和研判。这些模型可以根据历史数据和趋势,分析各种因素对房地产价格的

    node-v11.6.0-linux-armv7l.tar.gz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    5G网优认证练习题题库.xlsx

    5G通信、网络优化与通信建设

    绘画学习平台微信小程序设计+ssm后端毕业源码案例设计.zip

    网络技术和计算机技术发展至今,已经拥有了深厚的理论基础,并在现实中进行了充分运用,尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代,所以对于信息的宣传和管理就很关键。系统化是必要的,设计网上系统不仅会节约人力和管理成本,还会安全保存庞大的数据量,对于信息的维护和检索也不需要花费很多时间,非常的便利。 网上系统是在MySQL中建立数据表保存信息,运用SpringBoot框架和Java语言编写。并按照软件设计开发流程进行设计实现。系统具备友好性且功能完善。 网上系统在让售信息规范化的同时,也能及时通过数据输入的有效性规则检测出错误数据,让数据的录入达到准确性的目的,进而提升数据的可靠性,让系统数据的错误率降至最低。 关键词:vue;MySQL;SpringBoot框架 【引流】 Java、Python、Node.js、Spring Boot、Django、Express、MySQL、PostgreSQL、MongoDB、React、Angular、Vue、Bootstrap、Material-UI、Redis、Docker、Kubernetes

    抛光机-零件图-机械工程图-机械三维3D建模图打包下载.zip

    抛光机_零件图_机械工程图_机械三维3D建模图打包下载.zip

    Cambro 2020 21 产品目录

    Cambro 2020 21 产品目录

Global site tag (gtag.js) - Google Analytics