关系数据库和nosql的示例分析

64次阅读
没有评论

共计 8262 个字符,预计需要花费 21 分钟才能阅读完成。

丸趣 TV 小编给大家分享一下关系数据库和 nosql 的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

NoSQL 概念

随着 web2.0 的快速发展,非关系型、分布式数据存储得到了快速的发展,它们不保证关系数据的 ACID 特性。NoSQL 概念在 2009 年被提了出来。NoSQL 最常见的解释是“non-relational”,“Not
Only SQL”也被很多人接受。(“NoSQL”一词最早于 1998 年被用于一个轻量级的关系数据库的名字。)

NoSQL 被我们用得最多的当数 key-value 存储,当然还有其他的文档型的、列存储、图型数据库、xml 数据库等。在 NoSQL 概念提出之前,这些数据库就被用于各种系统当中,但是却很少用于 web 互联网应用。比如 cdb、qdbm、bdb 数据库。

传统关系数据库的瓶颈

传统的关系数据库具有不错的性能,高稳定型,久经历史考验,而且使用简单,功能强大,同时也积累了大量的成功案例。在互联网领域,MySQL 成为了绝对靠前的王者,毫不夸张的说,MySQL 为互联网的发展做出了卓越的贡献。

在 90 年代,一个网站的访问量一般都不大,用单个数据库完全可以轻松应付。在那个时候,更多的都是静态网页,动态交互类型的网站不多。

到了最近 10 年,网站开始快速发展。火爆的论坛、博客、sns、微博逐渐引领 web 领域的潮流。在初期,论坛的流量其实也不大,如果你接触网络比较早,你可能还记得那个时候还有文本型存储的论坛程序,可以想象一般的论坛的流量有多大。

Memcached+MySQL

后来,随着访问量的上升,几乎大部分使用 MySQL 架构的网站在数据库上都开始出现了性能问题,web 程序不再仅仅专注在功能上,同时也在追求性能。程序员们开始大量的使用缓存技术来缓解数据库的压力,优化数据库的结构和索引。开始比较流行的是通过文件缓存来缓解数据库压力,但是当访问量继续增大的时候,多台 web 机器通过文件缓存不能共享,大量的小文件缓存也带了了比较高的 IO 压力。在这个时候,Memcached 就自然的成为一个非常时尚的技术产品。

Memcached 作为一个独立的分布式的缓存服务器,为多个 web 服务器提供了一个共享的高性能缓存服务,在 Memcached 服务器上,又发展了根据 hash 算法来进行多台 Memcached 缓存服务的扩展,然后又出现了一致性 hash 来解决增加或减少缓存服务器导致重新 hash 带来的大量缓存失效的弊端。当时,如果你去面试,你说你有 Memcached 经验,肯定会加分的。

Mysql 主从读写分离

由于数据库的写入压力增加,Memcached 只能缓解数据库的读取压力。读写集中在一个数据库上让数据库不堪重负,大部分网站开始使用主从复制技术来达到读写分离,以提高读写性能和读库的可扩展性。Mysql 的 master-slave 模式成为这个时候的网站标配了。

分表分库

随着 web2.0 的继续高速发展,在 Memcached 的高速缓存,MySQL 的主从复制,读写分离的基础之上,这时 MySQL 主库的写压力开始出现瓶颈,而数据量的持续猛增,由于 MyISAM 使用表锁,在高并发下会出现严重的锁问题,大量的高并发 MySQL 应用开始使用 InnoDB 引擎 (行锁) 代替 MyISAM。同时,开始流行使用分表分库来缓解写压力和数据增长的扩展问题。这个时候,分表分库成了一个热门技术,是面试的热门问题也是业界讨论的热门技术问题。也就在这个时候,MySQL 推出了还不太稳定的表分区,这也给技术实力一般的公司带来了希望。虽然 MySQL 推出了 MySQL
Cluster 集群,但是由于在互联网几乎没有成功案例,性能也不能满足互联网的要求,只是在高可靠性上提供了非常大的保证。

