0%

NoSQL数据库技术及其应用研究

觉得这篇论文的技术含量不高 但有利于快速的了解一下相关的技术

绪论

互联网的快速发展使得数据量持续爆发式的增长。应用架构也由向上扩展(Scale-up,提高单机性能)向分布式,横向扩展(Scale-out)。

传统关系型数据库:

要求 难题
事务一致性 高并发读写
读写实时性 海量数据的高效率存储和访问
复杂SQL查询 高扩展性和可用性

在很多互联网业务中:传统关系型数据库面临的难题是必须要解决的,而要求的哪些内容又不是业务必须的。

NoSQL 技术综述

NoSQL 可以说是解决另外一种数据存储问题,它不需要保证事务的ACID特性,对读写的实时性也不做强要求。但是由于数据的规模大,对存储的可扩展性,高可用性和高并发读写有很大的要求。
第一节先介绍NoSQL的一个定义,可以具有一定的启发意义。引入CAP理论,说明鱼与熊掌不可兼得。为了高可用而放弃对事务的支持。
为了满足可扩展性,数据需要重新编码而不是用强耦合的表结构。使得数据可以按照一定的规则分布到不同的节点上。
为了满足高可用性,则需要多副本存储数据,那么保持数据的一致性的要求有哪些协议。

NoSQL 概念与特性

NoSQL定义:

InfoSys Technologies 的首席技术架构师 Sourav Mazumder提出了非关系数据库的一个较为严谨的描述:

  1. 使用可扩展的松耦合类型数据模式来对数据进行逻辑建模;
  2. 为遵循CAP定理的跨多节点数据分布模型而设计,支持水平伸缩;
  3. 拥有在磁盘和(或)内存中的数据持久化能力;
  4. 支持多种接口来进行数据访问。

NoSQL 因为对性能和可扩展性的要求而不支持事务机制,一般只提供对行级别的原子性的保证不支持跨行更新的原子性,即对于k-v对,只保证对一个key中的value的修改是原子性的。

CAP理论:

  • 一致性(Consistence) (等同于所有节点访问同一份最新的数据副本)
  • 可用性(Availability)(每次请求都能获取到非错的响应——但是不保证获取的数据为最新数据)
  • 分区容错性(Network partitioning)(以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择[3]。)

根据定理,分布式系统只能满足三项中的两项而不可能满足全部三项。P是分布式系统一定存在的现象,那只能在C和A之间选择一个。考虑这样的一个场景,为了保证C,那么各个数据节点的数据必须一致,一个节点更新数据之后,如果这时候出现了网络分区(P),这个更新就不能通知到所有的节点。为了满足C,那么只能等待那个分区节点恢复通讯之后,达到C才能提供服务。这样就不满足A了。

现在觉得CAP定理已经基本上是一个理论了,由于Raft等一致性算法存在,使得只要大部分节点有用,就能使得系统有用。所以在满足C的情况下A也可以基本满足。那剩下的就是Raft等一致性算法对于性能的影响了

根据CAP理论, NoSQL有两个层次的一致性:强一致性和最终一致性(存在不一致窗口)。

数据模型

数据库的数据模型指的是数据在数据库中的组织方式,数据库的操作模型指的是存取这些数据的方式。

  1. k-v值得数据模型:
    key-value存储
    key-结构化数据存储:它将key-value存储中value的扩展为结构化的数据类型,包括数字、字符串、列表、集合以及有序集合。
    key-文档存储:value是结构化文档,通常这些文档是被转换成JSON或类似JSON的结构进行存储。
    BigTable的列式存储:列式存储可以这样理解,将行ID、列簇号、列号以及时间戳一起组成一个Key,然后
    将Value按key的顺序进行存储。列存储中不同于行存储(上面的3个是行存储)。
  2. 图结构数据模型

分布式扩展

分布式的可扩展性,其实主要是数据要如何分布到不同的节点上。而访问时的负载均衡,各个节点中的数据比较均匀,添加节点和删除节点时的动态迁移。都是需要考虑的。

数据如何存储到不同节点上,在k-v的模型下还是很容易实现的:

  1. 哈希分区
    最简单的h(key)mod(n)的值分布到n个节点中。
  2. 范围分区
    为没有节点维护一个key的范围,将范围内的数据存到对应的节点中。

范围分区是比哈希分区在实践中更好的一种分区方式,可以更好的达到数据的均衡分布和动态迁移。但是要维护更多的元数据信息。

详细讲解见:带着问题学习分布式系统之数据分片

数据可靠性

  1. 单机可靠性:写到磁盘,提升性能合并多个写,在flush下盘。
  2. 多机可靠性:
    最简单的是主从数据同步的方式:所有在master上执行的操作,都会通过类似于操作日志的结构顺序地传递给slave上再执行一遍。若master宕机,slave可以继续执行完master传来的操作日志并且成为新的master。可能中间会导致一些数据丢失,因为master同步到是非阻塞的,并不知道操作是否已经完成。

这样说raft也是主从数据同步的一种方式,只是保证了数据的强一致性,和故障的自动恢复。这两个就是分布式系统的两个想要实现性质和实现难点

数据的可靠性是通过冗余数据保证的,上面的多机可靠性是异步同步复制(保证数据一致性的最弱的一个版本)。

Paxos可以是一个去中心化的模型,不好实现。(性能也不好)现在主流的还是使用中心化副本控制协议。

详细讲解见:带着问题学习分布式系统之中心化复制集

MongoDB 简介

MongoDB 的设计定位是在具有key/value存储方式的高性能和高度扩展性的同时,具备传统的关系数据库管理系统的丰富功能,集两者的优势于一身,MongoDB使用数据结构松散的BSON格式,面向文档存储数据,使用自动分片(auto-sharding) 范围分区实现海量数据存储,支持全类型索引,使用的查询语言语法类似面向对象查询语言,可以实现类似关系数据库单表查询的绝大部分功能,支持主从和复制集(replica set) 两种数据复制机制

replica set 是是一组数据库节点存储相同数据互作冗余,通过节点之间的数据同步和主节点选举提供故障自动转移和成员节点自动恢复。 可以使用raft一致性算法

详细见:MongoDB 存储与查询机制

参考文献

[1]沈姝. NoSQL数据库技术及其应用研究[D].南京信息工程大学,2012.
wiki cap定理
[3] CAP理论十二年回顾:”规则”变了. InfoQ.
带着问题学习分布式系统之数据分片
带着问题学习分布式系统之中心化复制集