关于NoSQL的选型和使用-阿里云开发者社区

开发者社区> 数据库> 正文

关于NoSQL的选型和使用

简介: 【内容简介】NoSQL,指的是非关系型的数据库。随着互联网Web 2.0网站的兴起,传统的关系数据库在应付Web 2.0网站时,特别是超大规模和高并发的SNS类型的Web 2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。

【内容简介】
NoSQL,指的是非关系型的数据库。随着互联网Web 2.0网站的兴起,传统的关系数据库在应付Web 2.0网站时,特别是超大规模和高并发的SNS类型的Web 2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。

就像AK47是非洲人的身份证一样,NoSQL技能如今已成为Web开发软件工程师的必备技能之一。

【使用NoSQL数据库的理由】
1. High performance - 对数据库高并发读写的需求
2. Huge Storage - 对海量数据的高效率存储和访问的需求
3. High Scalability & High Availability - 对数据库的高可扩展性和高可用性的需求

【讨论话题】
1. 在开发项目做技术选型时,我(们)是如何选择NoSQL的?
2. 我(们)目前已经使用了哪些NoSQL数据库?遇到了哪些令人难忘的困难和麻烦?
3. 根据的经验判断,哪个NoSQL是未来的希望之星?


1.在做NoSQL技术选型的时候,谈谈个人的想法。

首先要选择比较成熟的方案,例如MongoDB Redis 这些耳熟能详的,大互联网公司都在用,更有保障性,开源社区支持也非常完善。原因:国内大部分的互联网公司,还不具备对某个Nosql数据库进行二次开发或者扩展的能力,也不具备这个条件,更不可能短期内公司团队自己开发。使用比较广泛的NoSql,功能和社区技术支持相对完善,拥有更多的学习资料,公司技术团队更容易学习和掌握。
其次是要合适自身业务场景和基础架构的。每个Nosql产品都会有其自身的优缺点,选择的时候也需要考虑很多问题:假设 MongoDB 是不能进行持久化存储的,而且在命中率不高的情况下必须去读写后端的关系型数据库,这点能否接受吗?假设Redis 数据库的稳定版本仅仅支持跑在Cent OS 5.5以上,而你公司的服务器全部是windows的,这个我想你多半会放弃Redis了。再比如:Memecahed 默认是不支持数据冗余的,也就是说发生单点故障的情况下,就无法保证数据完整性。这点我们的系统能接受吗?我们是否有能力将其扩展,让他支持数据冗余,防止单点故障呢?

2.关于使用了哪些,遇到了哪些问题。
要说最早使用的NoSql产品,要属Memcached。严格来讲,Memcached只是一套基于K/V存储的分布式缓存系统,并算不上Nosql产品(这得看对nosql的定义了,业内也有很多争议)。至于后来衍生出来的memcachedb(一个由新浪网的开发人员开放出来的开源项目,给memcached分布式缓存服务器添加了Berkeley DB的持久化存储机制和异步主辅复制机制,让memcached具备了事务恢复能力、持久化能力和分布式复制能力,非常适合于需要超高性能读写速度,但是 不需要严格事务约束,能够被持久化保存的应用场景),Membase等,应该算的上真正意义上的Nosql了。

在使用Memcached作为辅助存储的时候,遇到过一些很棘手的问题。例如:命中率不高,被迫读取后端的数据库。维护和扩容的成本比较高,后期才启用监控和邮件报警机制。还有很要命的一点就是,当时公司全部使用的是windows服务器授权,windows平台缺乏良好的Nosql支持(或许是团队自身技术有限),导致在性能和高可用方面都大打折扣。为了解决单点故障问题,不惜牺牲了一定的性能。因为当时比较高效、成熟的冗余方案,只能支持Linux服务器,而我们短期内也无法开发出比较完善的方案。
后期在业余项目中,使用了更“高级”的Redis,同样遇到过一些困难。首先就是快速熟悉,掌握Redis,这就考验个人学习能力了。在使用过程中,做读写分离的时候(Master/Slave主从复制,和使用Mysql一样的思路),复制过程中,遇到性能瓶颈。经过研究发现,由于Redis使用单线程服务,如果Master快照文件比较大,这样以来传输则需要花费较长时间,还有就是,Master/Slave服务器最好在同一局域网内,避免网络延时。还有就是比较常见的“单点故障”的问题,虽然说主从复制的方式,也可以解决单点故障,但总觉得这不算是高可用的最佳手段。之前在Memcachedb中可以使用 Proxy的方式,实现数据冗余,来避免“单点故障”。Redis中同样也有解决的思路,这里不做太多介绍,有需要的朋友自己去找相关资料研究。
还有点值得说的就是,凡是涉及到“持久化存储到硬盘”的,就必读会有磁盘I/O操作,当然就会有一定的性能牺牲。好在Nosql抛开了传统关系型数据库中的默认事务支持和一系列的复杂的检查等。



3.如果真要我选择,我觉得Redis将会是未来nosql之星。出于之前对于Memcached的使用喜好,感觉Redis更像一个加强版的Memcached。
但是在网络I/O模型,内存管理,可持久化,存储方式(list,set,sorted set,hash等众多数据结构)等方面都有改进,这里就不一一介绍了。


时间有限,说了这么多  希望对大家有帮助  也建议朋友们多去尝试  多去学习 不要做新技术的门外汉(这里不是鼓励大家去“赶时髦”)  

以上纯属个人浅见,如有错误或者遗漏之处,请指出,也希望大家一起留言讨论。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
数据库
使用钉钉扫一扫加入圈子
+ 订阅

分享数据库前沿,解构实战干货,推动数据库技术变革

其他文章