MySQL 的扩展性瓶颈

在互联网,大部分的 MySQL 都应该是 IO 密集型的,事实上,如果你的 MySQL 是个 CPU 密集型的话,那么很可能你的 MySQL 设计得有性能问题,需要优化了。大数据量高并发环境下的 MySQL 应用开发越来越复杂,也越来越具有技术挑战性。分表分库的规则把握都是需要经验的。虽然有像淘宝这样技术实力强大的公司开发了透明的中间件层来屏蔽开发者的复杂性,但是避免不了整个架构的复杂性。分库分表的子库到一定阶段又面临扩展问题。还有就是需求的变更,可能又需要一种新的分库方式。

MySQL 数据库也经常存储一些大文本字段,导致数据库表非常的大,在做数据库恢复的时候就导致非常的慢,不容易快速恢复数据库。比如 1000 万 4KB 大小的文本就接近 40GB 的大小,如果能把这些数据从 MySQL 省去,MySQL 将变得非常的小。

关系数据库很强大,但是它并不能很好的应付所有的应用场景。MySQL 的扩展性差(需要复杂的技术来实现),大数据下 IO 压力大,表结构更改困难,正是当前使用 MySQL 的开发人员面临的问题。

NOSQL 的优势

易扩展

NoSQL 数据库种类繁多,但是一个共同的特点都是去掉关系数据库的关系型特性。数据之间无关系,这样就非常容易扩展。也无形之间,在架构的层面上带来了可扩展的能力。

大数据量,高性能

NoSQL 数据库都具有非常高的读写性能,尤其在大数据量下,同样表现优秀。这得益于它的无关系性,数据库的结构简单。一般 MySQL 使用 Query Cache,每次表的更新 Cache 就失效,是一种大粒度的 Cache,在针对 web2.0 的交互频繁的应用,Cache 性能不高。而 NoSQL 的 Cache 是记录级的,是一种细粒度的 Cache,所以 NoSQL 在这个层面上来说就要性能高很多了。

灵活的数据模型

NoSQL 无需事先为要存储的数据建立字段,随时可以存储自定义的数据格式。而在关系数据库里,增删字段是一件非常麻烦的事情。如果是非常大数据量的表,增加字段简直就是一个噩梦。这点在大数据量的 web2.0 时代尤其明显。

高可用

NoSQL 在不太影响性能的情况,就可以方便的实现高可用的架构。比如 Cassandra,HBase 模型,通过复制模型也能实现高可用。

总结

NoSQL 数据库的出现,弥补了关系数据(比如 MySQL)在某些方面的不足,在某些方面能极大的节省开发成本和维护成本。

MySQL 和 NoSQL 都有各自的特点和使用的应用场景,两者的紧密结合将会给 web2.0 的数据库发展带来新的思路。让关系数据库关注在关系上,NoSQL 关注在存储上。

NoSQL 的分类

NoSQL 仅仅是一个概念,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 数据库类型的划分并不是绝对,只是从存储模型上来进行的大体划分。它们之间没有绝对的分界,也有交差的情况,比如 Tokyo Cabinet / Tyrant 的 Table 类型存储,就可以理解为是文档型存储,Berkeley DB XML 数据库是基于 Berkeley DB 之上开发的。

NoSQL 还是关系数据库

虽然 09 年出现了比较激进的文章《关系数据库已死》,但是我们心里都清楚,关系数据库其实还活得好好的,你还不能不用关系数据库。但是也说明了一个事实,关系数据库在处理 WEB2.0 数据的时候,的确已经出现了瓶颈。

那么我们到底是用 NoSQL 还是关系数据库呢?我想我们没有必要来进行一个绝对的回答。我们需要根据我们的应用场景来决定我们到底用什么。

