1. 数据库:简述对数据库的认识
  2. 数据库:简述对关系型数据库(RDBMS)的认识
  3. 数据库:简述对非关系型数据库(NoSQL)的认识
  4. 数据库:关系型数据库和非关系型数据库的区别
  5. 数据库:简述对分布式数据库的认识

一、非关系型数据库的概念

随着近些年技术方向的不断拓展,大量的NoSql数据库如MongoDB、Redis、Memcached出于简化数据库结构、避免冗余、影响性能的表连接、摒弃复杂分布式的目的被设计。

NoSQL数据库指的是分布式的、非关系型的、不保证遵循ACID原则的数据存储系统。

NoSQL数据库技术与CAP理论、一致性哈希算法有密切关系。所谓CAP理论,简单来说就是一个分布式系统不可能满足可用性、一致性与分区容错性这三个要求,一次性满足两种要求是该系统的上限。而一致性哈希算法则指的是NoSQL数据库在应用过程中,为满足工作需求而在通常情况下产生的一种数据算法,该算法能有效解决工作方面的诸多问题但也存在弊端,即工作完成质量会随着节点的变化而产生波动,当节点过多时,相关工作结果就无法那么准确。这一问题使整个系统的工作效率受到影响,导致整个数据库系统的数据乱码与出错率大大提高,甚至会出现数据节点的内容迁移,产生错误的代码信息。但尽管如此,NoSQL数据库技术还是具有非常明显的应用优势,如数据库结构相对简单,在大数据量下的读写性能好;能满足随时存储自定义数据格式需求,非常适用于大数据处理工作。

NoSQL数据库适合追求速度和可扩展性、业务多变的应用场景。 对于非结构化数据的处理更合适,如文章、评论,这些数据如全文搜索、机器学习通常只用于模糊处理,并不需要像结构化数据一样,进行精确查询,而且这类数据的数据规模往往是海量的,数据规模的增长往往也是不可能预期的,而NoSQL数据库的扩展能力几乎也是无限的,所以NoSQL数据库可以很好的满足这一类数据的存储。

二、非关系型数据库的存储方式

NoSQL数据库利用key-value可以获取大量的非结构化数据,并且数据的获取效率很高,但用它查询结构化数据效果就比较差。

目前NoSQL数据库仍然没有一个统一的标准,它现在有四种大的分类:
(1) 键值对存储(key-value):代表软件Redis,它的优点能够进行数据的快速查询,而缺点是需要存储数据之间的关系。
(2) 列存储:代表软件Hbase,它的优点是对数据能快速查询,数据存储的扩展性强。而缺点是数据库的功能有局限性。
(3) 文档数据库存储:代表软件MongoDB,它的优点是对数据结构要求不特别的严格。而缺点是查询性的性能不好,同时缺少一种统一查询语言。
(4) 图形数据库存储:代表软件InfoGrid,它的优点可以方便的利用图结构相关算法进行计算。而缺点是要想得到结果必须进行整个图的计算,而且遇到不适合的数据模型时,图形数据库很难使用。

存储方式

键值对存储(l临时)

Memcached,Redis

键值对存储(永久)

Redis,Flare,Tokyo Tyrant

列存储

Hbase,Cassandra

文档数据库存储

MongoDB,CouchDB

图形数据库存储

InfoGrid

三、主流非关系型数据库的讲解

3.1 MongoDB

MongoDB 是一个高性能,开源,无模式的文档型数据库,开发语言是C++。它在许多场景下可用于替代统的关系型数据库或键/值存储方式。

  1. MongoDB特点

01)所用语言:C++
02)特点:保留了SQL一些友好的特性(查询,索引)。
03)使用许可: AGPL(发起者: Apache)
04)协议: Custom, binary( BSON)
05)Master/slave复制(支持自动错误恢复,使用 sets 复制)
06)内建分片机制
07)支持 javascript表达式查询
08)可在服务器端执行任意的 javascript函数
09)update-in-place支持比CouchDB更好
10)在数据存储时采用内存到文件映射
11)对性能的关注超过对功能的要求
12)建议最好打开日志功能(参数 --journal)
13)在32位操作系统上,数据库大小限制在约2.5Gb
14)空数据库大约占 192Mb
15)采用 GridFS存储大数据或元数据(不是真正的文件系统)

  1. MongoDB优点

01)更高的写负载,MongoDB拥有更高的插入速度。
02)处理很大的规模的单表,当数据表太大的时候可以很容易的分割表。
03)高可用性,设置M-S不仅方便而且很快,MongoDB还可以快速、安全及自动化的实现节点 (数据中心)故障转移。
04)快速的查询,MongoDB支持二维空间索引,比如管道,因此可以快速及精确的从指定位置 获取数据。MongoDB在启动后会将数据库中的数据以文件映射的方式加载到内存中。如果内 存资源相当丰富的话,这将极大地提高数据库的查询速度。
05)非结构化数据的爆发增长,增加列在有些情况下可能锁定整个数据库,或者增加负载从而 导致性能下降,由于MongoDB的弱数据结构模式,添加1个新字段不会对旧表格有任何影响, 整个过程会非常快速。

  1. MongoDB缺点:

