本篇将帮助读者大体了解网络存储数据的大环境。初步认识分布式系统,传统型数据库,NoSQL及归属其下的MongoDB。
先了解一下大环境
随着网络的普及,交互的数据量呈指数型增长。从最初的关系数据库管理系统(RDBMS)便可以从容应对的业务操作到的NoSQL的提出并践行。都是技术革新的必然结果
分布式系统(分布式系统)
由多台计算机和通信的软件组件通过计算机网络连接(本地网络或广域网)组成。
分布式系统是建立在网络之上的软件系统。正是因为软件的特性,所以分布式系统具有高度的内聚性和透明性。
因此,网络和分布式系统之间的区别更多的在于高层软件(特别是操作系统),而不是硬件。
分布式系统可以应用在不同的平台上如:PC,工作站,局域网和广域网上等。
优点
可靠性(容错):
简言之,就是一台机子挂了不会影响到其他机子〜
可扩展性:
需要(有钱)的话,想加几台机子就加几台..
资源共享:
共享数据是必不可少的应用,如银行,预订系统。
灵活性:
便于安装,实施和调试新的服务。
更快的速度:
分布式计算系统可以有多台计算机的计算能力,使得它比其他系统有更快的处理速度。
开放系统:
由于它是开放的系统,本地或者远程都可以访问到该服务。
更高的性能:
相较于集中式计算机网络集群可以提供更高的性能(及更好的性价比)。
缺点
故障排除:
故障排除和诊断问题。
软件:
更少的软件支持是分布式计算系统的主要缺点。
网络:
网络基础设施的问题,包括:传输问题,高负载,信息丢失等。
安全性:
开放系统的特性让分布式计算系统存在着数据的安全性和共享的风险等问题。
关系型数据库
ACID规则
事务在英文中是交易,和现实世界中的交易很类似,它有如下四个特性:
- A(Atomicity)原子性
即事务中的所有组成行为必须全部成功,否则回滚。
例:银行转账,从甲账户转100元至乙账户
分为两个步骤:
1)从一个账户取100元;
2)存入100元至乙账户。
这两步要么一起完成,要么一起不完成,如果只完成第一步,第二步失败,钱会莫名其妙少了100元。
- C(Consistency)一致性
即事务的运行不会改变数据库原本的一致性约束。
例如现有完整性约束A + B = 10,如果一个事务改变了一个,那么必须得改变B,使得事务结束后依然满足A + B = 10,否则事务失败。
- I (Isolation) 独立性
所谓的独立性是指并发的事务之间不会互相影响,如果一个事务要访问的数据正在被另外一个事务修改,只要另外一个事务未提交,它所访问的数据就不受未提交事务的影响。
例:A的银行卡有存款10000元.B,C同时用A的卡消费了7000,4000元而产生了两个并发的扣费事务。此时率先执行完毕并提交的事务会成功,而后执行的事务在执行时因另一个事务正在执行并未提交而读到A的卡依然为10000元,直至提交事务时被回滚。
- D(Durability)持久性
持久性是指一旦事务提交后,它所做的修改将会永久的保存在数据库上,即使出现宕机也不会丢失。
非关系型数据库
回到NoSQL的,用于超大规模数据的存储。这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。
BASE规则
较于酸,这是一种弱规则。是的NoSQL数据库通常对可用性及一致性的弱要求原则
- 基本上是Availble - 基本可用
- 软状态 - 软状态/柔性事务。“软状态”可以理解为“无连接”的,而“硬状态”是“面向连接”的
- 最终一致性 - 最终一致性,也是是ACID的最终目的。
那么,为什么要用NoSQL的?
最主要的原因:数据量真的是太太太大了传统数据库表示无能为力..
当然,并不是说的NoSQL比传统数据库更优秀就会取代啊什么的。由于各具特点,他们在实际项目中其实是相辅相成的
RDBMS
- 规范化的数据
- 结构化查询语言
- 数据和关系都存储在
单独的表中 - 数据操纵语言,数据定义语言
- 严格的一致性
- 基础事务
NoSQL
- 代表着不仅仅是SQL
- 没有声明性查询语言
- 没有预定义的模式
- 键 - 值对存储,列存储,文档存储,图形数据库
- 最终一致性,而非ACID属性
- 非结构化和不可预知的数据
- CAP定理(布鲁尔定理,见底注①)
- 高性能,高可用性和可伸缩性
以上全部,基本能对分布式系统SQL / NoSQL有一个大概的了解,接下来讲MongoDB
什么是MongoDB的
MongoDB是由C ++语言编写的,是一个基于分布式文件存储的开源数据库系统。
在高负载的情况下,添加更多的节点,可以保证服务器性能。
MongoDB将数据存储为一个文档,数据结构由键值(key => value)对组成.MongoDB文档类似于JSON对象。字段值可以包含其他文档,数组及文档数组。比如:
{
//field : value
name : "zhangsan",
age : 18,
score : "A",
groups : ["news","sports"]
}
MongoDB中的用处
为WEB应用提供可扩展的高性能数据存储解决方案。
简单的讲,就是作为NoSQL的一员的属性:解决传统型数据库最无力的大数据量处理业务
MongoDB中的特点
- MongoDB是一个面向文档存储的数据库,操作起来比较简单和容易。
- 你可以在MongoDB记录中设置任何属性的索引(如:FirstName =“Sameer”,Address =“8 Gandhi Road”)来实现更快的排序。
- 你可以通过本地或者网络创建数据镜像,这使得MongoDB中有更强的扩展性。
- 如果负载的增加(需要更多的存储空间和更强的处理能力),它可以分布在计算机网络中的其他节点上这就是所谓的分片。
- 蒙戈支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
- MongoDb使用update()命令可以实现替换完成的文档(数据)或者一些指定的数据字段。
- MongoDB的中的地图/减少主要是用来对数据进行批量处理和聚合操作。
- 地图和Reduce.Map函数调用EMIT(键,值)遍历集合中所有的记录,将键与值传给减少函数进行处理。
- 地图函数和减少函数是使用的JavaScript编写的,并可以通过db.runCommand或MapReduce的命令来执行的MapReduce操作。
- GridFS的是MongoDB的中的一个内置功能,可以用于存放大量小文件。
- MongoDB的允许在服务端执行脚本,可以用使用Javascript编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可。
- MongoDB的支持各种编程语言:RUBY,PYTHON,JAVA,C ++,PHP,C#等多种语言。
- MongoDB的安装简单。
MongoDB中的使用
以下是使用MongoDB在实际使用中要注意的地方(明确但不仅限随时可能补充):
- MongoDB中并不请立即获取iTunes事务(大多数的NoSQL似乎都不支持)。所以并不适用于复杂的事务逻辑操作
由于其分布式的特点,导致一系列写命令的操作要访问的数据可能位于不同的分区服务器。这样一来事务就变成分布式事务,在分布式事务中实现原子性需要彼此协调,这是很耗时间的。需要制定一个协议保证一个事务中的所有机器都操作成功
最致命的是,只要协调没有全部完成,其他操作无法读取事务中写操作的结果,如果协调过程发现某个写操作不能完成,先前写成功的必须全部回滚。针对分布式事务的分布式协调对整体数据库性能有严重影响,所以大部分的NoSQL选择不提供分布式事务。
那么,MongoDB的能干些啥?
Emmm ...
当前已知的项目应用中,一般用它来处理一些随着时间数据量逐渐增大的表,比如订单表,日志表等...
虽然传统型数据库可以通过分表等操作来规避,但是时间一长,查询什么的还是会很麻烦
把这些表扔到MongoDB弄好片键分片,查询就会简单很多
(本篇暂且写到这里..东查西查了一大堆资料,再次衷心鸣谢大佬们!)
注
①CAP定理(布鲁尔定理)
- 一致性(Consistency)(所有节点在同一时间具有相同的数据)
- 可用性(Availability)(保证每个请求不管成功或者失败都有响应)
- 分隔容忍(Partition tolerance)(系统中任意信息的丢失或失败不会影响系统的继续运作)
CAP理论的核心是:一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求,最多只能同时较好的满足两个。
因此,根据CAP原理将NoSQL数据库分成了满足CA原则,满足CP原则和满足AP原则三大类:
- CA - 单点集群,满足一致性,可用性的系统,通常在可扩展性上不太强大。
- CP - 满足一致性,分区容忍性的系统,通常性能不是特别高。
- AP - 满足可用性,分区容忍性的系统,通常可能对一致性要求低一些。