状态: 已弃用
本文介绍了不再受支持的 Ubuntu 版本。 如果您当前正在运行运行 Ubuntu 12.04 的服务器,我们强烈建议您升级或迁移到受支持的 Ubuntu 版本:
原因: Ubuntu 12.04 已于 2017 年 4 月 28 日终止生命周期 (EOL) and no longer receives security patches or updates. This guide is no longer maintained.
请参阅: 本指南可能仍可用作参考,但可能不适用于其他 Ubuntu 版本。 如果可用,我们强烈建议使用为您正在使用的 Ubuntu 版本编写的指南。 您可以使用页面顶部的搜索功能来查找更新的版本。
介绍
大量应用程序需要数据库后端来存储和高效查询数据。 虽然传统上,关系数据库管理系统一直是最流行的,但非关系模型正在迅速获得牵引力。
RethinkDB 是一个有趣的非 SQL 数据库,它专注于在编程环境中的易用性。 RethinkDB 是一个易于配置的 JSON 文档存储数据库,可以轻松扩展。
使 RethinkDB 易于与编程语言一起使用的一个特性是它支持强大的客户端驱动程序。 这些允许您使用编程语言的大部分熟悉语法与数据库进行交互。
在本指南中,我们将在 Ubuntu 12.04 VPS 上安装和配置 RethinkDB。 我们将使用 Python 客户端驱动程序与它进行交互,以演示如何使用本机或接近本机的编程结构访问其查询语言。
安装
需要安装两个组件才能充分利用 RethinkDB 设计。 首先是数据库本身。 第二个是客户端驱动程序,它支持从您选择的编程语言中访问数据库。
我们将在这里介绍这两个组件。
安装 RethinkDB 数据库软件
RethinkDB 软件不在 Ubuntu 12.04 的默认存储库中。 幸运的是,该项目通过维护自己的 PPA(个人包存档)使其易于安装。
要将 PPA 添加到 Ubuntu 12.04,我们必须首先安装 python-software properties
包,其中包含我们需要的命令。 更新包索引,然后安装它:
sudo apt-get update sudo apt-get install python-software-properties
现在我们已经安装了软件属性包,我们可以添加 RethinkDB 项目的 PPA。 键入以下内容以将此存储库添加到我们的系统:
sudo add-apt-repository ppa:rethinkdb/ppa
现在,我们需要更新我们的包索引以收集有关我们可用的新包的信息。 之后,我们就可以安装 RethinkDB 软件了:
sudo apt-get update sudo apt-get install rethinkdb
我们现在有可用的数据库软件并且可以访问它的功能。
安装 Python 客户端驱动程序
虽然我们已经安装了数据库本身,但我们现在应该安装数据库系统的客户端驱动程序。 根据您选择的编程语言,客户端驱动程序有许多选项。
官方支持的语言是 JavaScript、Ruby 和 Python。 社区还增加了对更多语言的支持,包括 C、Clojure、Lisp、Erlang、Go、Haskell、Java、Perl、PHP、Scala 等。
在本指南中,我们将使用 Python 客户端驱动程序,因为我们的系统上已经安装了 Python。 我们将使用 Python 包管理器 pip
安装客户端驱动程序。
为了在处理 Python 软件时遵循一些建议的最佳实践,我们将使用 virtualenv
来隔离我们的 Python 环境。 该软件包包含 pip 作为依赖项。
sudo apt-get install python-virtualenv
现在我们已经安装了 virtualenv 和 pip,我们可以在我们的主文件夹中创建一个目录来安装我们的虚拟环境:
cd ~ mkdir rethink
切换到目录,然后使用 virtualenv 命令创建新的虚拟环境结构:
cd rethink virtualenv venv
我们可以通过键入以下内容来激活环境:
source venv/bin/activate
这将允许我们在隔离的环境中安装组件,而不会影响我们系统的程序。 如果我们需要离开环境(现在不要这样做,因为我们需要环境),输入:
deactivate
现在我们启用了虚拟环境,我们可以通过键入以下命令安装 RethinkDB 包:
pip install rethinkdb
我们的 Python 客户端驱动程序现已安装并可以使用。
启动 RethinkDB 并探索 Web 界面
要开始探索 RethinkDB 系统,我们将启动一个服务器并使用内置的 Web 界面探索它。
从命令行,我们可以使用以下格式启动服务器实例:
rethinkdb --bind all
--bind all
参数是必要的,以便您的实例可以从服务器本身外部访问。 由于我们是从远程 VPS 运行的,因此这是一个必要的补充。
如果我们访问我们的 droplet 的 IP 地址,然后是 :8080
,我们将看到 RethinkDB Web 界面:
your_server_ip_address :8080
如您所见,我们为数据库服务器提供了丰富的接口。
我们可以在主视图中看到一些标准的健康检查和一些集群性能指标。 在页面下方,会显示最近记录的活动。
我们还看到了一些关于我们数据库的统计数据。 在蓝色图标旁边,界面告诉我们数据库的名称,以及是否检测到任何问题。
此外,您可以看到 RethinkDB 对服务器和数据中心有着原生的理解。 这是因为 RethinkDB 是从头开始构建的,易于扩展和分发。
如果我们点击页面顶部的“表格”链接,我们可以看到我们添加到数据库中的任何表格:
从这里,我们可以看到我们服务器中的所有数据库。 在每个数据库中,我们可以看到已创建的表。 该概述还告诉我们为每个组件配置的分片和复制。
我们还可以从此视图添加数据库和表。
如果我们单击单个表,我们可以看到负载、分布和文档计数的概览:
我们可以在此处查看有关每个表的负载和配置的更多详细信息。 我们可以编辑分片和复制设置并添加索引以更有效地查询。
移动到顶部的下一个链接,我们可以看到可用于我们的数据库和表的服务器。
从这里,我们可以管理和添加数据库,这是将单独的服务器组合在一起的方式。 如果您在不同的物理位置部署服务器,这是一种跟踪一切位置的简单方法。 更改与服务器关联的数据中心也非常容易。
再次,您可以单击单个服务器以获取其属性的概述:
转到下一个链接,标题为“数据资源管理器”,我们将获得一个界面,通过该界面使用查询语言与服务器进行交互:
我们可以在这个界面中创建、删除和修改表和数据。
如果我们输入查询或命令,我们可以看到下面的结果。 我们可以查看各种格式的信息,还可以执行查询配置文件以查看数据库如何决定返回它所做的结果:
如您所见,我们有一个很好的工具来对我们的数据库和集群进行高级管理。
在 Python 中与 RethinkDB 交互
尽管 Web 界面干净且易于使用,但在大多数情况下,它可能不是您与数据库交互的方式。 大多数数据库都是在程序中使用的。
在后台启动您的服务器
如果您不熟悉管理后台进程,我们将简要说明如何在后台启动您的服务器,以便您继续在终端中工作。
您可以通过在终端中按“Ctrl-C”来关闭服务器。 然后,您可以在后台重新启动它,以便您可以通过以下方式重新启动终端来访问终端:
rethinkdb --bind all &
&
在后台启动进程并允许您继续工作。
另一种选择是不终止初始服务器进程并简单地暂停服务器,然后在后台恢复它。 您可以通过键入“Ctrl-Z”来执行此操作。
之后,通过键入以下内容在后台恢复该过程:
bg
您可以随时通过键入以下内容查看该过程:
jobs
[1]+ Running rethinkdb --bind all &
如果您需要再次将任务带到前台(可能在完成后将其杀死),您可以键入:
fg
然后该任务将再次在前台可用。 如果您有多个后台进程,则可能需要使用以下格式引用作业编号:
fg % 数量
一旦您的服务器进入后台,我们就可以开始通过 Python 探索数据库。
用 Python 探索 RethinkDB 系统
启动 Python 解释器,以便我们可以开始与数据库交互:
python
从这里,我们只需要将客户端驱动程序导入环境:
import rethinkdb as r
我们现在可以使用 connect 命令连接本地数据库:
r.connect("localhost", 28015).repl()
最后的 .repl()
允许我们对所形成的连接调用命令,而无需在 .run()
调用中明确指定连接。 这是为了方便在这样的测试情况下使用。
现在,我们已经连接到我们的服务器,我们可以立即开始使用数据库。
我们可以通过键入以下内容来创建一个数据库来使用:
r.db_create("food").run()
我们现在有一个名为“食物”的数据库。 最后链接的 .run()
命令非常重要。 RethinkDB 命令看起来像本地代码,但它们实际上是由 RethinkDB 客户端驱动程序转换为本地数据库代码并在服务器上远程执行的。
运行命令将其发送到服务器。 如果我们没有将 .repl()
命令添加到初始服务器连接,我们将不得不在运行命令中列出连接对象,如下所示:
conn = r.connect("localhost", 28015) r.db_create("food").run(conn)
这些前几个命令让您大致了解命令链接如何与 RethinkDB 一起工作。 可以创建复杂的命令来一次执行多个操作。 这允许您创建可读的、顺序的命令链,这些命令链都被一次翻译并发送到数据库,而不是多次调用。
现在我们有了一个数据库,让我们创建一个表:
r.db("food").table_create("favorites").run()
然后我们可以向表中添加一些数据。 RethinkDB 使用灵活的模式设计,因此您可以添加任何类型的键值对。 我们将添加一些人,然后添加他们最喜欢的食物:
r.db("food").table("favorites").insert([ { "person": "Randy", "Age": 26, "fav_food": [ "banana", "cereal", "spaghetti" ] }, { "person": "Thomas", "Age": 8, "fav_food": [ "cookies", "apples", "cake", "sandwiches" ] }, { "person": "Martha", "Age": 52, "fav_food": [ "grapes", "pie", "avocado" ] } ]).run()
这将在我们的“收藏夹”表中创建三个 JSON 文档。 每个对象都定义了一个人、一个年龄和一个包含该人最喜欢的食物的数组。
我们可以通过查询来打印文档。 为此,我们只需要请求数据库和表,服务器将返回一个可迭代对象,然后我们可以循环处理该对象。
服务器将在处理称为游标的对象时不断地发出数据。 例如,我们可以通过键入以下内容打印所有内容:
c = r.db("food").table("favorites") for x in c: print x
{u'person': u'Martha', u'Age': 52, u'fav_food': [u'grapes', u'pie', u'avocado'], u'id': u'b888ec64-f2c9-4f85-9db6-f8b8a66626c6'} {u'person': u'Thomas', u'Age': 8, u'fav_food': [u'cookies', u'apples', u'cake', u'sandwiches'], u'id': u'3aa7ae68-85b0-48b6-9726-76e810ea4c55'} {u'person': u'Randy', u'Age': 26, u'fav_food': [u'banana', u'cereal', u'spaghetti'], u'id': u'f027a270-d5ac-4c33-ad91-53a7541ace82'}
这将依次打印每一行。 在我们的示例中,由变量“c”表示的游标对象在处理时由服务器提供新数据。 这允许快速执行代码。
您可能已经注意到,我们添加到“收藏夹”表中的每条记录都有一个 ID。 这是自动完成的,用于索引每个表的内容。
我们可以通过在命令链中添加另一个链接来过滤结果:
c = r.db("food").table("favorites").filter(r.row["fav_food"].count() > 3).run() for x in c: print x
{u'person': u'Thomas', u'Age': 8, u'fav_food': [u'cookies', u'apples', u'cake', u'sandwiches'], u'id': u'3aa7ae68-85b0-48b6-9726-76e810ea4c55'}
如您所见,我们只是添加了一个 .filter()
命令。 我们使用 r.row
来引用“fav_food”键,然后计算每行的条目数。 我们做了一个简单的比较,以过滤掉那些最喜欢的食物不超过 3 种的人。
结论
如您所见,我们可以轻松自然地操作 RethinkDB 系统中的数据。 RethinkDB 引以为豪的是,从开发的角度来看,它既简单又不牺牲轻松无缝扩展的能力。
本指南仅涵盖基础知识,旨在向您介绍使用 RethinkDB 的一些方法。 如果您正在考虑在生产环境中使用它,那么探索系统的扩展和复制功能及其数据库感知网络功能可能会很有用。