经常有朋友遇到困惑,看到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性能也得到提高。比如手机凤凰网就是这种架构。
总结
以NoSQL为辅的架构还是以MySQL架构的思想为中心,只是在以前的架构上辅助增加了NoSQL来提高其性能和可扩展性。这种架构实现起来比较容易,却能取得不错的效果。如果正想在项目中引入NoSQL,或者你的以MySQL架构的系统目前正出现相关的瓶颈,希望本文可以为你带来帮助。
分享到:
相关推荐
【标题】:“03-nosql-架构” 【描述】:本资料主要涵盖了NoSQL数据库的架构及其在现代数据存储中的应用。NoSQL,意为“非关系型数据库”,是近年来随着大数据和分布式计算的发展而崛起的一种新型数据库类型。与...
总的来说,NoSQL架构实践旨在探讨如何在面临传统关系数据库局限的情况下,利用NoSQL数据库的特性来提升系统的性能、可靠性和可扩展性,以适应不断发展的互联网环境。通过了解NoSQL的核心理念、技术特点以及实际应用...
在IT行业中,非关系型数据库(NoSQL)已经成为大规模数据处理和分布式系统的重要组成部分,尤其在互联网服务和大数据场景下。Google作为技术领导者,其在NoSQL领域的贡献不容忽视。这篇压缩包中的“Google NoSQL.pdf...
基于 NoSQL 的现在管理系统 基于 NoSQL 的现在管理系统是指在现在管理系统中使用 NoSQL 数据库技术来存储和管理大量数据的系统。NoSQL 数据库技术可以处理超大量的数据,可以运行在便宜的 PC 服务器集群上,具有高...
与传统的 SQL 数据库相比,NoSQL 数据库放弃了某些传统关系型数据库所具有的特性,如事务的一致性(ACID)、固定的模式等,并将一些原本由数据库系统完成的工作交给了应用程序层面来实现。这要求开发人员更加深入...
设计软件架构时,还需要考虑到系统的部署环境(如云环境)、数据管理策略(如关系型数据库、NoSQL数据库、大数据技术等),以及系统的监控和日志记录机制。 信息安全和系统安全是现代信息系统的关键组成部分。系统...
因此,在选择数据库时,需要根据具体业务需求和系统架构综合考虑,合理选择SQL或NoSQL。 总的来说,NoSQL数据库是应对大数据时代挑战的一种重要工具,它的设计理念和特性使得它在处理大规模分布式系统中的数据存储...
基于分布式NoSQL的医疗大数据档案检索系统设计 本文提出了一种基于分布式NoSQL的医疗大数据档案检索系统设计,旨在解决医疗大数据档案检索系统数据收集不完整和检索准确率低的问题。该系统硬件部分设置三个不同的...
2. **数据管理与数据库设计**:在这一部分,作者讨论了数据在系统架构中的重要性,涵盖了关系型数据库、非关系型数据库(NoSQL)以及数据存储的最佳实践。同时,还介绍了数据一致性、事务处理和数据安全等相关概念。...
Oracle NoSQL数据库是一款分布式键值存储系统,由Oracle公司提供,专为大数据处理设计,具有高可用性、可扩展性和高性能的特点。这个压缩包文件包含了关于Oracle NoSQL的安装、管理、开发和维护的精品资料,是学习和...
【基于NoSQL的全文检索系统研究】 随着大数据时代的到来,传统的SQL数据库在处理海量数据时暴露出性能瓶颈,尤其是在全文检索领域。为了提高全文检索的效率,本文提出了一个基于NoSQL技术的全文检索系统设计方案。...
一致性哈希是 NoSQL 数据库中的一种数据分布算法,它可以将数据分布到多个节点上,以提高系统的可用性和可扩展性。Vector Clock 是一种用于解决分布式系统中的一致性问题的算法,它可以记录每个节点上的操作顺序,以...
### NoSQL数据库的应用探讨 #### NoSQL产生的背景 随着互联网技术的飞速发展,特别是社交网络、移动...未来,随着技术的不断发展,NoSQL数据库将继续扮演重要的角色,帮助企业和开发者应对日益增长的数据处理需求。
分布式NoSQL系统能够将数据分布在多个物理节点上,从而提高系统的读写速度和稳定性,同时降低单点故障的风险。然而,与传统关系型数据库相比,分布式NoSQL系统的写操作通常效率较低,这是由于其设计特点和数据一致性...