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

(一)NoSQL作为镜像

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

图 1 -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的高性能来抵挡这些查询。

图 2 -NoSQL为镜像(同步模式)

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

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

  • MySQL memcached UDFs:从通过UDF操作Memcached协议。
  • 国内张宴开源的mysql-udf-http:通过UDF操作http协议。

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

(二)MySQL和NoSQL组合

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

图 3 -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性能也得到提高。

比如手机凤凰网就是这种架构 http://www.cnblogs.com/sunli/archive/2010/12/20/imcp.html

总结

以NoSQL为辅的架构还是以MySQL架构的思想为中心,只是在以前的架构上辅助增加了NoSQL来提高其性能和可扩展性。这种架构实现起来比较容易,却能取得不错的效果。如果正想在项目中引入NoSQL,或者你的以MySQL架构的系统目前正出现相关的瓶颈,希望本文可以为你带来帮助。

NoSQL架构实践(一)——以NoSQL为辅相关推荐

  1. NoSQL架构实践(二)——以NoSQL为主

    前面一篇<NoSQL架构实践(一)--以NoSQL为辅>主要介绍了以NoSQL为辅助的架构,这种架构实施起来比较简单,易于理解,由于其中也使用了传统的关系数据库,让开发者更容易控制NoSQ ...

  2. NoSQL架构实践(三)——以NoSQL为缓存

    由于NoSQL数据库天生具有高性能.易扩展的特点,所以我们常常结合关系数据库,存储一些高性能的.海量的数据.从另外一个角度看,根据NoSQL的高性能特点,它同样适合用于缓存数据.用NoSQL缓存数据可 ...

  3. GaussDB NoSQL架构设计分享

    摘要:文章总结了当前数据库的发展趋势.GaussDB NoSQL关键技术解密以及核心竞争力. 本文分享自华为云社区<华为云GaussDB NoSQL云原生多模数据库的超融合实践>,作者:华 ...

  4. SDCC 2015架构专场札记:一线互联网公司的架构实践

    SDCC 2015架构专场札记:一线互联网公司的架构实践 发表于8小时前| 835次阅读| 来源CSDN| 1 条评论| 作者么刚 SDCC架构数据库互联网性能优化架构师 width="22 ...

  5. 构建高并发高可用的电商平台架构实践 转载

    2019独角兽企业重金招聘Python工程师标准>>> 构建高并发高可用的电商平台架构实践 转载 博客分类: java 架构 [-] 一 设计理念 空间换时间 多级缓存静态化 索引 ...

  6. 构建高并发高可用的电商平台架构实践 转自网络

    从各个角度总结了电商平台中的架构实践,由于时间仓促,定了个初稿,待补充完善,欢迎大家一起交流. 转载请声明出处: 作者:杨步涛 关注分布式架构.大数据.搜索.开源技术 QQ:306591368 技术B ...

  7. 阿里云DataWorks数据集成(DataX)架构实践分享

    阿里云DataWorks数据集成(DataX)架构&实践分享 分享嘉宾:罗海伟 阿里云 编辑整理:约理 中国科学院大学 目录 ▌为什么需要数据集成 数据集成的应用场景 数据集成的角色和地位 ▌ ...

  8. 电商平台中的架构实践

    从各个角度总结了电商平台中的架构实践,由于时间仓促,定了个初稿,待补充完善,欢迎大家一起交流. 原文出处:http://blog.csdn.net/yangbutao/article/details/ ...

  9. 快速成长期的云原生应用架构实践

    在经过了最初的业务原型验证和上线运行期之后,用户业务进入了高速成长阶段.在这一阶段,业务重点不再是方向上的调整,而是在原来基础上的不断深挖.扩展:开发不仅是功能的实现,还需要兼顾成本和性能:系统不再是 ...

最新文章

  1. 十大成长性人工智能技术!
  2. TCP/IP / TCP 头
  3. BZOJ3270: 博物馆
  4. Tomcat 服务自动启动
  5. 使用jdbc执行SQL实现登录查询2-避免SQL注入版
  6. c语言自动拷贝u盘文件,写了一个偷偷拷贝老师U盘所有文件的程序……蛋疼……………...
  7. Linux(CentOS)网络流量实时监控(iftop)
  8. oracle层级计算推演,云和恩墨的两道Oracle面试题
  9. Java并发编程之CountDownLatch闭锁
  10. 自主品牌语音交互性能测评,荣威RX5反应更快,博越变暖男
  11. 在线教育行业APP高效开发解决方案
  12. spring-cloud-demo
  13. PHP原生实现,校验微信公众号||小程序服务器地址
  14. 2022年黑马程序员火爆全网的自学Java必刷教程(价值2w+的教程免费分享)
  15. 电路设计_CAN总线基础知识
  16. 聆听结合AI技术的Steam教育课程
  17. chrome浏览器多页签唯一关闭时自动注销
  18. 7-21 统计大写辅音字母 (15 分)
  19. Quartz定时任务项目中的应用
  20. 2015阿里移动推荐算法大赛总结

热门文章

  1. python创建数据库字数不限制_textarea字数限制方法一例
  2. 开发文档怎么编写_PoC 编写指南
  3. http抓包实战 pdf_网络协议HTTP 协议(抓包实战和网络分层)
  4. 模型描述的关系模式_你的项目该用哪种编程模式?
  5. (王道408考研操作系统)第三章内存管理-第二节3:页面置换算法2
  6. BBV:实验基本块向量生成工具
  7. LeetCode 695 岛屿的最大面积
  8. 绘图解谜:公钥、私钥、证书
  9. ssh远程连接(ubuntu、windows)
  10. jqgrid表格下拉搜索多选框优化—使用select下拉多选插件