01)前期不支持事务,MongoDB 4.x后支持。
02)MongoDB占用空间过大 。
03)MongoDB没有成熟的维护工具。

  1. MongoDB应用场景

01)适用于实时的插入、更新与查询的需求,并具备应用程序实时数据存储所需的复制及高度伸缩性;
02)非常适合文档化格式的存储及查询;
03)高伸缩性的场景:MongoDB 非常适合由数十或者数百台服务器组成的数据库。
04)对性能的关注超过对功能的要求。

3.2 HBase

HBase 是 Apache Hadoop 中的一个子项目,属于 bigtable 的开源版本,所实现的语言为Java(故依赖 Java SDK)。HBase 依托于 Hadoop 的 HDFS(分布式文件系统)作为最基本存储基础单元。

  1. HBase 特点

01)所用语言: Java
02)特点:支持数十亿行X上百万列
03)使用许可: Apache
04)协议:HTTP/REST (支持 Thrift,见编注4)
05)在 BigTable之后建模
06)采用分布式架构 Map/reduce
07)对实时查询进行优化
08)高性能 Thrift网关
09)通过在server端扫描及过滤实现对查询操作预判
10)支持 XML, Protobuf, 和binary的HTTP
11)Cascading, hive, and pig source and sink modules
12)基于 Jruby( JIRB)的shell
13)对配置改变和较小的升级都会重新回滚
14)不会出现单点故障
15)堪比MySQL的随机访问性能

  1. HBase 优点

01) 存储容量大,一个表可以容纳上亿行,上百万列;
02)可通过版本进行检索,能搜到所需的历史版本数据;
03)负载高时,可通过简单的添加机器来实现水平切分扩展,跟Hadoop的无缝集成保障了其数据可靠性(HDFS)和海量数据分析的高性能(MapReduce);
04)在第3点的基础上可有效避免单点故障的发生。

  1. HBase 缺点

01)基于Java语言实现及Hadoop架构意味着其API更适用于Java项目;
02)node开发环境下所需依赖项较多、配置麻烦(或不知如何配置,如持久化配置),缺乏文档;
03)占用内存很大,且鉴于建立在为批量分析而优化的HDFS上,导致读取性能不高;
04)API相比其它 NoSql 的相对笨拙。

  1. HBase 适用场景

01)bigtable类型的数据存储;
02)对数据有版本查询需求;
03)应对超大数据量要求扩展简单的需求。

3.3Redis

Redis 是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。目前由VMware主持开发工作。

  1. Redis 特点

01)所用语言:C/C++
02)特点:运行异常快
03)使用许可: BSD
04)协议:类 Telnet
05)有硬盘存储支持的内存数据库,但自2.0版本以后可以将数据交换到硬盘(注意, 2.4以后版本不支持该特性!)
06)Master-slave复制
07)虽然采用简单数据或以键值索引的哈希表,但也支持复杂操作
08)INCR & co (适合计算极限值或统计数据)
09)支持 sets(同时也支持 union/diff/inter)
10)支持列表(同时也支持队列;阻塞式 pop操作)
11)支持哈希表(带有多个域的对象)
12)支持排序 sets(高得分表,适用于范围查询)
13)Redis支持事务
14)支持将数据设置成过期数据(类似快速缓冲区设计)
15)Pub/Sub允许用户实现消息机制

  1. Redis 优势

01)非常丰富的数据结构;
02)Redis提供了事务的功能,可以保证一串 命令的原子性,中间不会被任何操作打断;
03)数据存在内存中,读写非常的高速,可以达到10w/s的频率。

  1. Redis 缺点

01) Redis3.0后才出来官方的集群方案,但仍存在一些架构上的问题;
02)持久化功能体验不佳——通过快照方法实现的话,需要每隔一段时间将整个数据库的数据写到磁盘上,代价非常高;而aof方法只追踪变化的数据,类似于mysql的binlog方法,但追加log可能过大,同时所有操作均要重新执行一遍,恢复速度慢;
03)由于是内存数据库,所以,单台机器,存储的数据量,跟机器本身的内存大小。虽然redis本身有key过期策略,但是还是需要提前预估和节约内存。如果内存增长过快,需要定期删除数据。

  1. Redis 应用场景

最佳应用场景:适用于数据变化快且数据库大小可预见(适合内存容量)的应用程序。例如:微博、数据分析、实时数据搜集、实时通讯等。

参考:https://mp.weixin.qq.com/s/g3rLECI5oyWOFEVMlTMfpw