1. 传统关系数据库的瓶颈
近10年,网站开始快速发展。火爆的论坛、博客、sns、微博逐渐引领web领域的潮流。对DB的吞吐量、并发的要求逐渐提高。
2. Memcached+MySQL
随着访问量的上升,几乎大部分使用MySQL架构的网站在数据库上都开始出现了性能问题,web程序不再仅仅专注在功能上,同时也在追求性能。程序员们开始大量的使用缓存技术来缓解数据库的压力,优化数据库的结构和索引。
3. Mysql主从读写分离
由于数据库的写入压力增加,Memcached只能缓解数据库的读取压力。读写集中在一个数据库上让数据库不堪重负,大部分网站开始使用主从复制技术来达到读写分离,以提高读写性能和读库的可扩展性。Mysql的master-slave模式成为这个时候的网站标配了。
4. 分表分库
随着web2.0的继续高速发展,MySQL主库的写压力开始出现瓶 颈,大量的高并发MySQL应用开始使用InnoDB引擎代替 MyISAM。同时,开始流行使用分表分库来缓解写压力和数据增长的扩展问题。也就在这个时候,MySQL推出了还不太稳定的表分区,这也给技术实力一般的公司带来了希望。
5. MySQL的扩展性瓶颈
在互联网,大数据量高并发环境下的MySQL应用开发越来越复杂,也越来越具有技术挑战性。分表分库的规则把握都是需要经验的,分库分表的子库到一定阶段又面临扩展问题。还有就是需求的变更,可能又需要一种新的分库方式。
关系数据库很强大,但是它并不能很好的应付所有的应用场景。MySQL的扩展性差(需要复杂的技术来实现),大数据下IO压力大,表结构更改困难,正是当前使用MySQL的开发人员面临的问题。
为什么会出现NOSQL
(一)传统的关系数据库在应付超大规模和高并发的SNS
类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,例如:
1. Highperformance - 对数据库高并发读写的需求
关系数据库应付上万次SQL查询还勉强顶得住,但是应付上万次SQL写数据请求,硬盘IO就已经无法承受了。例如微信、微博。
2. HugeStorage - 对海量数据的高效率存储和访问的需求
对于关系数据库来说,在一张2.5亿条记录的表里面进行SQL查询,效率是极其低下乃至不可忍受的。再例如大型web网站的用户登录系统,例如腾讯,盛大,动辄数以亿计的帐号,关系数据库也很难应付。
在基于web的架构当中,数据库是最难进行横向扩展的,当一个应用系统的用户量和访问量与日俱增的时候,你的数据库却没有办法像web server和app server那样简单的通过添加更多的硬件和服务节点来扩展性能和负载能力。
(二)在上面提到的“三高”需求面前,关系数据库遇到了难以克服的障碍,而对于web2.0网站来说,关系数据库的很多主要特性却往往无用武之地,例如:
1. HugeStorage - 对海量数据的高效率存储和访问的需求
很多web实时系统并不要求严格的数据库事务,对读一致性的要求很低,有些场合对写一致性要求也不高。因此数据库事务管理成了数据库高负载下一个沉重的负担。
2. 数据库的写实时性和读实时性需求
对关系数据库来说,插入一条数据之后立刻查询,是肯定可以读出来这条数据的,但是对于很多web应用来说,并不要求这么高的实时性,比方说我(JavaEye的robbin)发一条消息之后,过几秒乃至十几秒之后,我的订阅者才看到这条动态是完全可以接受的。
3. 对复杂的SQL查询,特别是多表关联查询的需求
任何大数据量的web系统,都非常忌讳多个大表的关联查询,以及复杂的数据分析类型的复杂SQL报表查询,特别是SNS类型的网站,从需求以及产品设计角 度,就避免了这种情况的产生。往往更多的只是单表的主键查询,以及单表的简单条件分页查询,SQL的功能被极大的弱化了。
(三)因此,关系数据库在这些越来越多的应用场景下显得不那么合适了,为了解决这类问题的非关系数据库应运而生,现在这两年,各种各样非关系数据库,特别是键值数据库(Key-Value Store DB)
风起云涌。
目前所知道的的一些开源的NoSQLDB,例如:
Redis ,Tokyo Cabinet,Cassandra,Voldemort, MongoDB ,Dynomite,HBase,CouchDB,Hypertable, Riak,Tin, Flare, Lightcloud,KiokuDB,Scalaris, Kai, ThruDB, ......
这些NoSQL数据库大致可以分为以下的三类:
1. 满足极高读写性能需求的Kye-Value数据库:Redis,TokyoCabinet, Flare
2. 满足海量存储需求和访问的面向文档的数据库:MongoDB,CouchDB
3. 满足高可扩展性和可用性的面向分布式计算的数据库:Cassandra,Voldemort
From: http://blog.csdn.net/zhao9tian/article/details/27585807