`

解决海量数据的新思路——分布式数据库

阅读更多
目前,分布式的概念越来越流行,但是在数据库领域里,分布式的应用相对较少。在参阅了Google的Map/Reduce概念后,我构思了一种分布式数据库的架构,并实现了其雏形,现在将其基本思路写出来,希望能起到抛砖引玉的作用。我工作时间不长,其中错误,不完善之处还请大家多多指出,谢谢。

设计这个分布式数据库的目的在于快速的处理海量数据。基本思路其实很简单,将数据分布到多个数据节点中,在执行SQL语句时,分析SQL语句的语义,对一个或多个数据库进行操作。这样就可以使查询的压力分散到每一个节点上面,面对海量数据时的处理时间大大缩短。

先拿几个简单的SQL语句做分析,看看在分布式的环境下和平常有何不同。假设我们现在有两个数据节点A和B,表名为Table,其中ID为1~100的数据保存在节点A,ID为101~200的数据保存在节点B。以下的SQL语句都是同时对2个数据库执行。

Select * from Table where ID=1
这样A数据库将返回ID为1的数据,数据库B返回为空。这时简单的合并A和B的数据,就可以得到正确的结果。

Select top 10 * from Table
这时A数据库将返回10条数据,B数据库返回10条数据,这时如果合并A和B,将返回20条结果。这时必须移除多余的10条数据才是正确的结果。

Select * from Table order by ID
这时A,B数据库将返回所有的数据,但是要使得数据符合order by的条件,很显然应该进行一次排序操作。

Select top 10 * from Table order by ID
这时A,B数据库都返回10条数据,经过合并后,还要经过排序,移除的操作,才能确保结果正确。

SQL语句中需要处理的关键字还有max,min,count,sum,avg等,这里就不写出来了。经过这几个例子我们可以看到,其实只要经过一些处理,分别对不同数据节点上的查询,可以转化成对单一数据库查询等效的结果。而这些处理归纳起来,只有合并,排序,移除这三种情况,其实这和Map/Reduce思想非常的类似,无论什么复杂的动作,最终归结都可以通过几个简单操作来完成。这些处理当然需要一定的时间,但是在面对海量数据时,很多情况下,处理所需要的时间可以小到忽略不计。

上面只是一些简单的SQL语句,面对一些复杂的SQL语句,要在SQL语句处理的过程中,进行数据节点之间的数据交换才能完成的(例子在文末会给出)。因此要实现一个完全能够处理SQL语句的分布式数据库,需要在数据库的内核部分进行改动。在实现这个组件时,时间是有限的,进行内核部分的改造不现实,所以我采取了中间件的方式,来实现了这个分布式数据库的雏形,采用的数据库是MSSQL2000,下图是我设计的分布式数据库的概念图(参见附件1):


如图所示,数据根据一定规则分布(一般可以直接Hash主键)到每一个数据节点中,由分布式数据库服务器对每个数据节点进行访问,进行归并/排序/移除操作,然后通过数据接口,返回给程序。

其中几个数据接口所适用的场景为:

Reader:提供对数据库的查询结果,逐条进行读取的接口。在海量数据下,有时候需要读取大量数据进行处理,如果一次读取到内存中显然不现实。此时可以使用Reader模式逐条读取,进行分批处理。

DataFiller:提供对数据的XML包装,适用于小数据量的读取,主要是给Web应用提供一个方便的接口。

Command:执行delete,update,insert等不返回数据的SQL语句。

BulkCopy:批量插入接口。主要是为大数据量的导入提供高速接口。

实现这个中间件,难点应该是在SQL语句的语义分析上。这块应该使用编译原理来实现,但是在我的实现中,并没有用到,原因一个是时间问题,另外一个是因为基于中间件的方式,对一些复杂的SQL语句无法得到正确的结果。所以使用了正则表达式和一些方法来对SQL语句进行分析,分析出应该如何对执行结果进行处理,以及SQL语句应该发送到单个节点还是多个节点。以下是处理的流程示意图(参见附件2):

在实现时需要注意的地方是,一定要让SQL语句从发送到执行,到返回结果之间没有任何延迟,否则每秒能够执行的SQL语句最多只有几十条。一开始我使用的模型是很常见的查询线程模型(参见附件3):

每个语句执行完毕之后,在HashMap中将执行状态设置为执行完毕。使用一个查询线程,不断的遍历HashMap,发现有执行完毕的语句,便将其发往结果处理模块。为了避免CPU占用率100%,查询线程必须要有Sleep语句,但是windows下线程轮切的最小时间段为15ms,并且在Sleep的过程中,CPU将优先处理其他线程,这样Sleep一次至少需要20ms。这样,无论SQL查询再快,分布式数据库的处理速度也会被限制在1000/20=50条/秒以下。在我做的第一个模型中,每秒最多只能处理20多条SQL语句,在面对Web应用时,显然是不够的。

后来我采用的是信号量机制,即在生成Query线程时,给其分配一个信号量,执行每个SQL语句都会将一个监视线程加入线程池,监视线程堵塞住,等待所有信号量置为发信状态,然后立刻将结果送入结果处理模块。Windows处理信号量是非常快的,可以以CPU指令周期来计量。经过这个改进,分布式数据库处理一个查询的语句,基本等同于执行查询所需的时间。当然,这样的设计造成了使用的线程比较多,调试起来非常困难,需要非常小心的设计,而且在数据节点多的时候,必须维护一个成百上千线程的线程池,个人觉得是非常不好的。我注意到无论处理多少数据,MSSQL中的线程只有20多个,可以判断出他们的设计是非常精巧的,肯定和我的这种设计不同。如果有更好的方法解决这个问题,请不吝赐教,谢谢。

以上便是一个分布式数据库中间件的基本概念和一个基本实现。当然,实现一个商用的中间件,还有很多工作需要做,例如权限,数据安全,节点故障处理,日志等模块,都有很多改进的地方。目前我实现的这个中间件非常简陋,由于MSSQL本身的限制,有很多模块实现得不够优雅,不过唯一值得欣慰的是,性能上来说是非常不错的,达到了分布式系统的初衷。目前有3台机器作为数据节点运行,进行随机数据访问时,负载基本平均分到了每一个节点上。大数据量读取,大数据量写入一般都有单数据库2倍以上的速度。当然,分布式不是万能的,目前有些问题是无法解决的。例如:

1、多表问题:简单的举个例子,例如有一张用户表,一张产品ID表,还有一张交易记录表,以用户表,产品ID表为外键,如果执行诸如

Select * from 交易记录表 where 交易记录表.产品ID=产品ID表.ID and 交易记录表.用户ID=用户表.用户ID

这样的语句时,如果只对执行完的结果进行处理,无论如何架构这几张表,都会出错。为什么?原因有点难说清楚,有兴趣的话仔细思考一下就知道了。
对于这样的语句,中间件根本无法处理,只有修改内核,在执行语句的过程中,对每个数据节点进行数据交换,才可以解决。目前的解决方法是把其中一张表放到单个数据库上。不过这样程序看起来就很怪异,一个查询动作要用到两个不同的数据库访问类,没有弄明白整个框架的程序员都不知道为什么要这样做。

2、语意分析:在分布式的环境下,SQL语意转换为操作原语的难度更加高了,确保其逻辑完全正确很困难,我离散数学学得很差,目前还不能达到100%的正确率,所以不得不在数据接口中保留了手动模式,即手工决定该如何处理数据,非常的丑陋。以目前的识别率,一些复杂的SQL语句要么分开几次写,要么使用手动模式自定义其处理流程才能确保其正确,目前也没时间去完善分析模块,只能随它去了。

提出这些问题希望能得到大家的指点,毕竟独自一人开发思路会有很多局限性,个人感觉其中还有很多地方可以挖掘,完全可能成为另外一种处理海量数据的方式。最后,谢谢你的观赏。

描述: 查询线程模型
大小: 15.3 KB

描述: SQL查询流程示意图
大小: 36.3 KB

描述: 分布式数据库的概念图
大小: 24.9 KB


  • 描述: 分布式数据库的概念图
  • 大小: 24.9 KB
  • 描述: SQL查询流程示意图
  • 大小: 36.3 KB
  • 描述: 查询线程模型
  • 大小: 15.3 KB
分享到:
评论

相关推荐

    解决海量数据的新思路——分布式数据库收集.pdf

    分布式数据库是一种应对海量数据处理的有效解决方案,它将数据分散存储在多个数据节点上,通过智能的数据分布策略和高效的查询优化,实现对大规模数据的高效管理。本文主要探讨了一种基于Google Map/Reduce思想构建...

    2012年数据库技术大会演讲PPT.zip

    武新——分布式并行数据库集群在海量数据处理上的应用 余庆——分布式文件系统FastDFS架构剖析及配置优化 谭怀远—海量数据环境下的Oracle数据库系统架构设计和优化思路 专场4:数据挖掘 商业智能专场—演讲嘉宾及...

    基于信息浓缩粒子滤波的分布式网络数据库优化索引.pdf

    结合数据结构分析、特征融合、干扰数据滤除和语义特征提取等多种技术,基于信息浓缩粒子滤波的分布式网络数据库优化索引算法提供了一种新思路,以应对大数据时代下数据库管理的新挑战。该方法不仅优化了数据访问路径...

    高并发Web架构实现思路——java版

    ### 高并发Web架构实现思路——Java版 #### 一、引言 随着互联网的快速发展,Web应用系统面临着巨大的挑战,尤其是如何处理高并发、海量数据的情况。传统的Web架构已经无法满足当前的需求,这就需要我们探索新的...

    物联网导论PPT——数据库与物联网65.pptx

    这些特性使得传统数据库在处理物联网数据时显得力不从心,尤其是在处理非结构化数据、分布式数据以及高并发查询时。因此,新兴的"NoSQL"数据库应运而生,它们不依赖固定的表模式,通过避免联接操作来提高性能,特别...

    物流管理专业文献翻译--物联网-传统数据库的死亡.doc

    但是,物联网环境下的数据特征——海量节点、数据生成速度、全球性空间覆盖——迫使我们重新审视现有的数据库技术。 物联网的每个节点都是数据的源头,它们能够实时监测环境,并将收集的数据传递给其他节点或中心...

    数据库技术发展的思考PowerPoint演示文稿.ppt

    数据库技术发展的思考中,引出了一个关键问题——如何有效地应对Web带来的海量数据和应用需求。Web不仅带来了数据源的多样化,还提出了高效数据管理和应用开发的挑战。Google的成功在一定程度上揭示了搜索引擎在处理...

    「大数据干货」基于Hadoop的大数据平台实施——整体架构设计.pdf

    特别是在第三方支付公司这样的场景中,随着业务的快速增长,海量交易数据的处理需求变得尤为紧迫。传统的数据库和系统已经无法满足实时报表、数据分析和竞争力提升的要求,因此,构建一个高效、可靠的大数据平台显得...

    基于众包的数据标注系统分析.pdf

    随着互联网的发展,越来越多的非专业人士(即“众包者”)参与到数据处理工作中来,这为解决大规模数据标注问题提供了一种新的思路。 **重要知识点:** 1. **自然语言处理与情感分析的重要性:** - 自然语言处理...

    这可能是最全的高并发、高性能、高可用解决方案总结.docx

    在互联网领域,面对海量用户访问与数据处理需求,实现**高并发(High Concurrency)**、**高性能(High Performance)**及**高可用(High Availability)**成为了系统设计的核心目标之一。本文旨在全面解析针对这...

    基于 OGSA- DAI的空间数据访问和集成研究 (2005年)

    网格技术的发展对传统数据库系统提出了新的挑战,尤其是空间数据库系统,因为它们通常需要处理海量的数据。 #### 空间数据库系统与网格技术的融合 空间数据库系统存储和管理海量的空间数据,包括地形几何数据和纹理...

    HBase 权威指南(HBase The Definitive Guide)

    - **非关系型数据库**:HBase 采用了不同于传统关系型数据库的设计思路,支持海量数据的快速读写操作,尤其适合大数据场景下的应用。 - **扩展性**:HBase 支持水平扩展,可以通过增加节点来提升系统的整体性能和...

    互联网公司技术架构资料.腾讯.集中式IT系统的技术架构

    技术团队人数增加至6000人左右,技术基础也开始向分布式缓存、消息队列、数据拆分、Key-Value数据库和Hadoop等更为先进的技术演进。 - **2010年之后:**腾讯进一步扩大了业务范围和服务领域,不仅包括国内还涉及...

    架构师(10月刊)

    - **阿里巴巴的数据架构实践**:分享了阿里巴巴在构建大数据架构方面的经验教训,以及面对海量数据时的技术挑战。 - **创新者的视角**:介绍了几家在大数据领域内领先的公司,以及它们是如何利用大数据技术来推动...

    简易全文本搜索引擎设计

    - **分布式体系结构**:为了应对大规模数据处理的挑战,搜索引擎越来越多地采用分布式架构,提升系统的可扩展性和性能。 - **交叉语言检索**:随着全球化进程的加快,支持多语言搜索成为搜索引擎的重要发展方向之一...

    信息化技术基础知识概况.docx

    - **大数据**:海量数据的处理和分析能力。 - **人工智能**:机器学习、深度学习等技术的发展。 - **物联网**:万物互联,智能设备间的通信和数据交换。 - **区块链**:分布式账本技术,增强数据安全性和透明度...

Global site tag (gtag.js) - Google Analytics