NoSQL和数据可扩展性

Posted IT技术精选文摘

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NoSQL和数据可扩展性相关的知识,希望对你有一定的参考价值。

介绍

本文提供了一个易于理解和有用的一组有关当前可用NoSQL数据库的信息。


可扩展数据架构

可扩展数据架构已发展用于提高整体系统效率并降低运营成本。 具体的NoSQL数据库可能具有不同的拓扑要求,但通用架构是相同的。

图1:NoSQL架构


一般来说,NoSQL架构提供:

       一系列一致性选项,而不仅仅是与关系数据库ACID的一致性

       高可用性,一些具有分区容忍(Cassandra)和一些具有ACID一致性(ArangoDB)

       商品硬件上的水平可扩展性,而不是依赖单个大型服务器(针对大量读取和查询进行了优化)

       许多已经有横向扩展/缩减的支持,用于动态配置的云环境

       分布式数据存储,具有四种不同的存储数据格式选项:键值,列型,文档和三重/图形

云就绪描述了数据库被用作服务以及将数据库软件部署到云提供商的能力。


NoSQL

NoSQL描述了具有内置复制支持的水平可扩展的非关系数据库。 应用程序通过简单的API与数据库进行交互,数据作为大文件或数据块存储在无架构的存储库中。 存储库通常是旨在支持具有高复制性的NoSQL操作的自定义文件系统。


NoSQL是“不仅仅是SQL”的缩写,它是指非关系数据可以从多个不同的查询机制中受益。 许多NoSQL数据库也支持关系系统的结构化查询语言(SQL)。 这对于从旧版软件平台进行访问非常有用,包括本地不支持NoSQL数据库的商业智能(BI)工具。


NoSQL数据库分类

NoSQL数据库有四种关键类型。 最简单的也是最快的,所以在使用键值存储时要进行功能的折中。 四种类型如下:

数据库分类 简单描述 产品例子
键值型 存储数据作为键值。 每秒可能有超过150万笔交易。 比较有用的,例如,用于高速访问网络广告。 一些支持更复杂的数据结构,包括列表,集合,计数器和map。 Amazon DynamoDB, Redis, Aerospike
列型 一个简单的行键,有许多列。 列属于命名列族。 同一列系列中的列存储在一起,使检索非常有用。 不同表格中的列之间没有关系。 HBase, Accumulo, Microsoft CosmosDB, Hypertable, Cassandra
文档型 存储层级的JSON数据。 有些支持XML和其他格式。 映射到编程语言的对象图。 开发人员最受欢迎的NoSQL数据库选项。 通常与搜索引擎配对以处理复杂的非结构化文本。 MongoDB, MarkLogic, CouchDB, Couchbase, ArangoDB, OrientDB, Microsoft CosmosDB, IBM Cloudant, Amazon DynamoDB
三重或图型 有向图中非常简单的结构。 每条数据都是三重 - 主题,谓词和对象。 这种技术支撑着语义网。 三重存储用于存储具有语义推论的信息网,而图形存储用于最小距离(例如路线规划应用)和其他图形遍历问题。 Neo4j, GraphDB, Allegrograph, MarkLogic, OrientDB, ArangoDB
混合型或多模型 支持两种或多种上述类型的数据。 最常见的配对是文档和三重/图形存储。

文档/三重: MarkLogic

文档/图形: OrientDB, ArangoDB

文档/列状: Microsoft CosmosDB

键值/文档: Amazon DynamoDB

虽然所有数据库类型都是通用的,由于在Web和移动内容处理的普通应用,文档型存储通常与NoSQL系统相关联。


NoSQL适合你吗?

你的应用程序设计是用于...


      需要处理不同的数据模式(schema),还是有不能控制的schema?

      需要高吞吐量?

      需要处理大量的数据?

      在数据一致性较弱的情况下工作良好,或在不同时间需要不同的一致性模型

      受益于直接对象 - 数据库实体映射?

      是可操作的,而不是批量(不同于Hadoop应用程序)?

如果从列表中检出了四个或更多的项目,那么NoSQL就适合你。


NoSQL权衡

NoSQL数据库的总拥有成本(TCO)往往比关系型数据库要低。 这主要是因为两件事情。 首先,许多NoSQL数据库都有一个开源的核心。


第二,它们可在商品硬件上进行水平扩展 - 即非常大的数据集不需要非常强大且非常昂贵的单个计算机。 相反,您可以使用多个小型计算机服务器,甚至更好地扩展到像亚马逊Web服务(AWS)这样的虚拟化云基础架构。


