Skip to content

Latest commit

 

History

History
67 lines (35 loc) · 7.09 KB

七周七数据库.md

File metadata and controls

67 lines (35 loc) · 7.09 KB

七周七数据库

Eric Redmond Jim R.Wilson

内容提要

我们要面对和使用的数据正在变得越来越庞大和复杂。如果说数据是新的石油。那么数据库就是油田、炼油厂、钻井和油泵。作为一名现代的软件开发者,我们需要了解数据管理的新领域,既包括RDBMS,也包括NoSQL。

作者访谈

ElasticSearch是分布式的、对等的、支持REST/JSON的文档搜索引擎。ElasticSearch采用分布式的Lucene索引作为核心,允许REST客户端根据模糊的条件查找文档。每个人都需要一个搜索引擎,ElasticSearch让这一点变得容易了。

第1章 概述

包括一个关系数据库(Postgres),两个键-值存储数据库(Riak和Redis),一个面向列的数据库(HBase),两个面向文档的数据库(MongoDB和CouchDB),以及一个图数据库(Neo4j)。

● 驱动力是什么?数据库不是凭空产生的。它们是为了解决实际使用中提出的问题。在RDBMS(关系数据库管理系统)出现的环境中,数据库查询的灵活性比灵活的模式更重要。另一方面,建立面向列的数据库是为了适于存储跨多机的大量数据,而数据之间的关系退居次要地位。我们将介绍使用每个数据库的场景和相关的例子。

PostgreSQL久经沙场,它是迄今为止我们介绍的最古老和最健壮的数据库。PostgreSQL符合SQL标准,之前曾使用过关系数据库的人都会觉得熟悉它,这为我们将使用的其他数据库提供了一个坚实的比较基础。

因为KV存储库对资源的要求非常少,所以这种数据库类型在一些场景中有令人难以置信的高性能,但是当你有复杂的查询和聚合需求时,它一般不会有帮助。

第3章介绍的Riak不仅仅是一个键-值存储库,它从一开始就支持HTTP和REST等Web方式。它严格实现了亚马逊Dynamo的原理,具有一些高级功能,如解决冲突的向量时钟。Riak中的值可以是任何内容,从纯文本到XML到图像数据,而键之间的关系由称为链接(link)的命名结构处理。Riak是本书中知名度较小的数据库,但它越来越受欢迎,在我们将要讨论的数据库中,它是第一个通过mapreduce支持高级查询的数据库。

哈希,以及基本消息模式,如发布-订阅和阻塞队列。它是查询机制最健壮的KV存储库之一。在写入磁盘之前先写入内存缓存,Redis因此获得了惊人的性能,代价是在出现硬件故障的情况下,增加了数据丢失的风险。这一特性使得它适合用于缓存非关键数据,或作为消息代理。

文档可以包含嵌套的结构,因此,它们表现出了高度的灵活性,允许有可变域。

MongoDB的设计目标是支持巨大的数据(名字mongo是从单词humongous中提取的)。Mongo服务器的配置试图保持一致性:如果你写入了什么内容,随后的读取将得到相同的值(直到下次更新)。这一特性吸引了那些具有RDBMS背景的人。它也提供了一些原子读写操作(如递增一个值),以及对嵌套文档结构的深层查询。MongoDB利用JavaScript作为查询语言,支持简单的查询和复杂的mapreduce工作。

图数据库的真正实力是按照关系遍历节点。

第2章 PostgreSQL

联接本质上是以某种方式联接两个独立的表,并返回一张结果表

对于PostgreSQL这样的关系数据库来说,分区不是强项。如果需要水平扩展而不是垂直扩展(多个并行的数据库而不是单个强大的机器或集群),可能最好寻找别的解决方案。如果数据要求过于灵活,不是很容易融入关系数据库严格的数据模式要求,或者不需要一个完整的数据库功能带来的开销,需要进行非常大量的键值对读写操作,或只需要存储二进制大对象数据,那么其他的数据存储技术可能更好。

第3章 Riak

Riak是一种分布式的键-值(key-value)数据库。其中,值可以是任何类型的数据,如普通文本、JSON、XML、图片,甚至视频片段;而所有这些都可以通过普通的HTTP接口访问。你有什么,Riak就能存什么。

Riak将任何数据都另存为二进制编码的值,与普通的HTTP并无不同。MIME类型的意义在于赋予二进制数据上下文——目前为止,我们只处理了普通文本类型。MIME类型存储于Riak服务器上,而对于客户端,它们实际上则是一个标志,以便客户端下载二进制数据后,它知道渲染成何种类型。

作为在多个节点上执行并行任务的算法框架,mapreduce的普及是Google对计算机科学最大的持久贡献之一。mapreduce最早在Google相关主题的开创性论文中描述,并成为分区容忍性数据存储库中,执行自定义查询的有用工具。 mapreduce会把问题分解为两部分。一,通过map()方法,将一列数据转换成另一不同类型的一列数据。二,通过reduce()函数,将map()方法所生成的那列数据转换成一个或者多个标量值。这种模式允许系统将任务分成更小的组件任务,然后跨大规模集群服务器并行运行这些任务。

第4章 HBase

在架构方面,HBase的设计初衷是能够容错。对于单个机器,硬件故障可能不常见,但对于大型集群,节点故障是常态。通过预写式日志(write-ahead logging)和分布式配置,HBase能够快速地从单个服务器故障中恢复。

第5章 MongoDB

MongoDB就是他希望在DoubleClick时拥有的数据库,那时他是DoubleClick的CTO,需要保存大规模的数据,又要能满足自由定义的查询。

第6章 CouchDB

CouchDB是基于JSON与REST的面向文档的数据库,且堪称该类型数据库的经典。CouchDB的第一次发布是在2005年,该版本的设计考虑了Web,可随之而来的却是无数的缺陷、错误、故障与瑕疵。所幸的是,CouchDB最终发展为极其健壮的数据库,为其他大部分数据库所不及。相比其他系统只能容忍偶发的网络中断,CounchDB甚至能在网络仅偶尔可用时,开足马力正常运作。

第7章 Neo4j

Neo4j的重点是数据间的关系,而非数据集合间的共性(比如,文档集合或者数据行组成的表)。在这种方式下,Neo4j能以自然而直接的方式存储多变的数据。

Neo4j很小,小到足以嵌入几乎任何应用程序。另一方面,它能够存储数百亿的节点与相同数量的边。并且,一旦有了集群支持,在多个服务器间实现主从副本,Neo4j几乎能处理任何规模的问题。

第8章 Redis

可以通过使用BSD的netcat(nc)命令,你可能会发现许多UNIX机器上已经安装了这条命令,一次性流入我们自己的字符串。使用netcat,我们必须明确地以CRLF结束一行(telnet隐含就是这样做的)。echo命令完成后,我们还要睡眠一秒种,给Redis服务器一些时间返回。一些nc实现有-q选项,从而不需要睡眠,但不是所有的nc实现都是这样,所以请自由尝试一下。