大数据四个特征:数据大,速度快,多样化,价值
传统的数据库都是先有模式,然后才会产生数据;大数据时代很多情况下难以预先确定模式,模式只有在数据出现之后才能确定,且模式随着数据量的增长处于不断的演变之中。传统数据库中数据仅作为处理对象,大数据时代,要将数据作为一种资源来辅助解决其他诸多领域的问题。
关系数据库劣势
1.不适合在分布式环境中的向外扩展;
2.随着用户数的不断增加,需要增加更多的应用服务器,但是相对来说比较简单,真正的压力在于所有的应用服务器都共享一个中心的数据库服务器。
引入分布式事务:由于关系数据库支持事务,切分可能引入分布式事务,但分布式事务对系统资源消耗大,性能也并不高。
跨节点的join和排序操作:尽管能在数据库端解决(Oracle DBlink, MySQL Federated),但可能耗费大量的网络资源。通常推荐在应用层进行数据的整合,这需要应用层做很多额外的工作,也加重了应用服务器的负担。
3.难以支持高并发读写。
4.不足:大量数据的写入处理;表结构变更及建立索引;字段不固定的应用;对简单查询需要快速返回结果的处理。
Nosql优势:易于数据的分散;提升性能和增大规模;模式自由;扩展性好
NoSQL数据库的种类
· 在MongoDB中数据以单文档为单位存储,这样就能在单个数据对象中表示复杂的关系。文档可以由独立的基本类型属性、内嵌文档或文档数组组成。
· MongoDB存储的数据格式是key-value对的集合,键是字符串,值可以是数据类型集合里的任意类型,包括数组和文档对象。这种数据格式称作BSON,即“Binary Serialized Document Notation”,是一种类似JSON的二进制序列化文档。
CAP理论:
一个分布式系统不可能满足一致性,可用性和分区容错性这三个需求,最多只能同时满足两个。
数据一致性:
存储系统可以理解为一个黑盒子,它为我们提供了可用性和持久性的保证。
*强一致性(即时一致性):假如A先写入了一个值到存储系统,存储系统保证后续A,B,C的读取操作都将返回最新值;单副本数据容易保证强一致性;多副本数据需要使用分布式事务协议。
*弱一致性:假如A先写入了一个值到存储系统,存储系统不能保证后续A,B,C的读取操作能读取到最新值。
不一致性窗口:从A写入到后续操作A,B,C读取到最新值这一段时间。
*最终一致性:是弱一致性的一种特例 。 例:DNS系统
假如A首先write了一个值到存储系统,存储系统保证如果在A,B,C后续读取之前没有其它写操作更新同样的值的话,最终所有的读取操作都会读取到A写入的最新值(“不一致性窗口”的大小依赖于以下的几个因素:交互延迟,系统的负载,以及复制技术中replica的个数)。
*Causal consistency(因果一致性)
如果Process A通知Process B它已经更新了数据,那么Process B的后续读取操作则读取A写入的最新值,而与A没有因果关系的C则可以最终一致性。
*Read-your-writes consistency(读自写一致性)
如果Process A写入了最新的值,那么Process A的后续操作都会读取到最新值。但是其它用户可能要过一会才可以看到。
*Session consistency(会话一致性)
此种一致性要求客户端和存储系统交互的整个会话阶段保证Read-your-writes consistency,Hibernate的session提供的一致性保证就属于此种一致性。
*Monotonic read consistency(单调读一致性)
此种一致性要求如果Process A已经读取了对象的某个值,那么后续操作将不会读取到更早的值。
*Monotonic write consistency(单调写一致性)
此种一致性保证系统会序列化执行一个Process中的所有写操作。
数据一致性实现技术
1.NWR模型(把CAP选择权交给用户)
N: 复制的节点数量
R: 成功读操作的最小节点数
W: 成功写操作的最小节点数
只需W + R > N,就可以保证强一致性,因为读取数据的节点和被同步写入的节点是有重叠的,一般N>3
如果要高的一致性,那么就配置N=W,R=1,这个时候可用性特别是写操作的性能就会大大降低。
如果想要高的可用性,那么此时就需要放松一致性的要求,此时可以配置W=1,这样使得写操作延迟最低,同时通过异步的机制更新剩余的N-W个节点。
W = 1, R = N,对写操作要求高性能高可用,高可用性。
R = 1, W = N , 对读操作要求高性能高可用,比如类似cache之类业务,高一致性。
W = Q, R = Q where Q = N / 2 + 1 一般应用适用,读写性能之间取得平衡,如N=3,W=2,R=2。
2.两阶段提交协议
可以保证分布式事务中,要么所有参与的进程都提交事务成功,要么都取消事务,这样做可以在分布式环境中保持ACID(A:原子性)。参与者就是实际处理事务的机器,协调者就是其中一台单独的处理分布式事务的机器。
投票阶段 在请求阶段,协调者将通知事务参与者准备提交或取消事务,然后进入表决过程,在表决过程中,参与者将告知协调者自己的决策:同意(事务参与者本地作业执行成功)或取消(本地作业执行故障)。
提交阶段 协调者将基于第一个阶段的投票结果进行决策:提交或取消。当且仅当所有的参与者同意提交事务协调者才通知所有的参与者提交事务,否则协调者将通知所有的参与者取消事务。
优点:实现简单。
缺点:同步阻塞问题;单点故障;数据不一致;二阶段无法解决的问题。