65.9K
CodeProject 正在变化。 阅读更多。
Home

开始使用 RavenDB 云数据库

2019 年 8 月 15 日

CPOL
viewsIcon

6562

快速、经济地启动 RavenDB 数据库。数分钟内即可创建高可用性数据库集群。立即在 cloud.ravendb.net 免费试用全新的 RavenDB Cloud。

RavenDB Cloud 是 RavenDB NoSQL 数据库 的创建者推出的一项新的数据库即服务。无需下载任何软件、进行端口转发或管理虚拟机:只需访问 cloud.ravendb.net 并启动 RavenDB 实例。

RavenDB 本身就是一个分布式数据库:虽然它可以作为单个服务器运行,但 Raven 的设计非常适合在集群中使用,即数据库的多个实例彼此同步,即使数据库服务器发生故障也能保持应用程序运行。RavenDB Cloud 在此基础上,可以非常轻松地启动数据库集群,使您的应用程序更具可伸缩性和弹性。

在本文中,我将引导您完成这两个过程。我们将首先在 RavenDB Cloud 中启动一个基本的单节点实例。然后,我将向您展示如何启动一个完整的集群。在此过程中,我们将从 ASP.NET Core Web 应用程序与数据库进行通信。现在开始吧!

启动(免费!)RavenDB Cloud 实例

RavenDB Cloud 提供免费实例。这对于试用和进行 Raven 的开发非常棒。在开发过程中,我也会将免费实例用作我的“本地”数据库;在 RavenDB Cloud 中启动实例并指向本地运行的应用程序非常容易。现在我们就来做这件事。

前往 cloud.ravendb.net 并点击“立即免费开始

您需要使用电子邮件地址进行注册,然后系统会询问您想要的域名。这将是您访问数据库的 URL。对于这篇 CodeProject 文章,我选择了一个合适的名称。

下一步是可选的:账单信息。如果您只是试用免费实例,可以点击“跳过账单信息”。现在我们看到了最终的信息摘要。点击“注册”,我们就可以开始了。

现在我们已注册,并将通过电子邮件收到登录链接。

我已收到一封包含一个神奇链接的电子邮件,点击该链接即可登录。点击该链接将带我进入我的 RavenDB Cloud 仪表板。

在这里,我们将创建一个新产品:我们的免费 RavenDB Cloud 实例。

您可能会问:“产品”在这里是什么意思——它只是一个数据库吗?产品在这里实际上是指一个或多个数据库所在的云服务器。例如,我们的免费实例中可以包含多个数据库,我们稍后就会看到。

我们将点击“添加产品”,然后系统会询问我们要创建什么,默认选项是免费实例。

如果我们在此屏幕上不更改任何内容,我们将创建一个免费实例,这非常适合我们当前的设置。

在继续之前,请注意,我们可以在 Amazon 或 Microsoft 的云中创建实例。我们还可以选择区域,例如 AWS 加拿大或 Azure 美国西部。

我们还可以选择层级:免费、开发或生产。对于我们在这里的第一个示例,我们将选择免费实例。

它仅限于单个节点——没有高可用性集群——10 GB 磁盘空间,运行在低端硬件上(2 vCPU 和 0.5 GB RAM)。这对于测试和小项目来说已经足够了;对于试用来说非常完美。我们将选择免费实例并点击下一步。

现在我们可以指定产品的显示名称;这是我们在仪表板上看到的内容。另外,您可以通过 IP 地址范围限制对数据库的访问。Raven 数据库默认使用客户端证书进行保护——我们稍后会详细讨论这些——因此限制 IP 地址范围的访问并非绝对必要,但可以增加额外的安全层。目前,我将 IP 地址范围保持对外开放。

我们将点击下一步,查看 RavenDB Cloud 产品的摘要,然后点击创建。

点击创建后,我就可以在我的仪表板上看到免费实例了。

