`
leogao_emcom
  • 浏览: 82716 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论
阅读更多

从InfoQ得来一篇文章

[

怎么样把NoSQL引入到我们的系统架构设计中,需要根据我们系统的业务场景来分析,什么样类型的数据适合存储在NoSQL数据库 中,什么样类型的数据必须使用关系数据库存储。明确引入的NoSQL数据库带给系统的作用,它能解决什么问题,以及可能带来的新的问 题。下面我们分析几种常见的NoSQL架构。

(一)NoSQL作为镜像

不改变原有的以MySQL作为存储的架构,使用NoSQL作为辅助镜像存储,用NoSQL的优势辅助提升性能。


//写入数据的示例伪代码 

//data为我们要存储的数据对象 
data.title=”title”; 
data.name=”name”; 
data.time=”2009-12-01 10:10:01”; 
data.from=”1”; 
id=DB.Insert(data);//写入MySQL数据库 
NoSQL.Add(id,data);//以写入MySQL产生的自增id为主键写入NoSQL数据库

如果有数据一致性要求,可以像如下的方式使用

//写入数据的示例伪代码 
//data为我们要存储的数据对象 
bool status=false; 
DB.startTransaction();//开始事务 
id=DB.Insert(data);//写入MySQL数据库 
if(id>0){ 
    status=NoSQL.Add(id,data);//以写入MySQL产生的自增id为主键写入NoSQL数据库 
} 
if(id>0 && status==true){ 
    DB.commit();//提交事务 
}else{ 
    DB.rollback();//不成功,进行回滚 
}

上面的代码看起来可能觉得有点麻烦,但是只需要在DB类或者ORM层做一个统一的封装,就能实现重用了,其他代码都不用做任何的修 改。

这种架构在原有基于MySQL数据库的架构上增加了一层辅助的NoSQL存储,代码量不大,技术难度小,却在可扩展性和性能上起到 了非常大的作用。只需要程序在写入MySQL数据库后,同时写入到NoSQL数据库,让MySQL和NoSQL拥有相同的镜像数据, 在某些可以根据主键查询的地方,使用高效的NoSQL数据库查询,这样就节省了MySQL的查询,用NoSQL的高性能来抵挡这些查 询。


这种不通过程序代码,而是通过MySQL把数据同步到NoSQL中,这种模式是上面一种的变体,是一种对写入透明但是具有更高技术 难度一种模式。这种模式适用于现有的比较复杂的老系统,通过修改代码不易实现,可能引起新的问题。同时也适用于需要把数据同步到多种 类型的存储中。

MySQL到NoSQL同步的实现可以使用MySQL UDF函数,MySQL binlog的解析来实现。可以利用现有的开源项目来实现,比如:

有了这两个MySQL UDF函数库,我们就能通过MySQL透明的处理Memcached或者Http协议,这样只要有兼容Memcached或者Http协议的NoSQL数 据库,那么我们就能通过MySQL去操作以进行同步数据。再结合lib_mysqludf_json , 通过UDF和MySQL触发器功能的结合,就可以实现数据的自动同步。

(二)MySQL和NoSQL组合

MySQL中只存储需要查询的小字段,NoSQL存储所有数据。


//写入数据的示例伪代码 

//data为我们要存储的数据对象 
data.title=”title”; 
data.name=”name”; 
data.time=”2009-12-01 10:10:01”;
data.from=”1”;
bool status=false; 
DB.startTransaction();//开始事务 
id=DB.Insert(“INSERT INTO table (from) VALUES(data.from)”);//写入MySQL数据库,只写from需要where查询的字段 
if(id>0){ 
    status=NoSQL.Add(id,data);//以写入MySQL产生的自增id为主键写入NoSQL数据库 
} 
if(id>0 && status==true){ 
    DB.commit();//提交事务 
}else{ 
    DB.rollback();//不成功,进行回滚 
}

把需要查询的字段,一般都是数字,时间等类型的小字段存储于MySQL中,根据查询建立相应的索引,其他不需要的字段,包括大文本 字段都存储在NoSQL中。在查询的时候,我们先从MySQL中查询出数据的主键,然后从NoSQL中直接取出对应的数据即可。

这种架构模式把MySQL和NoSQL的作用进行了融合,各司其职,让MySQL专门负责处理擅长的关系存储,NoSQL作为数据 的存储。它有以下优点:

  • 节省MySQL的IO开销。由于MySQL只存储需要查询的小字段,不再负责存储大文本字段,这样就可以节省MySQL存储 的空间开销,从而节省MySQL的磁盘IO。我们曾经通过这种优化,把MySQL一个40G的表缩减到几百M。
  • 提高MySQl Query Cache缓存命中率。我们知道query cache缓存失效是表级的,在MySQL表一旦被更新就会失效,经过这种字段的分离,更新的字段如果不是存储在MySQL中,那么对query cache就没有任何影响。而NoSQL的Cache往往都是行级别的,只对更新的记录的缓存失效。
  • 提升MySQL主从同步效率。由于MySQL存储空间的减小,同步的数据记录也减小了,而部分数据的更新落在NoSQL而不 是MySQL,这样也减少了MySQL数据需要同步的次数。
  • 提高MySQL数据备份和恢复的速度。由于MySQL数据库存储的数据的减小,很容易看到数据备份和恢复的速度也将极大的提 高。
  • 比以前更容易扩展。NoSQL天生就容易扩展。经过这种优化,MySQL性能也得到提高。
]
我仔细考虑了一下,对于使用UDF来实现同步是最好的办法,理由是针对访问数据源的代码,没有必要在写的时候有
维护两个数据源的逻辑,只需要操作mysql就可以了,读的时候,mysql只是冲当了数据库结构元数据的角色,
读数据量又很小,数据都在NoSQL上,它本身又非常快,支持海量的数据。

 最近有个项目,是根据MT5的模型来开发一个外汇交易系统,正在考虑这样的数据库架构。
分享到:
评论

相关推荐

    golang&sql&nosql

    本篇文章将深入探讨Golang在配合SQL和NoSQL数据库时的关键知识点,特别是关于MySQL的优化策略。 首先,让我们关注Golang与SQL的结合。Golang中的`database/sql`包提供了与SQL数据库交互的通用接口。开发者可以使用...

    MySQL & MongoDB.pptx

    与MySQL不同,MongoDB是NoSQL数据库,支持JSON格式的数据存储。安装MongoDB的过程通常涉及下载安装包,配置服务,并启动数据库服务。在Windows上,可以通过可执行文件进行安装,而在Linux上,可以使用包管理器(如...

    读书笔记:【Java学习+面试学习库】更新Mysql,NoSql,Java,消息队列微服务等知识.zip

    读书笔记:【Java学习+面试学习库】更新Mysql,NoSql,Java,消息队列微服务等知识

    白皮书_MySQL_及_NoSQL使用指南

    ### 白皮书_MySQL_及_NoSQL使用指南 #### 核心知识点解析: **一、MySQL与NoSQL的融合** 随着大数据时代的到来,传统的关系型数据库管理系统(RDBMS)面临着前所未有的挑战,尤其是在处理大规模数据集、提供高...

    12 NoSQL数据库_nosql_MYSQL_

    随着互联网技术的发展和大数据时代的到来,传统的关系型数据库(如MySQL)已经无法满足某些特定场景的需求,这时NoSQL数据库应运而生。本文将深入探讨NoSQL数据库及其与MySQL的对比。 **NoSQL的起源与概念** NoSQL...

    【Java学习+面试学习库】更新Mysql,NoSql,Java,消息队列,微服务等知识.zip

    在给定的压缩包"【Java学习+面试学习库】更新Mysql,NoSql,Java,消息队列,微服务等知识.zip"中,包含了多个重要领域的学习资源,这对于提升Java开发者的技能和应对面试非常有帮助。以下是这些关键领域的详细说明: ...

    MySQL到NoSQL:数据的重思和查询方式的转换

    从关系型数据库转移至NoSQL数据库——比如从MySQL转移到Couchbase,你需要对你的数据进行再思考。至于为什么是Couchbase而不是MongoDB什么的,因为博文的作者MCBrown是现任Couchbase副总裁,所以你懂得;同时这篇...

    Java面试题合集(javaee,spring,springmvc,springboot,mybatis,mysql,nosql

    Java面试题合集涵盖了多个关键的技术领域,包括JavaEE、Spring框架、SpringMVC、SpringBoot、MyBatis、MySQL数据库以及NoSQL存储,特别是Redis。这些知识点在现代企业级应用开发中占据着核心地位,因此对它们的理解...

    【Java分布式事务】封装对MySQL NoSQL数据访问、实现分布式事务.zip

    【Java分布式事务】封装对MySQL NoSQL数据访问、实现分布式事务.zip 【Java分布式事务】封装对MySQL NoSQL数据访问、实现分布式事务.zip 【Java分布式事务】封装对MySQL NoSQL数据访问、实现分布式事务.zip 【Java...

    nosql研发之路

    二、NoSQL弥补MySQL的不足 1. **MySQL的扩展问题**:随着数据量的增加,单台服务器难以支撑庞大的数据存储需求,而MySQL的垂直扩展能力有限,通过增加硬件资源提升性能的成本高昂。NoSQL数据库通过水平扩展,即添加...

    什么是NoSQL?Web2.0和云计算的新宠儿.doc

    随着Web2.0和云计算的兴起,和一些反SQL的倡导,越来越多的大公司加入到NoSQL阵营。...许多人甚至抛弃了MySQL开源数据库这个长期以来Web 2.0的宠儿,而改由NoSQL的方案来替代,因为优势实在是引人注目

    cpp-基于canal的mysql与redismemcachedmongodb的nosql数据实时同步方案案例canalclient

    标题中的“cpp-基于canal的mysql与redismemcachedmongodb的nosql数据实时同步方案案例canalclient”指的是一个使用C++实现的项目,它利用了阿里巴巴开源的Canal工具来实现实时同步MySQL数据库的数据到NoSQL数据库,...

    计算机-mysql-基于NoSQL的空间数据云存储的研究.pdf

    【MySQL与NoSQL在空间数据云存储中的应用】 在当今的信息化时代,地理信息系统(GIS)已经成为各行各业不可或缺的重要工具,特别是在交通、城市规划、商业金融和资源管理等领域。空间数据,作为GIS的核心,包含了...

    用于记录在工作和学习过程中积累的数据库使用知识和应用经验,重点为 Oracle 和 MySQL 以及其他 NoSQL.zip

    本资料包主要涵盖了在工作和学习过程中积累的关于Oracle、MySQL以及NoSQL数据库的相关知识和实践经验,旨在帮助读者深化对数据库的理解并提升实际操作能力。 首先,Oracle数据库是全球领先的商业关系型数据库管理...

    实验四:NoSQL和关系数据库的操作比较

    【实验四:NoSQL和关系数据库的操作比较】 本实验旨在对比分析四种不同的数据库管理系统:MySQL、HBase、Redis和MongoDB。这些数据库在处理大数据时各有特点,理解它们的概念及不同点是实验的关键。 1. **MySQL**...

    NoSQL数据库技术实战

    NoSQL与大数据简介、NoSQL的数据一致性、NoSQL的水平扩展与其他基础知识、BigTable与Google云计算原理、Google云计算的开源版本——Hadoop、Dynamo:Amazon的高可用键值对存储、LevelDb——出自Google的Key-Value...

    canal 的 mysql 与 redis/memcached/mongodb 的 nosql 数据实时同步方案

    标题中的“canal”的MySQL与“redis/memcached/mongodb”的NoSQL数据实时同步方案,主要涉及了数据库间的数据迁移和实时同步技术。这个话题涵盖了多个关键知识点,包括: 1. **Canal**: Canal是阿里巴巴开源的一个...

    计算机-mysql-基于NoSQL的数据分析技术的应用研究.pdf

    "计算机-mysql-基于NoSQL的数据分析技术的应用研究" 本文研究的主要内容是基于NoSQL数据库技术的数据分析技术的应用研究。随着计算机技术的应用,每天都会出现大量的数据,且往往这些数据中包含着很多有价值的信息...

    NoSQL数据库入门思维导图

    【标签】:“MySQL”虽然在本主题中可能不是直接的焦点,但作为关系型数据库的代表,MySQL常常与NoSQL数据库进行对比,因此在这里可能是为了提供一个对比的视角。 【文件名称列表】:“常见的NoSQL数据库.mmap”和...

Global site tag (gtag.js) - Google Analytics