前面一篇《NoSQL架构实践(一)以NoSQL为辅》主要介绍了以NoSQL为辅助的架构,这种架构实施起来比较简单,易于理解,由于其中也使用了传统的关系数据库,让开发者更容易控制NoSQL带来的风险。接下来我们继续深入下去,换另外一个角度,“以NoSQL为主”来架构系统。
(三)纯NoSQL架构
只使用NoSQL作为数据存储。
图 4-纯NoSQL架构
在一些数据结构、查询关系非常简单的系统中,我们可以只使用NoSQL即可以解决存储问题。这样不但可以提高性能,还非常易于扩展。手机凤凰网的前端展示系统就使用了这种方案。
在一些数据库结构经常变化,数据结构不定的系统中,就非常适合使用NoSQL来存储。比如监控系统中的监控信息的存储,可能每种类型的监控信息都不太一样。这样可以避免经常对MySQL进行表结构调整,增加字段带来的性能问题。
这种架构的缺点就是数据直接存储在NoSQL中,不能做关系数据库的复杂查询,如果由于需求变更,需要进行某些查询,可能无法满足,所以采用这种架构的时候需要确认未来是否会进行复杂关系查询以及如何应对。
非常幸运的是,有些NoSQL数据库已经具有部分关系数据库的关系查询特性,他们的功能介于key-value和关系数据库之间,却具有key-value数据库的性能,基本能满足绝大部分web 2.0网站的查询需求。比如:
MongoDB就带有关系查询的功能,能解决常用的关系查询,所以也是一种非常不错的选择。下面是一些MongoDB的资料:

◆《视觉中国的NoSQL之路:从MySQL到MongoDB》
◆《Choosing a non-relational>
图 5 -以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实时的复制数据到其他系统中。
总结
以NoSQL为主的架构应该算是对NoSQL的一种深度应用,整个系统的架构以及代码都不是很复杂,但是却需要一定的NoSQL使用经验才行。
【编辑推荐】
青岛哪个糕点学校最好最专业?只有开元蛋糕培训学校
青岛开元职业学校创办于2003年,是由全国烘焙协会、中华烘焙委会、市人力资源和社会保障局批准的一所专业以蛋糕为主的职业技能培训机构。从事青岛蛋糕西点培训,青岛裱花蛋糕培训,青岛欧式蛋糕培训,青岛烘焙面包培训,青岛烘焙糕点师职业培训。学校专业走培养技能型的人才为办学之路,以严谨的教学理论为依据,采用理论为辅、实践为主相结合的教学宗旨,创办以来为社会培养了几千名技能学子的人才,蕴育诸多成功创业自己当老板的梦想。学校总校位于青岛市城阳区商业中心,仅邻城阳区政府,城阳利群、佳家源、大润发、沃尔玛超市,西靠城阳步行街、城阳商贸城,北邻海梦圆大酒店、怡情楼大酒店、韩国商贸城、时代中心等。 分校位于流亭飞机场东侧,流亭的商贸市场、利客来超市、流亭人民医院南侧,数十条公交线路,交通便利。 学校2010年因扩招需求又设立新校,教室宽敞、明亮,环境优雅,是您学习的理想之地。
青岛开元艺术西点蛋糕培训学校,是青岛开元蛋糕食品有限公司、青岛开元蛋糕食品连锁机构旗下培训学校。 本校是目前青岛市唯一一家专业以艺术西点蛋糕为主的培训基地和人才培养中心。 本校受多家食品公司委派办学,致力于各界合作,向多家蛋糕饼店输送一流的烘焙、裱花人才,培训就业率100%,协助创业者开店。
本科和专科有哪些区别?
专科教育与本科教育的区别 ①培养目标的不同: 专科:培养具有某种专业知识和技能的中、高级人才;培养能适应在生产、管理、服务一线和广大农村工作的技术应用性人才;培养掌握一定理论知识,具有某一专门技能,能从事某一种职业或某一类工作的人才,其知识的讲授是以“能用为度”、“实用为本”。 本科:培养较扎实地掌握本门学科的基础理论,专门知识和基本技能,并具有从事科学研究工作或担负专门技术工作初步能力的高级人才。 要求学生具备合理的知识结构,掌握科学工作的一般方法,能正确判断和解决实际问题,具备终生学习的能力和习惯,能适应和胜任多变的职业领域,本科教育知识的讲授不仅要向学科的纵深发展,还要注意学科间的横向关系,与此同时,本科教育注意培养学生的科学思维能力、创造能力、创新精神和创业精神。 ②职能结构的不同: 专科:以教学为主要职能。 本科:以教学、科研、成果转化与产业服务为主要职能。 ③知识结构的不同: 专科:横向的职业岗位知识模块,强调岗位业务知识和实践操作技能,理论以“够用”、“实用”为度。 比较侧重“WHAT TO DO”和“HOW TO DO”,集中于改造认识世界的范畴,是相对完整的实践体系和相对不完整的理论体系的统一。 本科:纵向的框架式知识体系,强调课程的整合、学科的完整和综合,注重跨学科知识的迁移。 比较侧重〃WHAT〃和〃WHY〃,集中于认识世界的范畴,是相对完整的理论体系和相对不完整实践体系的统一。 ④学科专业的不同: 专科:以面向行业或本地区为主,专业覆盖面较窄,数量较少,社会适应性有限。 继续学习的潜能较弱。 本科:以面向行业,面向大经济区域为主,专业覆盖面较宽,数量较多,社会综合适应性较强。 继续学习的潜能较大。 ⑤师资结构的不同: 专科:学士学位为主体,教师以教学为主要任务,对教师的评价主要依赖教学效果,〃双师型〃教师倍受青睐,有影响的学科带头人较少。 本科:硕士、博士学位占较高比例,教师既要教学也要承担科研任务,教学能力和科研能力是教师的评价主要依据,有影响的学科带头人较多。 ⑥组织结构的不同: 专科:办学规模小、层次少,直线型的统一决策管理。 教研室成为教学研究的基本单位。 本科:办学规模大、层次多,管理体系多以直线职能或扁平式体制为主,院系二级机构的权、责放大,项目组形式的团队研究比较多见。 ⑦办学模式的不同: 专科:入口是学生,出口主要还是学生。 教学质量控制体系在校内,开放办学程度要求不高,国际化程度较低,自成体系,较为闭塞。 本科:入口有学生、科研项目,出口则有学生、理论成果、应用成果等多种形式,学术水准要求高,对外开放度较高,社会影响力强。
memcached和redis的区别
medis与Memcached的区别传统MySQL+ Memcached架构遇到的问题 实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访问,很多公司都曾经使用过这样的架构,但随着业务数据量的不断增加,和访问量的持续增长,我们遇到了很多问题: 需要不断进行拆库拆表,Memcached也需不断跟着扩容,扩容和维护工作占据大量开发时间。 与MySQL数据库数据一致性问题。 数据命中率低或down机,大量访问直接穿透到DB,MySQL无法支撑。 4.跨机房cache同步问题。 众多NoSQL百花齐放,如何选择 最近几年,业界不断涌现出很多各种各样的NoSQL产品,那么如何才能正确地使用好这些产品,最大化地发挥其长处,是我们需要深入研究和思考的问题,实际归根结底最重要的是了解这些产品的定位,并且了解到每款产品的tradeoffs,在实际应用中做到扬长避短,总体上这些NoSQL主要用于解决以下几种问题 1.少量数据存储,高速读写访问。 此类产品通过数据全部in-momery 的方式来保证高速访问,同时提供数据落地的功能,实际这正是Redis最主要的适用场景。 2.海量数据存储,分布式系统支持,数据一致性保证,方便的集群节点添加/删除。 3.这方面最具代表性的是dynamo和bigtable 2篇论文所阐述的思路。 前者是一个完全无中心的设计,节点之间通过gossip方式传递集群信息,数据保证最终一致性,后者是一个中心化的方案设计,通过类似一个分布式锁服务来保证强一致性,数据写入先写内存和redo log,然后定期compat归并到磁盘上,将随机写优化为顺序写,提高写入性能。 free,auto-sharding等。 比如目前常见的一些文档数据库都是支持schema-free的,直接存储json格式数据,并且支持auto-sharding等功能,比如mongodb。 面对这些不同类型的NoSQL产品,我们需要根据我们的业务场景选择最合适的产品。 Redis适用场景,如何正确的使用 前面已经分析过,Redis最适合所有数据in-momory的场景,虽然Redis也提供持久化功能,但实际更多的是一个disk-backed的功能,跟传统意义上的持久化有比较大的差别,那么可能大家就会有疑问,似乎Redis更像一个加强版的Memcached,那么何时使用Memcached,何时使用Redis呢?如果简单地比较Redis与Memcached的区别,大多数都会得到以下观点: 1Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储。 2Redis支持数据的备份,即master-slave模式的数据备份。 3Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。 抛开这些,可以深入到Redis内部构造去观察更加本质的区别,理解Redis的设计。 在Redis中,并不是所有的数据都一直存储在内存中的。 这是和Memcached相比一个最大的区别。 Redis只会缓存所有的 key的信息,如果Redis发现内存的使用量超过了某一个阀值,将触发swap的操作,Redis根据“swappability = age*log(size_in_memory)”计 算出哪些key对应的value需要swap到磁盘。 然后再将这些key对应的value持久化到磁盘中,同时在内存中清除。 这种特性使得Redis可以 保持超过其机器本身内存大小的数据。 当然,机器本身的内存必须要能够保持所有的key,毕竟这些数据是不会进行swap操作的。 同时由于Redis将内存 中的数据swap到磁盘中的时候,提供服务的主线程和进行swap操作的子线程会共享这部分内存,所以如果更新需要swap的数据,Redis将阻塞这个 操作,直到子线程完成swap操作后才可以进行修改。 使用Redis特有内存模型前后的情况对比: VM off: 300k keys, 4096 bytes values: 1.3G used VM on:300k keys, 4096 bytes values: 73M used VM off: 1 million keys, 256 bytes values: 430.12M used VM on:1 million keys, 256 bytes values: 160.09M used VM on:1 million keys, values as large as you want, still: 160.09M used当 从Redis中读取数据的时候,如果读取的key对应的value不在内存中,那么Redis就需要从swap文件中加载相应数据,然后再返回给请求方。 这里就存在一个I/O线程池的问题。 在默认的情况下,Redis会出现阻塞,即完成所有的swap文件加载后才会相应。 这种策略在客户端的数量较小,进行 批量操作的时候比较合适。 但是如果将Redis应用在一个大型的网站应用程序中,这显然是无法满足大并发的情况的。 所以Redis运行我们设置I/O线程 池的大小,对需要从swap文件中加载相应数据的读取请求进行并发操作,减少阻塞的时间。 如果希望在海量数据的环境中使用好Redis,我相信理解Redis的内存设计和阻塞的情况是不可缺少的。
发表评论