- 浏览: 409313 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (325)
- 神经网络 (1)
- javascript (11)
- 数据结构 (2)
- 计算机图形学 (11)
- 模式识别 (1)
- 前端开发 (14)
- 机器学习 (11)
- ios开发 (50)
- Python (9)
- HTML5 (4)
- 计算机视觉 (9)
- 数字图像处理 (7)
- 架构设计 (19)
- 数据库设计 (9)
- 算法设计 (59)
- Java (37)
- 其他 (3)
- 游戏开发 (5)
- c++ (17)
- Linux (3)
- TCP/IP (2)
- Flex (41)
- 健康 (6)
- AI (2)
- 工具 (1)
- 数据挖掘 (1)
- 性能优化 (6)
- 综合 (2)
- 网络通信 (12)
- Android (2)
- UML (3)
- 软件设计 (11)
- 编程经验 (7)
- J2EE (1)
- 多媒体技术 (3)
- 数学 (7)
- php (4)
- 设计 (1)
- CS (2)
- 计算机理论 (1)
- 信息安全 (1)
最新评论
-
ahead_zhan:
good good good
flex3控件_ModuleLoader -
lonerzf:
好样的。非常感谢楼主
OpenCV视频教程整理 -
lonerzf:
好样的。谢谢~
OpenCV视频教程整理 -
coding1688:
博主说的不错,我在实现瀑布流布局时也用的masonry插件,有 ...
Javascript 瀑布流式布局及其动态效果的实现 -
snowolf:
除非玩游戏,不然没啥win的事情,或者用win的银行客户端,通 ...
macbook安装操作系统的机理分析
参考:http://www.infoq.com/cn/news/2011/02/nosql-architecture-practice
前面《为什么要使用NoSQL》和《关系数据库还是NoSQL数据库》两篇从大体上介绍了为什么要用NoSQL,何时该用NoSQL。经常有朋友遇到困惑,看到NoSQL的介绍,觉得很好,但是却不知道如何正式用到自己的项目中。很大的原因就是思维固定在MySQL中了,他们问得最多的问题就是用了NoSQL,我如何做关系查询。那么接下来,我们看下怎么样在我们的系统中使用NoSQL。
怎么样把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架构的系统目前正出现相关的瓶颈,希望本文可以为你带来帮助。
发表评论
-
【转】那些年使用过MapReduce的论文
2014-03-09 15:20 1054MapReduce is a programmi ... -
单点登录SSO的实现原理
2013-08-26 10:09 684转自:http://blog.csdn.net ... -
73本免费的、语言无关的优秀的编程书籍
2013-03-24 21:43 723这些书籍中有HTML格式的,也有PDF格式的,当 ... -
Hadoop集群实践
2012-11-11 17:01 781(0) 完整架构设计 [ Hadoop(HDFS) , ... -
REST介绍与REST在PHP中的应用
2012-10-06 17:27 621转自:http://www.nowamagic.net/ ... -
【转】大流量、高并发的网站的底层系统架构
2012-09-29 22:08 748转自: http://hi.baidu.com/liyi ... -
【转】建设一个靠谱的火车票网上订购系统
2012-09-29 21:59 1106转自:http://www.ifanr.com/68019 ... -
可扩展性数据库的架构设计
2012-07-17 19:59 820参考:http://www.51testing.c ... -
数据库设计原则
2012-07-17 17:38 747参考:http://www.cnblogs.com/wuhen ... -
使用SQL生成非均匀随机数
2012-07-14 12:06 1064参考: http://www.cnblogs.com/ ... -
高并发高流量网站架构设计(参考)
2012-06-04 16:34 669参考:http://carywu.blog.51c ... -
BlazeDS的架构和工作原理简介
2012-06-02 14:09 890参考:http://hi.baidu.com/whlxj ... -
OpenMP,MPI,MapReduce 比较
2012-05-20 12:08 2175参考: http://blog.csdn.net/z ... -
大型高性能网站的十项规则
2011-11-21 15:48 667参考:http://kb.cnblogs.com/page/6 ... -
微博的短url如何实现
2011-11-03 18:38 2405参考:http://hi.baidu.com/icyd ... -
分布式哈希表和一致性哈希
2011-10-26 14:47 1288参考: http://apps.hi.b ... -
MySQL数据库分表的3种方法
2011-10-25 11:05 1307参考:http://club.topsage.com/foru ... -
精通Hibernate——映射一对多关联关系
2011-04-17 01:38 1020在域模型(实体域)中,关联关系是类与类之间最普遍的关系。根据U ... -
浅谈领域驱动设计
2011-01-05 01:08 792需求背景 现在的 样子 如PoEAA中提到 ... -
各种架构图汇总!
2010-12-29 22:26 15581.Spring架构图 2.Hiber ...
相关推荐
- **答案**: 正确的定义是B选项——数据库是由一定方式储存在存储设备上的、能为多个用户共享、具有尽可能小的冗余、与应用程序彼此独立的数据和数据的定义的集合。 ### 8. BASE 模型 - **基本可用**(Basically ...
2. **MapReduce**:MapReduce是Hadoop的数据处理模型,它将复杂的计算任务分解为两个阶段——“Map”和“Reduce”。Map阶段将原始数据分片并进行局部处理,Reduce阶段负责整合所有Map阶段的结果,生成最终输出。 3....
"数据库课件数据库课件"的标题和描述暗示了这是一份关于数据库理论和实践的教育资源,可能包括了一系列的课程资料,如PPT演示文稿,用于教授数据库的基本概念、设计原理、操作方法以及应用实例。 在深入探讨数据库...
微服务架构通过将大型应用分解为小型、独立的服务,实现了系统的解耦、灵活性和可维护性。学习如何设计、开发和部署微服务,对于提高系统的整体性能具有重要意义。 综上所述,后端开发不仅涉及到编程语言和框架的...
2. **数据模型**:深入研究三种主要的数据模型——层次模型、网状模型和关系模型,其中关系模型是最常用的一种,基于SQL语言进行操作。 3. **关系数据库理论**:掌握关系代数、元组关系演算等理论基础,以及关系...
本设计文档编号为SSDD,由2021年6月的团队成员——队长宁子淳,柯俊哲,樊伟哲,梁浩,郑继凯共同完成,指导教师为余仲星,当前版本为1.02。 1.2. 系统概述 TouchFishing是一款基于互联网的模拟钓鱼游戏,旨在为...
微服务架构以其模块化、松耦合的特点,提高了系统的可扩展性和容错性,更适合大数据环境。容器化技术如Docker和Kubernetes进一步提升了部署和管理的效率。 最后,安全性与隐私保护是大数据时代的重要议题。软件技术...
- 四V特性:大数据的特征通常概括为“四V”——Volume(大量)、Velocity(高速)、Variety(多样)和Value(价值)。 - 大数据来源:包括社交媒体、物联网设备、交易记录、网页点击流等。 - 大数据处理挑战:...
数据湖架构是一种新型的大数据存储架构,允许用户以原始格式存储大量数据,并在需要时对其进行处理和分析。 **详细解析:** - **定义:** 数据湖是一种存储原始格式数据的存储库,它可以存储任何形式的数据,无论是...
1. **Java语言**:此项目是用Java编程语言编写的,Java是一种广泛使用的面向对象的编程语言,以其跨平台性、稳定性以及丰富的库而闻名。在本应用中,Java用于处理短信的接收、解析和发送功能。 2. **短信API集成**...
"burj-al-arab-full-stack" 这个项目名暗示着它可能是一个关于构建高端、豪华体验的全栈Web应用的实例,以迪拜的标志性建筑帆船酒店(Burj Al Arab)为主题。在这个项目中,全栈开发的概念意味着我们将探讨前端和...