NoSql为辅php
1. 手动同步插入数据。html
//写入数据的示例伪代码 //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数据库
若是有数据一致性要求,能够像以下的方式使用:mysql
//写入数据的示例伪代码 //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层作一个统一的封装,就能实现重用了,其余代码都不用作任何的修改。sql
在某些能够根据主键查询的地方,使用高效的NoSQL数据库查询,这样就节省了MySQL的查询,用NoSQL的高性能来抵挡这些查询。mongodb
2. 自动镜像数据。数据库
这种不经过程序代码,而是经过MySQL把数据同步到NoSQL中,这种模式是上面一种的变体,是一种对写入透明可是具备更高技术难度一种模式。这种模式适用于现有的比较复杂的老系统,经过修改代码不易实现,可能引发新的问题。同时也适用于须要把数据同步到多种类型的存储中。json
MySQL到NoSQL同步的实现可使用MySQL UDF函数,MySQL binlog的解析来实现。能够利用现有的开源项目来实现,好比:后端
有了这两个MySQL UDF函数库,咱们就能经过MySQL透明的处理Memcached或者Http协议,这样只要有兼容Memcached或者Http协议的NoSQL数据库,那么咱们就能经过MySQL去操做以进行同步数据。再结合lib_mysqludf_json,经过UDF和MySQL触发器功能的结合,就能够实现数据的自动同步。缓存
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做为数据的存储。它有如下优势:
NoSql为主:
1. 纯nosql。
在一些数据库结构常常变化,数据结构不定的系统中,就很是适合使用NoSQL来存储。好比监控系统中的监控信息的存储,可能每种类型的监控信息都不太同样。这样能够避免常常对MySQL进行表结构调整,增长字段带来的性能问题。
这种架构的缺点就是数据直接存储在NoSQL中,不能作关系数据库的复杂查询,若是因为需求变动,须要进行某些查询,可能没法知足,因此采用这种架构的时候须要确认将来是否会进行复杂关系查询以及如何应对。
MongoDB就带有关系查询的功能,能解决经常使用的关系查询。
2. 以NoSQL为数据源的架构。
纯NoSQL的架构虽然结构简单,易于开发,可是在应付需求的变动、稳定性和可靠性上,老是给开发人员一种风险难于控制的感受。为了下降风险,系统的功能不局限在NoSQL的简单功能上,咱们可使用以NoSQL为数据源的架构。
在这种架构中,应用程序只负责把数据直接写入到NoSQL数据库就OK,而后经过NoSQL的复制协议,把NoSQL数据的每次写入,更新,删除操做都复制到MySQL数据库中。同 时,也能够经过复制协议把数据同步复制到全文检索实现强大的检索功能。在海量数据下面,咱们也能够根据不一样的规则,把数据同步复制到设计好的分表分库的 MySQL中。这种架构:
这种架构须要考虑数据复制的延迟问题,这跟使用MySQL的master-salve模式的延迟问题是同样的,解决方法也同样。
在这种以NoSQL为数据源的架构中,最核心的就是NoSQL数据库的复制功能的实现。而当前的几乎全部的NoSQL都没有提供比较易于使用的复制接口来完成这种架构,对NoSQL进行复制协议的二次开发,须要更高的技术水平,因此这种架构看起来很好,可是却不是很是容易实现的。个人开源项目PHPBuffer中有个实现TokyoTyrant复制的例子,虽然是PHP版本的,可是很容易就能够翻译成其余语言。经过这个例子的代码,能够实现从Tokyo Tyrant实时的复制数据到其余系统中。