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,各个节点是对等的关系,gossipKey-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,便于运行时维护