NoSql的经常使用架构

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做为数据的存储。它有如下优势:

  • 节省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为主: 

1. 纯nosql。

在一些数据库结构常常变化,数据结构不定的系统中,就很是适合使用NoSQL来存储。好比监控系统中的监控信息的存储,可能每种类型的监控信息都不太同样。这样能够避免常常对MySQL进行表结构调整,增长字段带来的性能问题。

  这种架构的缺点就是数据直接存储在NoSQL中,不能作关系数据库的复杂查询,若是因为需求变动,须要进行某些查询,可能没法知足,因此采用这种架构的时候须要确认将来是否会进行复杂关系查询以及如何应对。

 MongoDB就带有关系查询的功能,能解决经常使用的关系查询。

2. 以NoSQL为数据源的架构。

 

纯NoSQL的架构虽然结构简单,易于开发,可是在应付需求的变动、稳定性和可靠性上,老是给开发人员一种风险难于控制的感受。为了下降风险,系统的功能不局限在NoSQL的简单功能上,咱们可使用以NoSQL为数据源的架构。

  在这种架构中,应用程序只负责把数据直接写入到NoSQL数据库就OK,而后经过NoSQL的复制协议,把NoSQL数据的每次写入,更新,删除操做都复制到MySQL数据库中。同 时,也能够经过复制协议把数据同步复制到全文检索实现强大的检索功能。在海量数据下面,咱们也能够根据不一样的规则,把数据同步复制到设计好的分表分库的 MySQL中。这种架构:

  • 很是灵活。能够很是方便的在线上系统运行过程当中进行数据的调整,好比调整分库分表的规则、要添加一种新的存储类型等等。
  • 操做简单。只须要写入NoSQL数据库源,应用程序就不用管了。须要增长存储类型或者调整存储规则的时候,只须要增长同步的数据存储,调整同步规则便可,无需更改应用程序的代码。
  • 性能高。数据的写入和更新直接操做NoSQL,实现了写的高性能。而经过同步协议,把数据复制到各类适合查询类型的存储中(按照业务逻辑区分不一样的存储),能实现查询的高性能,不像之前MySQL一种数据库就全包了。或者就一个表负责跟这个表相关的全部的查询,如今能够把一个表的数据复制到各类存储,让各类存储用本身的长处来对外服务。
  • 易扩展。开发人员只须要关心写入NoSQL数据库。数据的扩展能够方便的在后端由复制协议根据规则来完成。

  这种架构须要考虑数据复制的延迟问题,这跟使用MySQL的master-salve模式的延迟问题是同样的,解决方法也同样。

  在这种以NoSQL为数据源的架构中,最核心的就是NoSQL数据库的复制功能的实现。而当前的几乎全部的NoSQL都没有提供比较易于使用的复制接口来完成这种架构,对NoSQL进行复制协议的二次开发,须要更高的技术水平,因此这种架构看起来很好,可是却不是很是容易实现的。个人开源项目PHPBuffer中有个实现TokyoTyrant复制的例子,虽然是PHP版本的,可是很容易就能够翻译成其余语言。经过这个例子的代码,能够实现从Tokyo Tyrant实时的复制数据到其余系统中。