如果关系数据库在你的应用场景中,完全能够很好的工作,而你又是非常善于使用和维护关系数据库的,那么我觉得你完全没有必要迁移到 NoSQL 上面,除非你是个喜欢折腾的人。如果你是在金融,电信等以数据为王的关键领域,目前使用的是 Oracle 数据库来提供高可靠性的,除非遇到特别大的瓶颈,不然也别贸然尝试 NoSQL。

然而,在 WEB2.0 的网站中,关系数据库大部分都出现了瓶颈。在磁盘 IO、数据库可扩展上都花费了开发人员相当多的精力来优化,比如做分表分库(database sharding)、主从复制、异构复制等等,然而,这些工作需要的技术能力越来越高,也越来越具有挑战性。如果你正在经历这些场合,那么我觉得你应该尝试一下 NoSQL 了。

选择合适的 NoSQL

如此多类型的 NoSQL,而每种类型的 NoSQL 又有很多,到底选择什么类型的 NoSQL 来作为我们的存储呢?这并不是一个很好回答的问题,影响我们选择的因素有很多,而选择也可能有多种,随着业务场景,需求的变更可能选择又会变化。我们常常需要根据如下情况考虑:

数据结构特点。包括结构化、半结构化、字段是否可能变更、是否有大文本字段、数据字段是否可能变化。

写入特点。包括 insert 比例、update 比例、是否经常更新数据的某一个小字段、原子更新需求。

查询特点。包括查询的条件、查询热点的范围。比如用户信息的查询,可能就是随机的,而新闻的查询就是按照时间,越新的越频繁。

NoSQL 和关系数据库结合

其实 NoSQL 数据库仅仅是关系数据库在某些方面(性能,扩展)的一个弥补,单从功能上讲,NoSQL 的几乎所有的功能,在关系数据库上都能够满足,所以选择 NoSQL 的原因并不在功能上。

所以,我们一般会把 NoSQL 和关系数据库进行结合使用,各取所长,需要使用关系特性的时候我们使用关系数据库,需要使用 NoSQL 特性的时候我们使用 NoSQL 数据库,各得其所。

举个简单的例子吧,比如用户评论的存储,评论大概有主键 id、评论的对象 aid、评论内容 content、用户 uid 等字段。我们能确定的是评论内容 content 肯定不会在数据库中用 where content=’’查询,评论内容也是一个大文本字段。那么我们可以把 主键 id、评论对象 aid、用户 id 存储在数据库,评论内容存储在 NoSQL,这样数据库就节省了存储 content 占用的磁盘空间,从而节省大量 IO,对 content 也更容易做 Cache。