我汇集了几个数据点来说明权衡。 已经包含关系数据库用于比较。 请注意,这些显示了比较之间的相对分数而不是实际的绝对分数。


关系型 键值型 列状型 文档型 三重/图型
数据模型复杂度
数据模型应用广泛度
模式改变的容易程度 非常高 非常高
性能 非常高 高度可变 - 查询依赖
扩展成本

因架构而不同

已分片的: 低, 未分片的: 高

大容量操作的总体成本

因架构而不同

已分片的:中,未分片的:高

图2:复杂性和TCO


文档型和键值型存储是最受欢迎的,因为它们易于使用、灵活和具有合理的TCO来跨多问题域的适用性。


提示:图形数据库是复杂关系模型的优秀替代品,因为实体(或图形边缘)之间的关系比使用显式的Join和外键更有效,更适合于高性能应用程序。对于诸如最小距离或子图比较的计算复杂图遍历算法尤其如此。


提示:许多NoSQL供应商的咨询收入超过了其50%。请务必询问供应商的完整项目咨询成本,以便您对TCO进行最终分析。一些NoSQL数据库的咨询费用高达每天2000美元。 NoSQL供应商培训的系统集成(SI)合作伙伴是经验丰富且价格合理的顾问公司的良好来源。


要使用哪种数据模型?

图3中的流程图描述了如何为应用程序选择最合适的数据库或存储。

NoSQL和数据可扩展性

图3:选择正确的数据存储


混合或多模型数据库

许多NoSQL数据库正在朝着支持多种模式而发展。这意味着它们可能是键值存储,也支持存储和查询JSON文档,例如Amazon DynamoDB。


其他NoSQL数据库支持文档和图形或三重存储模型。其中包括MarkLogic Server,ArangoDB和OrientDB。


您所要做的选择主要取决于您如何查询数据,如图3所示。从您将要询问的数据的问题开始,然后查看最方便的存储模型,如单元格(或许是列族)或更多层次化的JSON文档。


如果有疑问,从一个简单的也支持二级索引的数据库结构开始。亚马逊DynamoDB是一个很好的候选数据库,因为它在其键值存储中原始地存储简单的JSON值,而且还提供了二次索引来拉回记录和数据概要,就像更复杂的文档存储一样。


云数据库

基于需求的扩展是在云上运行NoSQL系统; 它可以将运行应用程序的优势最大化,如基于云的提供商,如AWS,Microsoft Azure或Google Cloud。

      数据库即服务(DBaaS)提供即可使用的管理功能,将所有运营职责委托给提供商。

      托管的虚拟机数据库是在虚拟镜像上配置的,就像在内部一样,所有的操作责任属于用户。 所有NoSQL数据库都可以这样使用。

一些NoSQL数据库可用作云端友好的可即可使用的DBaaS。 其中一些例子如下:

       AWS上的Amazon DynamoDB

       Microsoft Azure上的Microsoft CosmosDB

       AWS上的MongoDB Atlas,Google Cloud(GCP)或Microsoft Azure

       在IBM Bluemix上的IBM Cloudant


NoSQL实践

本节将使用Amazon DynamoDB来说明关键的键值存储特征,包括实际使用案例和体系结构。文档数据库用例也简要介绍了DynamoDB,因为它存储了JSON值和二级索引,允许记录查询。


亚马逊DynamoDB

DynamoDB是一个键值NoSQL数据库,支持最终和强大的一致性。这是非常简单的使用服务,可以在笔记本电脑或Amazon Web Services(AWS)上的云中独立运行。


DynamoDB有很多用例,一般是键值存储:

       具有亚秒响应时间的web服务广告

       存储网站的用户首选项

       存储临时“会话”信息,如购物车

使用DynmoDB作为广告投放数据库的示例架构可以在https://media.amazonwebservices.com/architecturecenter/AWS_ac_ra_adserving_06.pdf找到


DynamoDB尤其适用于Web应用程序开发人员,因为它具有友好的API,包含Node.js,Java和其他语言的包装器。它还可以以Web应用程序友好的JSON格式存储和检索数据。


该数据可以像其他键值存储一样由行或分区键检索。您还可以添加二级索引来支持不同属性的查询。这些索引允许更复杂的查询机制。


DynamoDB的快速入门指南