在这里,您可以看到我们的免费实例正在 AWS 中启动,状态为黄色的“正在创建”。片刻之后,它将完成启动,您将看到产品变为绿色的“活动”状态。

恭喜!您已成功启动了免费的 RavenDB Cloud 实例。

我们要连接到此实例并创建一些数据库。我们可以通过代码来实现,但使用 RavenDB,我们也可以通过 Web 界面利用 Raven 内置的工具 Raven Studio 来实现。您会注意到实例的“URL”部分;这就是我们可以访问数据库服务器并创建数据库的 URL。

但是等等——这会不会有安全风险?如果您现在在浏览器中尝试访问 https://a.free.clistctrl.ravendb.cloud,系统会提示您提供安全证书。证书从哪里来?RavenDB Cloud 会为您生成一个,您可以通过“下载证书”按钮获取。

点击“下载证书”将下载一个包含 .pfx 文件的 zip 文件——这是我们访问数据库服务器所需的证书。

(是的,我真的为 WinRAR 的注册版本付费了)

您会在其中看到 2 个 .pfx 文件:一个带密码,一个不带密码。您可以随意使用其中任何一个,但为了我们的目的,我们将使用不带密码的那个。我将双击 _free.clistctrl.client.certificate.pfx_ 并一路点击下一步直到完成;无需特殊设置。

安装完证书后,我现在就可以使用仪表板上列出的 URL 安全地访问我的数据库了。

注意:如果您在安装证书之前尝试访问 URL,可能会遇到一个问题,即即使安装了证书,浏览器也不会提示您选择证书。如果发生这种情况,只需重启浏览器,或者在私密/隐身浏览器窗口中打开链接。

在 Chrome 中访问该 URL 会提示我选择一个证书。我将选择我们刚刚安装的 _free.clistctrl_。太棒了!我们已连接到我们的免费 RavenDB Cloud 实例。

我们现在看到的是 RavenDB 内置的工具 Raven Studio。您可以将 Raven Studio 视为 SQL Management Studio:我们可以在这里创建数据库、查看数据库中的数据、执行查询等。

我们的第一步是创建一个数据库。我将点击“数据库”->“新数据库”。我将将其命名为 **Outlaws**,我们将用它来存储西部荒野中那些精彩的神话人物。

点击之后,我们在 RavenDB Cloud 中就有了一个新的、正在运行的数据库——太棒了!

从例如 ASP.NET Core Web 应用程序连接到此数据库是什么样的?实际上非常简单。我现在就来做这件事,只是为了展示它的简单性。

虽然 RavenDB 为 .NET、JVM、Go、Python、Node.js 和 C++ 提供了官方客户端,但我对 C# 和 .NET 最熟悉,并且我认为 Raven 在 .NET Core 上表现最佳。因此,我在 Visual Studio 中创建了一个新的 ASP.NET Core Web 应用程序,然后添加了 RavenDB.Client NuGet 包

在我们的 _Startup.cs_ 中,我初始化了与 Raven 的连接。

var raven = new DocumentStore
{
    Urls = new[] { "https://a.free.clistctrl.ravendb.cloud" },
    Database = "Outlaws",
    Certificate = new X509Certificate2("\path\to\free.clistctrl.client.certificate.pfx", "")
};
raven.Initialize();

就是这样!我们现在可以将内容存储到数据库中了。

using (var session = raven.OpenSession())
{
    var outlaw = new Outlaw
    {
        Name = "Simmons, J.",
        IsGunslinger = true
    };
    session.Store(outlaw);
    session.SaveChanges();
}

同样,我们可以轻松地查询我们的对象。

using (var session = raven.OpenSession())
{
    var gunslingers = session.Query<Outlaw>().Where(o => o.IsGunslinger);
}

保存和查询都很容易——如果您是 Raven 的新手,我鼓励您查看很棒的学习资料,帮助您入门。

