NoSQL
Not Only SQL-非关系型数据库
Outline
• NoSQL基本概念
• NoSQL数据库分类
• NoSQL在系统架构中的应用
• MongoDB 数据库
NoSQL是什么?
• NoSQL概念在2009年被提了出来。NoSQL最
常见的解释是“non-relational”,“Not Only
SQL”也被很多人接受。
• Wikipedia上定义
– NoSQL是一种打破了关系型数据库长久以来占
主导地位的快速成长起来的非关系松散数据存
储类型,这种数据存储不需要事先设计好的
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
结构,它也不会出现表之间的连接操作和水平
分割,学术界称这种数据库为结构化存储[1]。
NoSQL诞生的原因
• 关系型数据库面临的问题
– 扩展困难:由于存在类似Join这样多表查询机制,使得数据库在扩
展方面很艰难;
– 读写慢:这种情况主要发生在数据量达到一定规模时由于关系型
数据库的系统逻辑非常复杂,使得其非常容易发生死锁等的并发
问题,所以导致其读写速度下滑非常严重;
– 成本高:企业级数据库的License价格很惊人,并且随着系统的规
模,而不断上升;
– 有限的支撑容量:现有关系型解决
方案
气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载
还无法支撑Google这样海
量的数据存储;
• 数据库访问的新需求
– 低延迟的读写速度:应用快速地反应能极大地提升用户的满意度;
– 支撑海量的数据和流量:对于搜索这样大型应用而言,需要利用
PB级别的数据和能应对百万级的流量;
– 大规模集群的管理:系统管理员希望分布式应用能更简单的部署
和管理;
– 庞大运营成本的考量:IT经理们希望在硬件成本、软件成本和人力
成本能够有大幅度地降低;
NoSQL数据库的共有原则
• 假设失效是必然发生的
– NOSQL实现都建立在硬盘、机器和网络都会失效这些假设之上。
– 我们不能彻底阻止这些时效,我们需要让我们的系统能够在即使
非常极端的条件下也能应付这些失效。
• 对数据进行分区
– 最小化了失效带来的影响,也将读写操作的负载分布到了不同的
机器上。
• 保存同一数据的多个副本
– 大部分 NOSQL 实现都基于数据副本的热备份来保证连续的高可用
性。
– 一些实现提供了 API,可以控制副本的复制,也就是说,当你存储
一个对象的时候,你可以在对象级指定你希望保存的副本数。
• 查询支持
– 在这个方面,不同的实现有相当 本质的区别。不同实现的一个共
性在于哈希表中的 key/value 匹配。
NoSQL数据库的共有原则
• 动态伸缩
– 要掌控不断增 长的数据,大部分 NOSQL 实现提供了不停机或完全重新分
区的扩展集群的方法。
• 一个已知的处理这个问题的算法称为一致哈希。有很多种不同算法可以实现一致哈
希。
• 另一个(简单很多)的算法使用逻辑分区。在逻辑分区中,分区的数量是固定的,
但分区在机器上的分布式动态的。
• 使用 Map/Reduce 处理汇聚
– Map/Reduce 常常被看作是并行汇聚查询的一个模式。大部分 NOSQL 实现
并不提供 map/reduce 的内建支持,需要一个外部的框架来处理这些查询。
– 在质疑模型中,你可以将代码发送到数据所在地地方,并在该节点上直
接运行复杂的查询
• 基于磁盘的和内存中的实现
– NOSQL 实现分为基于文件的方法和内存中的方法。有些实现提供了混合
模型,将内存和磁盘结合使用。两类方法的最主要区别在于每 GB 成本和
读写性能。
– 对于较低性能的实现,磁盘方案的成本远低于基于内存的方法,而对于
高性能需求的场合,内存方案则更加廉价。
设计理念:关系数据库 VS NoSQL
• NoSQL
– 以键值对存储,它的
结构不固定,
– 每一个元组可以有不
一样的字段,
– 每个元组可以根据需
要增加一些自己的键
值对,
– 不会局限于固定的结
构,可以减少一些时
间和空间的开销。
• 关系数据库
– 表都是存储一些
格式
pdf格式笔记格式下载页码格式下载公文格式下载简报格式下载
化的数据结构,
– 每个元组字段的组成
都一样,
– 即使不是每个元组都
需要所有的字段,但
数据库会为每个元组
分配所有的字段,
– 这样的结构可以便于
表与表之间进行连接
等操作。
设计理念:关系数据库 VS NoSQL
• NoSQL
– 对于许多互联网应用来
说,对于一致性要求可
以降低,而可用性
(Availability)的要求则更
为明显,从而产生了弱
一致性的理论BASE。
– BASE分别是英文:
Basically,Available,
Soft-state,Eventual
Consistency的缩写,这
个模型是反ACID模型。
• 关系数据库
– 分布式关系型数据库
中强调的ACID分别是
原子性(Atomicity)、
一致性Consistency)、
隔离性(Isolation)、
持久性(Durability)。
– ACID的目的就是通过
事务支持,保证数据
的完整性和正确性
NoSQL和关系数据库
• NoSQL数据库仅仅是关系数据库在某些方面
(性能,扩展)的一个弥补
– 单从功能上讲,NoSQL的几乎所有的功能,在关系
数据库上都能够满足。
– 一般会把NoSQL和关系数据库进行结合使用,各取
所长,各得其所。
• 在某些应用场合,比如一些配置的关系键值映
射存储、用户名和密码的存储、Session会话存
储等等,
– 用NoSQL完全可以替代关系数据库(如:MySQL)存
储。不但具有更高的性能,而且开发也更加方便。
NoSQL的优缺点
• 优点
– 简单的扩展
典型例子是Cassandra,由于
其架构是类似于经典的P2P,
所以能通过轻松地添加新的
节点来扩展这个集群;
– 快速的读写
主要例子有Redis,由于其逻
辑简单,而且纯内存操作,
使得其性能非常出色,单节
点每秒可以处理超过10万次
读写操作;
– 低廉的成本
这是大多数分布式数据库共
有的特点,因为主要都是开
源软件,没有昂贵的License成
本;
• 不足
– 不提供对SQL的支持
如果不支持SQL这样的工业
标准,将会对用户产生一
定的学习和应用迁移成本;
– 支持的特性不够丰富
现有产品所提供的功能都
比较有限,大多数NoSQL
数据库都不支持事务,也
不像MS SQL Server和Oracle
那样能提供各种附加功能,
比如BI和报表等;
– 现有产品的不够成熟
大多数产品都还处于初创
期,和关系型数据库几十
年的完善不可同日而语;
Outline
• NoSQL基本概念
• NoSQL数据库分类
• NoSQL在系统架构中的应用
• MongoDB 数据库
NoSQL 数据库分类
• 按CAP 分类
• 按数据模型分类
CAP理论
• 一致性(Consistency)
– 任何一个读操作总是能读取到之前完成的写操作结果,也就
是在分布式环境中,多点的数据是一致的;
• 可用性(Availability)
– 每一个操作总是能够在确定的时间内返回,也就是系统随时
都是可用的。
• 分区容忍性(Partition Tolerance)
– 在出现网络分区(比如断网)的情况下,分离的系统也能正
常运行。
一个分布式系统不能同时满足一致性,
可用性和分区容错性这三个需求 ,最
多只能同时满足两个。
关注一致性和可用性的 (CA)
• 这些数据库对于分区容忍性方面比较不感
冒,主要采用复制(Replication)这种方式
来保证数据的安全性,常见的CA系统有:
–传统关系型数据库,比如Postgres和MySQL等
(Relational) ;
– Vertica (Column-oriented) ;
– Aster Data (Relational) ;
– Greenplum (Relational) ;
关注一致性和分区容忍性的(CP)
• 这种系统将数据分布在多个网络分区的节点上,并保证
这些数据的一致性,但是对于可用性的支持方面有问题,
比如当集群出现问题的话,节点有可能因无法确保数据
是一致性的而拒绝提供服务,主要的CP系统有:
– BigTable (Column-oriented) ;
– Hypertable (Column-oriented) ;
– HBase (Column-oriented) ;
– MongoDB (Document) ;
– Terrastore (Document) ;
– Redis (Key-value) ;
– Scalaris (Key-value) ;
– MemcacheDB (Key-value) ;
– Berkeley DB (Key-value) ;
关于可用性和分区容忍性的(AP)
• 这类系统主要以实现"最终一致性(Eventual
Consistency)"来确保可用性和分区容忍性,
AP的系统有:
– Dynamo (Key-value) ;
– Voldemort (Key-value) ;
– Tokyo Cabinet (Key-value) ;
– KAI (Key-value) ;
– Cassandra (Column-oriented) ;
– CouchDB (Document-oriented) ;
– SimpleDB (Document-oriented) ;
– Riak (Document-oriented) ;
NoSQL-三种主流的数据模型
• Column-oriented(列式)
– 主要围绕着“列(Column)”,而非 “行(Row)”进行数据存储
– 属于同一列的数据会尽可能地存储在硬盘同一个页(Page)中
– 大多数列式数据库都支持Column Family这个特性
(很多类似数据仓库(Data Warehouse)的应用,虽然每次查询都会处理很多数据,
但是每次所涉及的列并没有很多)
– 特点:比较适合汇总(Aggregation)和数据仓库这类应用。
• Key-value
– 类似常见的HashTable,一个Key对应一个Value,但是其能提供非常快的查
询速度、大的数据存放量和高并发操作,
– 非常适合通过主键对数据进行查询和修改等操作,
虽然不支持复杂的操作,但可通过上层的开发来弥补这个缺陷。
• Document(文档)
– 类似常见的HashTable,一个Key对应一个Value,
– 其能提供非常快的查询速度、大的数据存放量和高并发操作,
– 非常适合通过主键对数据进行查询和修改等操作,
– 虽然不支持复杂的操作,但是可以通过上层的开发来弥补这个缺陷。
NoSQL按数据模型分类
类型 部分代表 特点
列存储 Hbase
Cassandra
Hypertable
顾名思义,是按列存储数据的。最大的特点是方
便存储结构化和半结构化数据,方便做数据压缩,
对针对某一列或者某几列的查询有非常大的IO优
势。
文档存储 MongoDB
CouchDB
文档存储一般用类似json的格式存储,存储的内
容是文档型的。这样也就有有机会对某些字段建
立索引,实现关系数据库的某些功能。
key-value存储 Tokyo Cabinet / Tyrant
Berkeley DB
MemcacheDB
Redis
可以通过key快速查询到其value。一般来说,存
储不管value的格式,照单全收。(Redis包含了其
他功能)
图存储 Neo4J
FlockDB
图形关系的最佳存储。使用传统关系数据库来解
决的话性能低下,而且设计使用不方便。
对象存储 db4o
Versant
通过类似面向对象语言的语法操作数据库,通过
对象的方式存取数据。
xml数据库 Berkeley DB XML
BaseX
高效的存储XML数据,并支持XML的内部查询语
法,比如XQuery,Xpath。
以上NoSQL数据库类型的划分并不是绝对,只是从存储模型上来进行的大体划分,它们之间没有绝对的分界。
选择合适的NoSQL
• 数据结构特点
– 包括结构化、半结构化、字段是否可能变更、是否
有大文本字段、数据字段是否可能变化。
• 写入特点
– 包括insert比例、update比例、是否经常更新数据
的某一个小字段、原子更新需求。
• 查询特点
– 包括查询的条件、查询热点的范围。比如用户信息
的查询,可能就是随机的,而新闻的查询就是按照
时间,越新的越频繁。
我们常常需要根据如下情况考虑:
Outline
• NoSQL基本概念
• NoSQL 数据库分类
• NoSQL在系统架构中的应用
• MongoDB 数据库
NoSQL在系统架构中的应用
• 以NoSQL为辅
• 以NoSQL为主
• 以NoSQL为缓存
以NoSQL为辅
• NoSQL作为镜像
– 不改变原有的以MySQL作为存储的架构,使用
NoSQL作为辅助镜像存储,用NoSQL的优势辅
助提升性能。
– 在原有基于MySQL数据库的架构上增加了一层
辅助的NoSQL存储,
– 在写入MySQL数据库后,同时写入到NoSQL数
据库,让MySQL和NoSQL拥有相同的镜像数据
– 在某些可以根据主键查询的地方,使用高效的
NoSQL数据库查询
以NoSQL为辅
• NoSQL为镜像(同步模式)
–通过MySQL把数据同步到NoSQL中, ,是一
种对写入透明但是具有更高技术难度一种
模式
–适用于现有的比较复杂的老系统,通过修
改代码不易实现,可能引起新的问题。同
时也适用于需要把数据同步到多种类型的
存储中。
以NoSQL为辅
• MySQL和NoSQL组合
– MySQL中只存储需要查询的小字段,NoSQL存储所有
数据。
– 把需要查询的字段,一般都是数字,时间等类型的
小字段存储于MySQL中,根据查询建立相应的索引,
– 其他不需要的字段,包括大文本字段都存储在NoSQL
中。
– 在查询的时候,我们先从MySQL中查询出数据的主
键,然后从NoSQL中直接取出对应的数据即可。
以NoSQL为主
• 纯NoSQL架构
– 在一些数据结构、查询关系非常简单的系统中,
我们可以只使用NoSQL即可以解决存储问题。
– 在一些数据库结构经常变化,数据结构不定的
系统中,就非常适合使用NoSQL来存储。
• 比如监控系统中的监控信息的存储,可能每种类型
的监控信息都不太一样。
– 有些NoSQL数据库已经具有部分关系数据库的
关系查询特性,他们的功能介于key-value和关
系数据库之间,却具有key-value数据库的性能,
基本能满足绝大部分web 2.0网站的查询需求。
MongoDB就带有关系查询的功能,能解决常
用的关系查询,所以也是一种非常不错的选
择。
以NoSQL为主
• 以NoSQL为数据源的架构
– 数据直接写入NoSQL,再通过NoSQL同步
协议
离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载
复制到其他存
储。
– 根据应用的逻辑来决定去相应的存储获取数据。
– 应用程序只负责把数据直接写入到NoSQL数据库,然后通过
NoSQL的复制协议,把NoSQL数据的每次写入,更新,删除
操作都复制到MySQL数据库中。
– 同 时,也可以通过复制协议把数据同步复制到全文检索实现
强大的检索功能。
– 这种架构需要考虑数据复制的延迟问题,这跟使用MySQL的
master-salve模式的延迟问题是一样的,解决方法也一样。
以NoSQL为缓存
• 内存模式
– Memcached提供了相当高的读写性能,在互联网发
展过程中,一直是缓存服务器的首选。
– NoSQL数据库Redis又为我们提供了功能更加强大的
内存存储功能。跟Memcached比,Redis的一个key
的可以存储多种数据结构Strings、Hashes、Lists、
Sets、Sorted sets。
– Redis不但功能强大,而且它的性能完全超越大名
鼎鼎的Memcached。
• Redis支持List、hashes等多种数据结构的功能,提供了更
加易于使用的api和操作性能,比如对缓存的list数据的修
改。
由于NoSQL数据库天生具有高性能、易扩展的特点,所以我们常常结合关系数
据库,存储一些高性能的、海量的数据。
从另外一个角度看,根据NoSQL的高性能特点,它同样适合用于缓存数据。用
NoSQL缓存数据可以分为内存模式和磁盘持久化模式。
以NoSQL为缓存
• 持久化模式
– 虽然基于内存的缓存服务器具有高性能,低延迟的
特点,但是内存成本高、内存数据易失却不容忽视。
– 大部分互联网应用的特点都是数据访问有热点,也
就是说,只有一部分数据是被频繁访问的。
– 其实NoSQL数据库内部也是通过内存缓存来提高性
能的,通过一些比较好的算法
• 把热点数据进行内存cache,
• 非热点数据存储到磁盘
• 以节省内存占用。
– 使用NoSQL来做缓存,由于其不受内存大小的限制,
我们可以把一些不常访问、不怎么更新的数据也缓
存起来。
Outline
• NoSQL基本概念
• NoSQL 数据库分类
• NoSQL在系统架构中的应用
• MongoDB 数据库
MongoDB
• MongoDB的名称取自“humongous”(巨大的) 的中间部分,
足见mongodb的宗旨在处理大量数据上面
• 面向文档(Document)存储
• C++实现
• 支持多平台 Windows Linux, Mac OS-X, FreeBSD, Solaris
• 多语言驱动:
– Ruby / Ruby-on-Rails
– Java
– C#
– JavaScript
– C / C++
– Erlang Python, Perl
MongoDB设计理念
• 不求搞定一切
• 正确的工具做正确的事儿
• 性能与功能的取舍
• 放弃事务
MongoDB特性
• 模式自由
– 支持动态查询、完全索引,可轻易查询文档中内嵌的对象及
数组
• 面向文档存储
– 易存储对象类型的数据, 包括文档内嵌对象及数组
• 高效的数据存储
– 支持二进制数据及大型对象(如照片和视频)
• 支持复制和故障恢复
– 提供了主-从、主-主模式的数据复制及服务器之间的数据复
制
• 自动分片
– 以支持云级别的伸缩性,
– 支持水平的数据库集群,可动态添加额外的服务器
MongoDB适用场景
• 适合作为信息基础设施的持久化缓存层
• 适合实时的插入,更新与查询,并具备应
用程序实时数据存储所需的复制及高度伸
缩性
• Mongo的BSON数据格式非常适合文档化格
式的存储及查询
• 适合由数十或数百台服务器组成的数据库。
因为Mongo已经包含了对MapReduce引擎的
内置支持
MongoDB不适用场景
• 要求高度事务性的系统
• 传统的商业智能应用
• 复杂的跨文档(表)级联查询
MongoDB数据模型
MongoDB的工作方式
• MongoDB是一个介于关系数据库和非关系数据库之间的产品
– 是非关系数据库当中功能最丰富并且最像关系型数据库。
• MongoDB存储的数据格式是key-value对的集合
– 键是字符串,值可以是数据类型集合里的任意类型,包括数组和文档对象。
• MongoDB是一个免安装的数据库
– 将它解压后生成一个bin目录,其中包含11个工具命令,除此之外不再需要任
何其它的二进制依赖文件。
• 启动数据库只需要关注其中的两个命令:mongod和mongo。
– 前者是MongoDB数据库进程本身,是核心数据库服务器,
– 后者是命令行Shell客户端
• MongoDB使用了内存映射文件进行数据管理,把所有空闲内存当缓存
使用,且不能指定内存大小。
• 数据空间采用预分配,目的是为了避免形成过多的硬盘碎片。
– 在32位模式运行时支持的最大文件为2GB。
MongoDB的下载
• MongoDB的官网:
http://www.mongodb.org/
• MongoDB的下载地址:
http://www.mongodb.org/downloads