// 从 MySQL 中查询出评论主键 id 列表  
commentIds=DB.query( SELECT id FROM comments where aid= 评论对象 id  LIMIT 0,20  
// 根据主键 id 列表,从 NoSQL 取回评论实体数据  
CommentsList=NoSQL.get(commentIds);

NoSQL 代替 MySQL

在某些应用场合,比如一些配置的关系键值映射存储、用户名和密码的存储、Session 会话存储等等,用 NoSQL 完全可以替代 MySQL 存储。不但具有更高的性能,而且开发也更加方便。

NoSQL 作为缓存服务器

MySQL+Memcached 的架构中,我们处处都要精心设计我们的缓存,包括过期时间的设计、缓存的实时性设计、缓存内存大小评估、缓存命中率等等。

NoSQL 数据库一般都具有非常高的性能,在大多数场景下面,你不必再考虑在代码层为 NoSQL 构建一层 Memcached 缓存。NoSQL 数据本身在 Cache 上已经做了相当多的优化工作。

Memcached 这类内存缓存服务器缓存的数据大小受限于内存大小,如果用 NoSQL 来代替 Memcached 来缓存数据库的话,就可以不再受限于内存大小。虽然可能有少量的磁盘 IO 读写,可能比 Memcached 慢一点,但是完全可以用来缓存数据库的查询操作。

规避风险

由于 NoSQL 是一个比较新的东西,特别是我们选择的 NoSQL 数据库还不是非常成熟的产品,所以我们可能会遇到未知的风险。为了得到 NoSQL 的好处,又要考虑规避风险,鱼与熊掌如何兼得?

现在业内很多公司的做法就是数据的备份。在往 NoSQL 里面存储数据的时候还会往 MySQL 里面存储一份。NoSQL 数据库本身也需要进行备份(冷备和热备)。或者可以考虑使用两种 NoSQL 数据库,出现问题后可以进行切换(避免出现 digg 使用 Cassandra 的悲剧)。

总结

本文只是简单的从 MySQL 和 NoSQL 的角度分析如何选择,以及进行融合使用。其实在选择 NoSQL 的时候,你可能还会碰到关于 CAP 原则,最终一致性,BASE 思想的考虑。因为使用 MySQL 架构的时候,你也会碰到上面的问题,所以这里没有阐述。

http://www.infoq.com/cn/news/2013/11/introducing-nosql

列簇存储

面向列的 DBMS 是这样一种数据库管理系统,它将数据表存储为数据列而非行的形式。从物理上来说,表是列的集合,每一列从本质上来说都是只有一个字段的表。这些数据库通常用于分析系统、商业智能与分析型数据存储。

优点:

可以比较数据,因为在表的一列中,数据通常都是同种类型的。

可以通过便宜、性能一般的硬件实现高速的查询性能;由于压缩的原因,相对于关系型数据库来说,这种方式磁盘上的数据所占据的空间要少 5 到 10 倍。

缺点:

通常没有事务。

对于熟悉传统 RDBMS 的开发者来说存在不少限制。

典型代表:

HBase

Cassandra

Accumulo

Amazon SimpleDB

键值存储

你可以通过这种数据库将键值对存储到持久化存储中,随后使用键来读取值。那么对于这种初看起来用途非常有限的解决方案来说有哪些好处呢?在根据键来保存 / 读取值时,系统是非常高效的,因为它没有 SQL 处理器、索引系统以及分析系统等诸多限制。这种解决方案提供了最高效的性能,代价最低的实现以及可伸缩性。

优点:

RDBMS 太慢了,SQL 游标的负担过于沉重。

采用 RDBMS 的解决方案来存储少量数据的代价有些大。

没必要使用 SQL 查询、索引、触发器、存储过程、临时表、表单以及视图等等。

由于其轻量级的设计,键值数据库可以很容易实现可伸缩性以及高性能。

缺点:

关系型数据库的限制可以从底层就确保数据的完整性,而键值存储就没有这些限制,数据的完整性是由应用来控制的。在这种情况下,数据的完整性可能会由于应用代码的错误而做一些妥协。

在 RDBMS 中,如果模型设计良好,那么数据库的逻辑结构就能完全反映出存储数据的结构,并且与应用的结构有所不同(数据是独立于应用的)。对于键值存储来说,要想取得这种效果是非常困难的事情。

典型代表:

Amazon DynamoDB

Riak

Redis

LevelDB

Scalaris

MemcacheDB

Kyoto Cabinet

文档存储

文档存储指的是用于存储、搜索与管理面向文档的信息(半结构化数据)的程序,其中心概念就是文档。具体的面向文档数据库的实现是不同的,不过总的来说,他们都会以各种标准化格式对数据(文档)进行封装与加密,主要格式有 XML、YAML、JSON、BSON、PDF 等等。

优点:

足够灵活的查询语言。

易于水平扩展。

缺点:

在很多时候原子性是得不到保障的。

典型代表:

MongoDB

Couchbase

CouchDB

RethinkDB

图型数据库

图型数据库指的是使用图结构的数据库,通过结点、边与属性来表示和存储数据。根据定义,图型数据库是一种提供了无需索引而彼此邻接的存储系统。这意味着每个元素都包含了直接指向邻接元素的指针,因此没必要再通过索引进行查找了。

优点:

对于关联数据集的查找速度更快。

可以很自然地扩展为更大的数据集,因为他们无需使用代价高昂的连接运算符。

缺点:

RDBMS 可以用在更为通用的场景下,图型数据库只适合类似于图的数据。

典型代表:

Neo4j

FlockDB

InfoGrid

OrientDB

多模数据库

这些数据库包含了多种数据库的特性。

有两种不同的产品分组可以认为是多模的:

支持多种数据模型和用例的多模数据库。比如说,ArangoDB 宣称它拥有键值存储的好处,同时还提供了面向文档以及图型数据库的支持。

支持多种模式的通用目的的数据库。比如说,Oracle 的 MySQL 5.6 支持 SQL 方式的访问,也可以通过 Memcached API 实现键值访问。

典型代表:

ArangoDB

Aerospike

Datomic

http://coolshell.cn/articles/7270.html

要开始讨论数据建模技术,我们不得不或多或少地先系统地看一下 NoSQL 数据模型的成长的趋势,以此我们可以了解一些他们内在的联系。下图是 NoSQL 家族的进化图,我们可以看到这样的进化:Key-Value 时代,BigTable 时代,Document 时代,全文搜索时代,和 Graph 数据库时代:(陈皓注:注意图中 SQL 说的那句话,NoSQL 再这样发展下去就是 SQL 了,哈哈。)

NoSQL Data Models

首先,我们需要注意的是 SQL 和关系型数据模型已存在了很长的时间,这种面向用户的自然性意味着:

最终用户一般更感兴趣于数据的聚合显示,而不是分离的数据,这主要通过 SQL 来完成。

我们无法通过人手工控制数据的并发性,完整性,一致性,或是数据类型校验这些东西的。这就是为什么 SQL 需要在事务,二维表结构(schema)和外表联合上做很多事。

另一方面,SQL 可以让软件应用程序在很多情况下不需要关心数据库的数据聚合,和数据完整性和有效性进行控制。而如果我们去除了数据一致性,完整性这些东西,会对性能和分布存储有着重的帮助。正因为如此,我们才有数据模型的进化:

Key-Value 键值对存储是非常简单而强大的。下面的很多技术基本上都是基于这个技术开始发展的。但是,Key-Value 有一个非常致命的问题,那就是如果我们需要查找一段范围内的 key。(陈皓注:学过 hash-table 数据结构的人都应该知道,hash-table 是非序列容器,其并不像数组,链接,队列这些有序容器,我们可以控制数据存储的顺序)。于是,有序键值
(Ordered Key-Value)数据模型被设计出来解决这一限制,来从根本上提高数据集的问题。

Ordered Key-Value 有序键值模型也非常强大,但是,其也没有对 Value 提供某种数据模型。通常来说,Value 的模型可以由应用负责解析和存取。这种很不方便,于是出现了 BigTable 类型的数据库,这个数据模型其实就是 map 里有 map,map 里再套 map,一层一层套下去,也就是层层嵌套的 key-value(value 里又是一个 key-value),这种数据库的 Value 主要通过“列族”(column
families),列,和时间戳来控制版本。(陈皓注:关于时间戳来对数据的版本控制主要是解决数据存储并发问题,也就是所谓的乐观锁,

Document databases 文档数据库   改进了 BigTable 模型,并提供了两个有意义的改善。第一个是允许 Value 中有主观的模式(scheme),而不是 map 套 map。第二个是索引。 Full Text Search Engines 全文搜索引擎可以被看作是文档数据库的一个变种,他们可以提供灵活的可变的数据模式(scheme)以及自动索引。他们之间的不同点主要是,文档数据库用字段名做索引,而全文搜索引擎用字段值做索引。

Graph data models 图式数据库   可以被认为是这个进化过程中从 Ordered Key-Value 数据库发展过来的一个分支。图式数据库允许构建议图结构的数据模型。它和文档数据库有关系的原因是,它的很多实现允许 value 可以是一个 map 或是一个 document。

以上是“关系数据库和 nosql 的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注丸趣 TV 行业资讯频道!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-15发表,共计8262字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)