NoSQL(Not only SQL),泛指非关系型数据库
nosql-database.org对NoSQL有一个较为全面的解释,指出NoSQL的特点:非关系、分布式、开源、水平扩展、schema-free、easy replication support、simple API、最终一致性(不支持ACID)、支持海量数据(Huge Data)
ACID&BASE思想
ACID模型侧重高一致性+数据可靠性,牺牲可用性
Base:
Basically Available(基本可用):支持分区失败(e.g.sharding 碎片划分数据库)
Soft state(软状态):状态可以有一段时间不同步,异步
Eventually consistent(最终一致):最终数据是一致的就可以了,而不是时时高一致。
BASE思想反ACID,完全不同与ACID模型,牺牲高一致性,获得可用性和可靠性。
目前存在的NoSQL数据模型在致分为四类:Key-Value(键值对)、Column-Oriented(列式)、Document-Oriented(文档型)、Graph-Oriented(图形)。
NoSQL需要支持良好的扩展性,当系统容量不足或负载过重时,可
随时添加节点而不影响现有业务,系统自动完成数据均衡。而集群
中机器之间需要通讯,以了解彼此的状态信息。通常有两种架构
Master/Slave
类BigTable的系统均采用Master/Slave架构
Master负责整个集群的命名空间管理、集群状态监控、负载均衡等
Slave来负责存储实际的数据,并定时的向Master报告自己的状态
信息
P2P
类Dynamo的系统均采用P2P架构,与Master/Slave不同,它是完
全去中心化,不存在Master,各个节点是对等的关系,gossip
Key-Value
数据模型:简单的键值对
典型应用:
Cache
高读写的简单存储
优势:
简单、读写速度快
劣势:
存储数据缺少结构化,只能存储Key-Value对
复杂的结构需要上层应用处理
Column-Oriented
数据模型:BigTable式表格,稀疏矩阵
典型应用:
海量数据存储与分析
优势:
查找列速度快,可扩展性强,更容易进行分布式扩展
劣势:
功能相对局限,对于跨表的join性能不高
Document-Oriented
数据模型:灵感来源于Lotus Notes,JSON-like
典型应用:
Web应用
优势:
数据结构要求不严格,灵活
劣势:
查询性能不高,而且缺乏统一的查询语法
Graph-Oriented
数据模型:图模型
典型应用:
基于网络的应用,地理位置信息(用作GIS)、社交网络(SNS)、
网络拓扑等
优势:
可以利用图结构相关算法
劣势:
需要对整个图做计算才能得出结果,不容易做分布式的集群方案
大数据的特征
3V——Volume(海量)、Variety(多样)、Velocity(实时)
海量——数据量巨大,对TB、PB数据级的处理, 已经成为基本配置。
多样——处理多样性的数据类型,结构化数据和非结构化数据,能处理Web数据,能处理语音数据甚至是图像、视频数据。
实时——在客户每次浏览页面,每次下订单的过程中都存在,都会需要对用户进行实时的推荐,决策已经变得实时
大数据时代下的系统需求
High performance –高并发读写的需求
高并发、实时动态获取和更新数据
Huge Storage –海量数据的高效率存储和访问的需求
类似SNS网站,海量用户信息的高效率实时存储和查询
High Scalability && High Availability –高可扩展性和高可用性的需求
需要拥有快速横向扩展能力、提供7*24小时不间断服务
NoSQL的优势
易扩展
NoSQL数据库种类繁多,但是一个共同的特点都是去掉关系数据库的关系型特性。数据之间无关系,这样就非常容易扩展。也无形之间,在架构的层面上带来了可扩展的能力。甚至有多种NoSQL之间的整合。
灵活的数据模型
NoSQL无需事先为要存储的数据建立字段,随时可以存储自定义的数据格式。而在关系数据库里,增删字段是一件非常麻烦的事情。如果是非常大数据量的表,增加字段简直就是一个噩梦。
高可用
NoSQL在不太影响性能的情况,就可以方便的实现高可用的架构。比如Cassandra,HBase模型,通过复制模型也能实现高可用。
大数据量,高性能
NoSQL数据库都具有非常高的读写性能,尤其在大数据量下,同样表现优秀。这得益于它的无关系性,数据库的结构简单。
某些与NoSQL匹配的需求如下:
快速应用开发
— 变化的市场需求
— 变化的数据需求
可伸缩性
– 未知的用户需求
– 访问、添加和更新数据使吞吐量持续增长而带来的需求
一致的性能
– 低响应时间,以便支持更好地用户体验
– 高吞吐量,以便处理快速地增长
运行可靠性
– 高可用性,能够优雅地处理失效并尽量减小对应用的影响
– 内置监控API,便于运行时维护