最后一点:您可以在 RavenDB Cloud 产品中启动多个数据库。在这种情况下,我们启动了一个免费实例并在其中创建了一个 Outlaws 数据库,但我们也可以根据需要在此免费服务器上启动其他数据库。由于免费层支持 10GB 磁盘空间,我们可以启动尽可能多的数据库,只要它们能装在 10GB 内。

在 RavenDB Cloud 中启动集群

我们刚刚完成了在 RavenDB Cloud 中设置免费实例、创建数据库以及连接到它、保存和查询数据的过程。

一切顺利。

但是,当您的数据库服务器发生故障时会发生什么——您的应用程序是否会停止工作?在我们的例子中,假设 AWS 或 Azure 发生了重大故障,我们的免费实例离线。结果是我们的应用程序将停止工作;它无法访问数据库。

RavenDB 的核心是一个**分布式**数据库:它被设计为在**集群**中运行**多个副本**。集群由 3 个或更多节点(数据库服务器实例)组成,所有数据库都在其中相互同步。如果一个节点发生故障,其他节点仍然可以工作,您的应用程序会自动切换到其中一个在线节点。我们称之为透明故障转移。当节点重新上线时,它离线期间发生的所有更改都会自动同步到它。

这一切的精彩之处在于,您无需付出额外的努力即可实现这一点——您只需将数据库设置为集群,Raven 就会处理其余的事情。好处是您的应用程序在面对故障时更具弹性:如果您的一个数据库节点发生故障,您的应用程序将继续运行。

现在我们来通过 RavenDB Cloud 尝试一下。

我们将回到 RavenDB Cloud 门户。我们已经有了 CodeProjectFree 产品。

让我们添加一个新产品,我们将其命名为 CodeProjectCluster。我将像以前一样点击“添加产品”,但这次,我们将指定“生产”层级,这将把我们的数据库设置为 3 节点集群。

您会注意到上面我们将层级设置为“生产”——这将把我们的数据库设置为集群。我们可以根据需要调整 CPU 优先级、集群大小和存储大小;在本例中,我们将保留这些为最小尺寸。

我们将点击下一步并像以前一样设置实例名称。点击完成,我们就可以开始使用了:在我们的仪表板上,我们现在看到集群正在创建。

请注意,虽然我们的 CodeProjectFree 实例包含一个 URL——只有一个节点——但我们的新 CodeProjectCluster 包含 3 个 URL,每个 URL 都是集群中的一个节点。第一个节点是节点 A,所以它的 URL 是 _a.cluster.clistctrl.ravendb.cloud_,第二个节点是节点 B,依此类推。

集群创建完成后,我将像以前一样下载并安装证书。

尽管我们有 3 个节点,但我们只有一个证书可以用于所有 3 个节点。下载并安装后,我就可以点击其中任何一个节点 URL。让我们试试第二个节点,节点 B,它位于 https://b.cluster.clistctrl.ravendb.cloud。该 URL 会将我带到节点 B 的 Raven Studio。

让我们在这个节点上创建一个新数据库。像以前一样,我将点击“数据库”->“新数据库”,我们将称之为 OldWestHeroes。

请注意,我们现在有一个 **复制因子** 为 3。这意味着我们的 OldWestHeroes 数据库将在所有 3 个节点之间进行复制(复制并自动同步)。点击“创建”后,数据库将被创建,我们将在节点上看到它。

但是,由于我们是在集群中运行,这个数据库也会自动在其他节点上创建。请注意,在数据库名称下方,我们看到节点 B、节点 C 和节点 A;Raven Studio 告诉我们这个数据库在所有 3 个节点上都已准备就绪。

点击 **管理组** 按钮,我们可以看到集群拓扑的视觉描述。

在右侧,我们可以看到所有 3 个节点都在相互复制。(如果任何节点离线,我们都会看到节点显示为红色并断开连接。)

此视觉效果告诉我们数据库在集群的所有 3 个节点上都正常工作。它还显示了正在进行的任务,例如自动备份,这些任务挂在负责该任务的节点上。您会注意到,“服务器端备份”任务挂在节点 A 上——RavenDB Cloud 会自动为我们创建此任务。数据库备份免费最多 1GB,超出部分每 GB/月 1 美元。

