Nosql=Not Only sql,意为 “不仅仅是sql”,Nosql的拥护者们提倡运用非关系型的数据存储。
数据库的扩展性无外乎分两种,垂直扩展和水平扩展,以下先基于关系型数据库MysqL是如何扩展的进行简单介绍,然后再提出Nosql的解决方案。
1.垂直扩展(也就“摩尔定律”扩展)
提供一台性能更高,存储更佳,各方面表现更好的服务器,可以把数据库安装在这样的服务器上,以获得更佳的表现,但是很明显,垂直扩展是有限度的,扩展性会有瓶颈。
2.水平扩展
主从复制,主流数据库基本都支持复制,这是他们进行简单扩展的基本手段。
1.开启主服务器上的二进制日志(log-bin)。
2.在主服务器和从服务器上分别进行简单的配置和授权。
显然这种复制是异步的,从服务器定时向主服务器请求最新日志,而主服务器也只需要一个简单的I/O线程读取本地的二进制日志,然后传输给从服务器即可。
读写分离(R/W Splitting),将应用程序中对数据库的写操作指向主服务器,而将读操作指向从服务器,如下图所示。
如果写操作太过密集的话,上面的架构就不满足了,不过我们可以通过分区扩展的方法来扩容。
但是,如何能将读操作均匀的分散到多台从服务器上,应用程序就不擅长了,可以交给数据库反向代理。
数据库反向代理工作在应用程序和MysqL服务器之间,负责所有请求和响应数据的转发。他可以修改sql语句实现读写分离的均衡。如下图:
如果存在大量的从服务器的时候,MysqL Proxy必然会出现瓶颈效应,以上结构不可避免会再次调整。
分区(分片)-垂直
将不存在关系(JOIN查询)的数据库分散到不同的服务器上。简单的垂直分区如下图:
将db_blog和db_friend两个数据库分别转移到不同的独立服务器上。通过以上思路进行扩展后的图:
如果存在大量写操作的话,以上架构的主服务无法承受写操作的压力时,垂直分区可能会带来一定的瓶颈。此时可以采用水平分区。
水平分区(Sharding分片)
可以将同一数据库表中的记录通过特定的算法进行分离,分别保存在不同的数据表中,从而可以部署在不同的数据库服务器上。
事实上,许多大规模的站点基本都经历了从简单的主从复制到垂直分区,再到水平分区的步骤。
如果以一个表的主键进行划分例举的话,如下图:
分表,同样也可以根据数据的实际情况进行分表。 例举如下:
tab1_posts_00
tab1_posts_01
tab1_posts_02
tab1_posts_03 .....
常见的一些分区算法: 哈希算法(对扩展支持不好)、范围、映射关系等。
分区反向代理
前面的MysqL Proxy帮助应用程序实现了读写分离。同样另一款开源产品Spock Proxy也起到了类似作用,它可以帮助应用程序实现水平分区的访问调度。Spock Proxy本身的大部分代码正是基于MysqL Proxy,同时也进行了一些改进。 架构如下图所示:
Nosql通常在某些方面可以处理庞大的数据,如Google的 BigTable 和Amazon 的Dynamo使用的就是Nosql型数据库。
“关系型数据库给你强加了太多东西。它们要你强行修改对象数据,以满足RDBMS (relational database management system,关系型数据库管理系统)的需要,”在Nosql拥护者们看来,基于Nosql的替代方案“只是给你所需要的”。
水平扩展性(horizontal scalability)指能够连接多个软硬件的特性,这样可以将多个服务器从逻辑上看成一个实体。
传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题。
1、High performance - 对数据库高并发读写的需求
网站要根据用户个性化信息来实时生成动态页面和提供动态信息,所以基本上无法使用动态页面静态化技术,因此数据库并发负载非常高,往往要达到每秒上万次读写请求。关系数据库应付上万次SQL查询还勉强顶得住,但是应付上万次sql写数据请求,硬盘IO就已经无法承受了。其实对于普通的BBS网站,往往也存在对高并发写请求的需求。
2、Huge Storage - 对海量数据的高效率存储和访问的需求
对于大型的SNS网站,每天用户产生海量的用户动态,以国外的FriendFeed为例,一个月就达到了2.5亿条用户动态,对于关系数据库来说,在一张2.5亿条记录的表里面进行SQL查询,效率是极其低下乃至不可忍受的。再例如大型web网站的用户登录系统
3、High Scalability && High Availability- 对数据库的高可扩展性和高可用性的需求
在基于web的架构当中,数据库是最难进行横向扩展的,当一个应用系统的用户量和访问量与日俱增的时候,你的数据库却没有办法像web server和app server那样简单的通过添加更多的硬件和服务节点来扩展性能和负载能力。对于很多需要提供24小时不间断服务的网站来说,对数据库系统进行升级和扩展是非常痛苦的事情,往往需要停机维护和数据迁移,为什么数据库不能通过不断的添加服务器节点来实现扩展呢?
易扩展