这个快速入门指南是在Node.js教程中修改的Amazon DynamoDB版本。下面提供的版本是一个现实的Web应用程序,用于从DynamoDB搜索和检索电影信息并将其呈现在网页上。


这是任何Web应用程序的基本功能,并且应该允许您快速地为自己的应用程序启动和运行。


在本地运行DynamoDB

我们的第一步是下载DynamoDB的副本并在本地运行。在Amazon的网站上有一个非常简单的教程:http://docs.aws.amazon.com/amazondynamodb/latest/gettingstartedguide/GettingStarted.Download.html


您可以为您的平台下载.tar.gz or.zip,解压缩文件,然后执行该服务。这里假设您已经在本地安装了Java。


我创建了一个名为nodejs-dynamodb-sample的文件夹。您可以从我的GitHub页面下载完整的副本:https://github.com/adamfowleruk/nodejs-dynamodb-sample


点击“下载Zip”获取完整的存储库内容。


在这个文件中,我创建了一个名为“ext”的文件夹,该文件夹已经解压缩了DynamoDB文件。你现在应该这样做。


然后我创建了一个执行以下代码的shell脚本(Linux,Mac)和批处理文件(Windows): - 

     java -Djava.library.path =。/ DynamoDBLocal_lib -jar ./ext/DynamoDBLocal.jar -sharedDb -inMemory

为方便起见,您可以打开一个命令提示符,只需执行run-dynamodb-local.sh或.bat文件。

   注意:您可以在我的GitHub网站上找到所有代码。您必须自己下载DynamoDB并在运行这些文件之前将其解包到ext文件夹中。


使用Node.js Express创建Web应用程序

首先,您需要下载Node.js的DynamoDB SDK。 本教程假设您有一个工作的Node.js环境。 如果没有,请访问nodejs.org并下载最新版本。


首先,确保Express模块安装在系统上,全局。 这不是GitHub下载的一部分,所以你必须自己执行。

npm install -g express-generator

从GitHub下载示例应用程序,并解压缩。 现在打开命令提示符并移动到此文件夹:

cd nodejs-dynamodb-sample

现在输入:

npm安装

几分钟后,将会安装此应用程序的所有依赖关系文件。


运行示例应用程序

您现在将测试以确保您的Web应用程序安装有所有依赖关系并且正常工作。


从示例应用程序文件夹中输入:

DEBUG = express:* npm start

过了一会儿,你会看到“在3000端口上运行”


现在打开浏览器http// localhost:3000/


您将看到一个欢迎页面和两个搜索表单。这些表单将无法正常工作,因为我们需要为DynamoDB配置AWS访问。


配置AWS安全性

为了使用DynamoDB,您需要注册一个免费的AWS账户,并生成Access Key。


在这里注册一个AWS账号:https://aws.amazon.com


一旦注册并登录,搜索IAM服务并点击它。


IAM是AWS的身份和访问管理服务。您将需要创建一个用户,以便在S3中存储数据,然后在AWS上访问DynamoDB服务(我们现在在自己的计算机上使用本地服务)。


点击“创建个人IAM用户”,然后点击“管理用户”。


现在点击添加用户。使用逻辑用户名。


现在点击“下一步:权限”,然后点击“创建组”。


这将打开一个新窗口。使用“AmazonS3FullAccess”和“AmazonDynamoDBFullAccess”策略配置新的命名组。点击“创建组”。


返回浏览器中的“创建用户”窗口,然后单击“下一步:查看”,然后单击“下一步:完成”


在这里,您将看到您的访问密钥以及密钥。点击“显示”,然后将访问密钥和密钥都保存在安全的地方。完成后单击“完成”。


创建AWS访问的密钥文件


创建此文件

       Linux用户:〜/ .aws / credentials

       Windows用户:C:\Users\USER_NAME\.aws\credentials

现在采取访问密钥和密钥,并在此文件中添加如下:

       [默认]

      aws_access_key_id = <YOUR_ACCESS_KEY_ID>

      aws_secret_access_key = <YOUR_SECRET_ACCESS_KEY>

注意:您可以有多个配置。 为了简单起见,我们使用默认配置。


创建表

在命令提示符下,执行:

       node MoviesCreateTable.js

你应该看到这样的输出:

如果没有,您可能已经复制了错误的访问密钥和密钥,或者没有将S3 Full Access和DynamoDB完全访问策略添加到IAM用户的组。


加载数据

现在执行加载数据脚本,如下所示:node MoviesLoadData.js