我们现在正在查看节点 B,但由于我们集群中的所有 3 个节点都在运行,我们应该能在任何其他节点上看到数据库。

我们来试试!我将访问节点 A,位于 https://a.cluster.clistctrl.ravendb.cloud。我们看到了什么?

是的!我们的 OldWestHeroes 数据库已在此节点上自动创建。由于这些节点是自动同步的,我们在一个节点上进行的任何更改都会自动显示在其他节点上。

我们来试试这个。在这里的节点 A 上,我将点击 OldWestHeroes 数据库,然后点击 **新文档**。我将创建一个新的 Cowboy 文档。

我将点击保存,我们的数据库现在就有一个 Cowboy 了。

而且,由于我们在集群中,所有其他节点现在都包含相同的文档。让我们转到节点 C,位于:https://c.cluster.clistctrl.ravendb.cloud

果然,我们的 Cowboy 文档就在那里。我可以编辑这位 Cowboy 并更改他的名字,当然,这些更改会同步到所有其他节点。

这如何改变我们的应用程序代码?回到我们的 C# Web 应用程序,我们的代码需要改变吗?

几乎不用!代码基本上与以前相同,但不是指定单个 URL,而是指定我们集群中所有节点的 URL。

// Connect to our RavenDB Cloud cluster. 
// Notice the only thing that has changed is that we're passing 3 URLs in, one for each node in our cluster.
var raven = new DocumentStore
{
    Database = "OldWestHeroes",
    Urls = new[] 
    {
        "https://a.cluster.clistctrl.ravendb.cloud",
        "https://b.cluster.clistctrl.ravendb.cloud",
        "https://c.cluster.clistctrl.ravendb.cloud",
    },                
    Certificate = new X509Certificate2("\path\to\cluster.clistctrl.client.certificate.pfx", "")
};
raven.Initialize();

在我们的 _Startup.cs_ 文件中,这段一次性的初始化代码是唯一需要更改的代码。应用程序的其余部分代码无需更改;我们仍然可以像往常一样编写对象并查询它们。

using (var session = raven.OpenSession())
{
    var cowboy = new Cowboy
    {
        Name = "Maunder, C.",
        FavoriteColor = "Orange"
    };
    session.Store(outlaw);
    session.SaveChanges();
}

查询也是如此。

using (var session = raven.OpenSession())
{
    var cowboys = session.Query<Cowboy>().Where(c => c.FavoriteColor == "Orange");
}

对我们的应用程序来说,好处是即使我们集群中的一些节点发生故障——例如,如果 Azure 发生故障——我们的应用程序仍然可以继续运行,并能透明地故障转移到集群中的其他节点。无需额外的代码!

摘要

在本文中,我展示了如何在 RavenDB Cloud 中快速启动一个免费数据库。我们演示了如何使用证书进行保护,以及如何从 C# Web 应用程序连接到它。它快速简便,非常适合试用。

我们还研究了更具生产级别的方案:在 RavenDB Cloud 中启动一个 3 节点集群。我们研究了集群中的数据库如何自动与所有节点同步。在一个节点上的任何更改都会自动快速地复制到其他节点。我们还研究了将 Web 应用程序从免费单节点实例更改为 3 节点集群所需的最少(2 行)代码。

与集群配合运行的应用程序在面对故障时更具弹性:即使集群中的某些节点发生故障,您的应用程序也会继续运行。Raven 允许读取和写入集群中的任何节点,从而在硬件故障或网络问题面前保持应用程序的运行。

RavenDB Cloud 让您能够快速轻松地在云中启动单个 RavenDB 实例或完整的生产集群。希望本文能帮助您了解它是什么以及为什么要使用它,我希望您今天就去尝试一下:cloud.ravendb.net

© . All rights reserved.