什么是NoSQL?
NoSQL涵盖了各种不同的数据库技术,这些技术是根据现代应用程序的要求而开发的。
- 开发人员正在使用一些创建大量的、快速变化的数据类型的应用程序,数据类型有结构化的,半结构化的,非结构话的和多态的样式
- 12到18个月的瀑布发展周期已经过去了。现在,小团队在没日没夜地工作着,软件快速更新换代,每周或两周推送代码,甚至会有每天多次的推送代码,以更新软件
- 曾经服务于有限受众的应用程序,现在必须一直处于开放状态提供服务,可从不同的设备访问并且来自世界各地的访问者多达百万级别
- 现在,各个组织都在使用开源软件、商品服务器和云计算,而不是大型单片机服务器和存储基础设施的横向扩展架构
关系型数据库的设计不是为了应对现有应用程序的规模和速度的挑战,也不是为了利用当代可用的商品存储和处理能力而建立的。
NoSQL数据库的类型
- document databases :每一组key/value,其中value可以是复杂的数据结构,可以称之为文档。文档可以包括不同的键值对,或者键阵列,甚至是嵌套关系的文档 例如MongoDB
- Graph stores 是被用来存储数据网络的信息,例如社交连接。Graph stores包括Neo4J和Girapha
- key-vaule stores是最简单的NoSQL数据库。每一个单独的项以key和value的形式存储在数据库里。典型的这种数据库有:Riak和BerkeleyDB。有些key-value stores,例如Redis, 允许value有特定的数据类型
- wide-column stores,例如 Cassandra和Hbase, 优化了大型数据库的查询, 将数据以列的形式存储而不是传统的以行形式存储。
NoSQL的优势
当和关系型数据库相比时,NoSQL数据拥有更好的可扩展性和更牛逼的性能,其数据模型解决了关系型数据模型未解决的若干问题:
- 大量快速变化的结构化,半结构化与非结构化的数据
- 表结构的快速变化,需求的不断更新
- 易于使用和灵活的面向对象编程
- 地理位置分散的横向扩展架构,而不是昂贵的单片架构
Dynamic schema 动态的模式
关系型数据库需要你在添加数据之前就需要将模式定义完成。例如,如果你想存储你的客户相关信息,如电话号码,姓名,地址,城市和一些其他的相关状态,数据库需要提前知道你要存储的是什么。
这是不适合快速的开发方式,因为每一需要新的特征的时候(字段),数据库的模式就需要改变。因此,如果你决定开发一些新的迭代,除了地址和电话号码外,还要存储客户喜爱的项目,那么你需要将这个列添加到数据库中,这样你整个数据库就要迁移到新的模式中(schema),在迁移的时候,数据库服务器还必须处于下线状态,不可被使用。
如果数据库很大,那么这将是一个漫长的过程。如果你的应用存储需要频繁地改变存储的数据,因为这种迭代非常频繁,所以那种模式变化导致的数据迁移也会十分频繁而漫长。并且使用关系型数据库无法有效地处理完全非结构化或未知的数据。
构建NoSQL数据允许在没有预先定义模式的情况下插入数据。这样可以轻松地实时地进行重大应用程序的更改,而不必担心服务中断的情况,这意味着开发的速度更快,代码集成更可靠,而且需要更少的数据库管理员时间。开发人员通常不得不添加应用程序代码来强制执行数据质量的控制,例如要求存在特定字段、数据类型或允许的值,在更复杂的NoSQL中,允许数据库中应用验证规则,允许用户在数据之间实施控制管理。同时还能保证数据库的动态模式。
Auto-sharding 自动分片
因为关系型数据库的结构化,他们通常是垂直扩展的,单个服务器必须依托于整个数据库,以确保跨表联结和支持事务。这样做将会非常昂贵,限制了规模,并为数据库基础架构创造了相对较少的故障点。支持快速增长数据的应用程序解决方案是通过添加服务器而不是将更多容量集中在单个服务器中来水平扩展。
通过SQL数据库可以实现跨越多个服务器实例的“分片”数据库,但通常通过SAN和其他复杂的安排来实现,从而使硬件充当单个服务器。 由于数据库本身不提供此功能,开发团队将承担在多台机器上部署多个关系数据库的工作。 数据自动存储在每个数据库实例中。 开发应用程序代码来分发数据,分发查询,并在所有数据库实例中聚合数据结果。 必须开发附加代码来处理资源故障,在不同数据库之间执行连接,用于数据重新平衡,复制和其他要求。 此外,使用手动分片时,关系数据库的许多好处(如事务完整性)会受到损害或消除。
另一方面,NoSQL数据库通常支持自动分片,这意味着他们可以在任意多的服务器上自动地传播数据,而不需要应用程序意识到服务器的组成形式。数据和查询负载在服务器之间自动平衡,当一个服务器挂掉的时候,他可以快速透明地被替换掉并且应用程序不知情的情况下。
云计算使这一点变得更加容易,亚马逊网络服务提供商几乎可以提供无限容量的需求,并且负责所有的基础架构管理任务。开发人员不再需要构建复杂昂贵的平台来支持他们的应用程序,并且可以专注于编写应用程序代码。商品服务器可以提供与单个高端服务器相同的处理和存储功能,但只需要一部分价格即可。
Replication 复制
大多数NoSQL数据还支持自动的数据复制,以在发生中断或者计划维护事件时保持可用性。更复杂的NoSQL数据库还支持完全自我恢复功能,提供自动故障转移和恢复,以及在多个地理区域分发数据库以承受区域故障并实现数据本地化的能力。与关系数据库不同,NoSQL数据库通常不需要单独的应用程序或昂贵的附加组件来实现复制。
Integrated caching 集成缓存
很多产品为SQL数据库提供缓存层,这些系统可以显著提高读取性能,但他们不会改善写入功能,并且还会增加部署的操作复杂性。如果你的应用由读取为主导,则可以考虑分布式缓存,但是如果应用程序只有适度的写入功能,则分布式缓存则可能无法提高最终用户的整体体验,并将增加管理缓存无效的复杂性。
许多NoSQL数据库技术具有出色的集成缓存功能,可以尽可能多在系统内存中保存常用数据,并且无需单独的缓存层。一些NoSQL数据库还为需要最高吞吐量和最低延迟的工作负载提供完全管理的集成式内存数据库管理层。
NoSQL与SQL的对比
NoSQL和SQL对比 | ||
| SQL databases | NoSQL databases |
类型 | 只有一种形式(SQL database) | 许多种不同的类型,包括键值对存储,文档存储,图形存储 |
发展历史 | 开发于1970s | 开发于2000年代末,以处理SQL数据库的局限性,特别是可扩展性,多结构化数据,地理位置分布,以及应用程序的快速更新换代 |
举例 | MySQL,Oracle,Postgres | MongoDB,Hbase,Neo4j,Redis,Memcached |
数据存储模式 | 每个记录(例如“雇员”)以表的形式存储为行,每列存储有关该记录的特定数据(例如“年龄”,“聘用日期”),非常像电子表格。相关数据存储在单独的表中,然后在执行更复杂的查询时连接在一起。例如,“办公室”可能存储在一个表中,“员工”可以存储在另一个表中。当用户想要查询员工的工作地址时,数据库引擎将“员工”和“办公室”表连接在一起,以获取所需的所有信息。 | 基于数据库类型的不同。例如,键值对存储和SQL数据库类似,但只有两列(key,value),更复杂的信息有时会以blob在value列存储。文档数据库完全取消了表和行的模型,将所有相关的数据存储在一起,以json或其他格式的存储在单个文档中。 |
表模式 | 结构和数据类型需要提前确定。如果要存储数据的新的信息,整个表必须要修改,在此期间数据库必须offline | 通常是动态的,具有一些执行数据验证规则。应用程序可以随时添加新的字段,与SQL表行不同,可根据需要将不同的数据存储在一起,对某些数据库(宽列存储),动态地添加新字段更具有挑战性 |
扩展 | 垂直添加服务器。 | 水平添加服务器 |
是否开源? | 开源(MySQL)与非开源(Oracle)混合 | 开源 |
是否支持事务? | 当然 | 有的情况是支持的(文档数据库) |
数据的操作 | 专门的语言,select,insert,update | 通过面向对象的api |
数据一致性 | 当然 | 依赖于具体的产品。MongoDB具有可读性的一致性,其他的提供最终的一致性 |