这需要5-10秒加载,并将5000个电影加载到存储在内存中的新数据库中。


现在我们将再次从亚马逊教程中变化。我们将在您的Express Node.js Web应用程序中配置/电影URL。此页面将响应以下网址:

       GET / movies?year = 1985&title = A + View + to + a + Kill - 按年份和标题获取特定的电影

       POST /电影 - 使用DynamoDB中的键入字段列出特定年份的电影

现在您的安全性已经配置好了,你应该可以重新运行Node.js应用程序:DEBUG = express:* npm start

现在访问http://loalhost:3000 /输入'1985'和'A View to a Kill'(正确的大小写非常重要)到Get表单。单击Get。


请注意,只显示了一部电影


现在回到索引页面,并在搜索表单中输入一年。点击搜索。


Express使用Jade进行网页模板化。要查看发生的情况,请阅读以下文件:

      1. /movies的执行代码在./routes/movies.js中

      2.结果显示在./views/movies.jade中

请注意,在movies.js中配置了两条路由 - 一条GET路由和一条POST路由。每条路线都会有些不同。第一个获取特定的单个电影,第二个使用索引字段列出电影。


从这个基本的例子,您可以继续创建自己的应用程序。您可以使用DynamoDB:

       存储您的网站的用户信息和网站偏好

       存储游戏数据,高分

       商店购物车或其他临时数据

       更多,更多

有关更多详细信息,请阅读Amazon DynamoDB中Node.js文档的所有链接:

http://docs.aws.amazon.com/amazondynamodb/latest/gettingstartedguide/GettingStarted.NodeJs.html


将您的应用程序移动到已托管的DynamoDB上的AWS上

现在,我们将重新配置应用程序以使用在线DynamoDB服务而不是内存中的服务。这意味着您的数据将在您的应用程序执行之间保存,就像一个真实的Web应用程序。


警告:一旦您完成使用表格,请务必删除表格,否则如果超过自由层次使用,您可能会招致AWS主机和服务费用。


要将此应用程序移动到AWS,请首先在命令提示符下发出Ctrl + C关闭本地DynamoDB实例。


现在通过编辑./shared/aws-config.js重新配置您的Web应用程序


将URL从localhost:3000更改为https://dynamodb.eu-west-1.amazonaws.com. https://dynamodb.eu-west-1.amazonaws.com. https://dynamodb.eu-west- 1.amazonaws.com. https://dynamodb.eu-west-1.amazonaws.com。


注意:您可能需要使用us-west-2或其他区域标题而不是eu-west-1


现在因为我们使用不同的DynamoDB实例,我们需要重新创建表并加载项。再次执行这两个脚本:

      node MoviesCreateTable.js

        node MoviesLoadData.js


加载数据时可能会收到错误消息,因为我们正在加载超过默认吞吐量配额的5000个电影。 别担心这个。 一旦完成,或按Ctrl + C停止加载后,您将有足够的电影再次运行您的Web应用程序。


再次启动快速申请:

       DEBUG=express:* npm start

现在重新访问localhost:3000 并输入另一年,如1984年。


请注意,使用托管云版本的DynamoDB而不是本地版本,应用程序的响应速度更快。


监控使用和成本

您可以通过访问AWS上的DynamoDB控制台来查看您使用的存储空间。 在AWS管理控制台中,搜索DynamoDB服务。


点击表,你应该看到这样的列表。


通过点击“电影”,您可以在“物料”表中查看表格中的项目,访问应用程序的指标,并查看“容量”选项卡中的估计每月成本。


为确保我们不收取任何费用,请在创建表旁边的操作下单击删除表。 确认此操作。


本练习中的代码可以在我的GitHub页面上找到:https://github.com/adamfowleruk/nodejs-dynamodb-sample


概要

在本教程中,您了解到:


NoSQL数据库的4种不同类别

在哪里可以使用以及它们的优缺点

如何创建一个Node.js应用程序并在Cloud中使用Amazon DynamoDB

如何跟踪和管理云NoSQL的成本

以上是关于NoSQL和数据可扩展性的主要内容,如果未能解决你的问题,请参考以下文章

NoSql概述

NoSQL再次败北——坚持使用SQL的原因

NoSQL 数据库:何时使用 NoSQL 与 SQL?

redis学习--- NoSQL介绍

当可扩展性无关紧要时,NoSQL 与 SQL

数据源管理 | 分布式NoSQL系统,Cassandra集群管理