NoSQL   发布时间:2022-05-24  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了NoSQL架构实践(一)——以NoSQL为辅大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
前面《为什么要使用NoSQL关系数据库还是NoSQL数据库两篇从大体上介绍了为什么要用NoSQL,何时该用NoSQL。经常有朋友遇到困惑,看到NoSQL的介绍觉得很好,但是却不知道如何正式用到自己的项目中。很大的原因就是思维固定在MysqL中了,他们问得最多的问题就是用了Nosql,我如何做关系查询。那么接下来,我们看下怎么样在我们的系统中使用NoSQL
怎么样把Nosql引入到我们的系统架构设计中,需要根据我们系统的业务场景来分析,什么样类型的数据适合存储在NoSQL数据库中,什么样类型的数据必须使用关系数据库存储。明确引入的NoSQL数据库带给系统的作用,它能解决什么问题,以及可能带来的新的问题。下面我们分析几种常见的Nosql架构。
(一)Nosql作为镜像
不改变原有的以MysqL作为存储的架构,@R_266_3674@助镜像存储,用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中,这种模式是上面一种的变体,是一种对写入透明但是具有更高技术难度一种模式。这种模式适用于现有的比较复杂的老系统,通过修改代码不易实现,可能引起新的问题。同时也适用于需要把数据同步到多种类型的存储中。
@H_889_2@mysqL到Nosql同步的实现可以使用MysqL UDF函数,MysqL binlog的解析来实现。可以利用现有的开源项目来实现,比如:
  • @H_889_2@mySQL memcached UDFs:从通过UDF操作Memcached协议。
  • 国内张宴开源的@H_889_2@mysql-udf-http:通过UDF操作http协议。
有了这两个MysqL UDF函数库,我们就能通过MysqL透明的处理Memcached或者http协议,这样只要有兼容Memcached或者http协议的NoSQL数据库,那么我们就能通过MysqL去操作以进行同步数据。再结合lib_mysqludf_json,通过UDF和MySQL触发器功能的结合,就可以实现数据的自动同步。
(二)MysqL和Nosql组合
@H_889_2@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,sans-serif;">把需要查询的字段,一般都是数字,时间等类型的小字段存储于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架构的系统目前正出现相关的瓶颈,希望本文可以为你带来帮助。
转自:http://www.infoq.com/cn/news/2011/02/nosql-architecture-practice

大佬总结

以上是大佬教程为你收集整理的NoSQL架构实践(一)——以NoSQL为辅全部内容,希望文章能够帮你解决NoSQL架构实践(一)——以NoSQL为辅所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:觉得很好