介绍
Apache CouchDB,像Redis,Cassandra和MongoDB一样,是一个NoSQL数据库。CouchDB将数据存储为具有非关系性质的JSON文档。
您可以从命令行或名为Futon的Web接口管理CouchDB,Futon可用于执行管理任务,例如创建和操纵CouchDB的数据库,文档和用户。
目标
到本文结束时,你将:
- 有 CouchDB 安装在运行 Ubuntu 14.04
- 有 Futon 安装在相同的服务器
- 有 CouchDB 安装
- 使用 Futon 访问 CouchDB 使用本地机器,使用安全隧道
- 知道如何将管理员添加到 CouchDB
- 使用 Futon 使用 CouchDB 执行 CRUD 操作* 从命令行 执行 CRUD 操作与 CouchDB
前提条件
请满足以下前提条件:
- Ubuntu 14.04 Droplet
- 您已登录到您的服务器作为具有管理权限的非根用户([Ubuntu 14.04 初始服务器设置])
<$>[注]
注: 虽然本教程假定非根用户,但您也可以作为根
用户执行下面的步骤,如果您不希望创建一个sudo用户,请注意,如果您使用的是非根用户,您将被要求在首次执行命令时使用sudo
。
步骤1:准备服务器
在我们能够安装CouchDB之前,我们需要确保服务器为此设置。
首先,更新系统:
1sudo apt-get update
安装允许您管理源存储库的软件:
1sudo apt-get install software-properties-common -y
<$>[注]
注: -y
旗指示 apt-get
命令假定对安装过程中可能出现的所有提示的响应是 Yes
。
添加 PPA 以帮助我们从适当的存储库中获取最新 CouchDB 版本:
1sudo add-apt-repository ppa:couchdb/stable -y
<$>[warning] 警告: 在将新的个人包存档案(PPA)添加到您的服务器时,应该非常小心。由于任何人都可以创建一个PPA,所以没有保证它可以信任或安全。
现在我们已经添加了一个新的PPA,让我们更新系统,以便它具有最新的包信息:
1sudo apt-get update
我们现在已经准备好安装CouchDB和Futon。
第2步:安装CouchDB
如果您以前在这个服务器上安装了 CouchDB,请开始删除现有版本:
1sudo apt-get remove couchdb couchdb-bin couchdb-common -yf
<$>[注] 注: 如果您有新鲜的Droplet,您可以忽略此步骤。
现在安装CouchDB:
1sudo apt-get install couchdb -y
这将安装CouchDB和Futon在您的服务器上。
默认情况下,CouchDB 运行在 localhost 上,并使用端口 ** 5984** . 您可以从命令行运行curl
来获取这些基本信息:
1curl localhost:5984
<$>[注] 注: 如果您没有安装‘curl’,您可以使用‘sudo apt-get install curl’命令来安装它。
你应该得到类似于以下的东西:
1[secondary_label Output]
2{"couchdb":"Welcome","uuid":"b9f278c743b5fc0b971c4e587d77582e","version":"1.6.1","vendor":{"name":"Ubuntu","version":"14.04"}}
您现在可以使用curl -X PUT
命令创建一个新的数据库:
1curl -X PUT localhost:5984/new_database
结果应该是这样的:
1[secondary_label Output]
2{"ok":true}
步骤 3 – 确保 CouchDB 安装
默认情况下,在安装 CouchDB 时创建的一些文件和目录属于 root 用户和组,虽然这在开发过程中是好的(虽然不建议),但可能在生产中构成安全风险。
当 CouchDB 安装时,它会创建一个名为 couchdb 的用户和组. 在本节中,我们将将 CouchDB 文件的所有权和权限更改为 ** couchdb** 的用户和组。
更改所有权控制 what 可访问 CouchDB 流程,更改权限控制 who 可访问 CouchDB 文件和目录。
在更改所有权和权限之前,请停止 CouchDB:
1sudo stop couchdb
更改/usr/lib/couchdb
,/usr/share/couchdb
和/etc/couchdb
目录的所有权,以及/usr/bin/couchdb
可执行文件,以便其所有者是 couchdb ,它们属于 ** couchdb** 组。
1sudo chown -R couchdb:couchdb /usr/lib/couchdb /usr/share/couchdb /etc/couchdb /usr/bin/couchdb
现在,更改 /usr/lib/couchdb
、 /usr/share/couchdb
和 /etc/couchdb
目录和 /usr/bin/couchdb
可执行文件的权限,以便 couchdb 用户和 ** couchdb** 组完全访问(CouchDB 安装),而没有其他用户可以访问这些文件和目录。
1sudo chmod -R 0770 /usr/lib/couchdb /usr/share/couchdb /etc/couchdb /usr/bin/couchdb
剩下的就是重新启动CouchDB:
1sudo start couchdb
CouchDB 现在应该在没有任何文件或目录的情况下运行,这些文件或目录都属于 root 用户或 ** root** 组。
步骤 4 – 访问 Futon
CouchDB 提供了一个方便的基于 Web 的控制面板,名为 Futon. 我们将从您的 本地工作站 访问它,通过 SSH 连接到您的服务器来隧道流量,这意味着只有在您的服务器上登录 SSH 的用户才能访问 Futon 控制面板。
要安全地连接到 CouchDB,而不让它公开可用,您可以从本地端口 5984 创建 SSH 隧道到远程服务器端口 5984。
您可以使用以下命令,从您的 本地计算机 运行,设置隧道:
1ssh -L5984:127.0.0.1:5984 sammy@your_server_ip
<$>[注] 注: 请记住用您的用户名和您的_server_ip 代替您的 Droplet 的 IP 地址。
虽然连接是开放的,你可以从你最喜欢的网页浏览器访问Futon,使用端口5984访问这个URL显示有用的Futon页面:
1http://localhost:5984/_utils
默认情况下,所有访问 Futon 的 CouchDB 用户都拥有管理权利。
您可以通过点击小 ** 修复此 ** 链接来更改这一点,并创建新的管理员。
步骤 5 – 添加 Admin 用户
现在我们有CouchDB并运行,让我们开始使用它。
在创建管理员用户之前,所有用户都可以使用管理权限访问 CouchDB(尽管他们首先需要 SSH 访问服务器)。
创建CouchDB的管理员帐户是很好的做法,以防止意外或未经授权的数据丢失。
要做到这一点,点击在Futon的右下角出现的 ** Fix this** 链接,这将带来一个屏幕,允许您创建一个CouchDB管理员用户,如下所示:
输入所需的用户名和密码:
输入新的 CouchDB 用户名和安全密码后,点击创建
按钮,创建新的管理员用户,Futon 右下角的消息将通过显示类似于以下的消息来确认这一点:
<$>[note] ** 注意:** 创建管理员用户可以防止未经授权的用户删除和修改数据库、设计文档和 CouchDB 配置。
请小心将 SSH 访问权限交给您的服务器。
我们的CouchDB服务器现在已完全配置。
要了解有关使用数据库的更多信息,继续阅读。
从Futon执行CRUD操作
Futon有一个非常简单但有用的用户界面,允许您执行基本的CRUD操作(创建,阅读,更新和删除)。
在本节中,我们将创建一个名为todos
的新数据库,添加一个新的文档,然后获取,更新和删除此文档。
<$>[注] 注: 如果您创建了一个管理员用户,则需要登录为管理员才能创建一个新的数据库。
请确保您的 SSH 隧道仍然打开,否则,请使用以下命令从您的本地计算机打开连接到服务器:
1ssh -L5984:127.0.0.1:5984 sammy@your_server_ip
首先,请访问 Futon 页面:http://localhost:5984/_utils/`。
<$>[注] ** 注意:** 本节假定 CouchDB 正在使用一个 SSH 隧道访问,该隧道是如上文中的 ** 访问 Futon ** 部分所描述的。
创建数据库和文档
要创建一个名为todos
的新数据库,请点击屏幕上的Create Database**
链接。
输入数据库的名称,然后点击创建
按钮。
这将创建一个名为todos
的新数据库,并将您带到一个页面,您可以在新创建的数据库中开始创建和修改文档。
- 创建文档 *
要创建新文档,请点击页面上的 新文档 链接。
这将打开一个新文档的屏幕. 此文档将只包含 _id
字段. 如果需要,您可以更改该字段的值,或者您可以将其留下。
点击添加字段
链接,将新字段添加到本文档中。
如上所示,我们已添加了两个名为全部
和完成
的字段,默认情况下,新字段具有零
值。
双击该值以更改它。
在本示例中,我们双击全部
和完成
值字段,然后分别输入任务 1
和错误
值。
输入值后,要么按ENTER
键,要么单击字段旁边的小绿色标记来保存其内容。
要保存文档,请点击保存文档
链接.文档保存后,您将看到一个_rev
字段已添加到它,如下:
阅读一份文件
点击todos
链接(在概览
链接旁边的顶部栏)以查看新创建的文档,作为todos
数据库中的唯一文档。
单击表中的文档密钥(ID),以访问文档详细信息页面。
编辑 文档
在此页面上,您可以编辑和更新文档字段如下:
若要编辑一个字段值,请双击它并开始编辑。
您可以删除任何字段(除了_id
和_rev
字段),添加新字段或更改现有字段的值。
一旦您对更改感到满意,请单击保存文档
链接来更新文档. 一旦您这样做,您将注意到_rev
字段的值也已更新。
删除一份文件
要删除文档,您可以点击删除文档
链接,该链接将提示您确认:
点击删除
按钮来确认。
Futon 会删除该文档并将您带到todos
数据库页面,该页面现在应该是空的,确认该文档确实已被删除。
从命令行执行 CRUD 操作
本节将说明如何在CouchDB数据库中使用curl
执行基本的CRUD操作(创建、阅读、更新和删除)。
请确保您的 SSH 隧道仍然打开,否则,请使用以下命令从您的本地计算机打开连接到服务器:
1ssh -L5984:127.0.0.1:5984 sammy@your_server_ip
<$>[注]
注: 本节将使用在上面的步骤 2(** Installing CouchDB** )中创建的数据库 new_database
。本节还将假定我们正在使用 SSH 隧道访问 CouchDB,如上面的步骤 ** Accessing Futon** 所描述。
创建一个数据库
如果您尚未创建数据库 new_database
,请现在这样做. 此命令应该从您的 本地工作站 执行:
1curl -X PUT http://localhost:5984/new_database -u "admin:password"
2{"ok":true}
由于我们已将管理员用户添加到 CouchDB,因此我们必须在创建新数据库时发送管理员用户名和密码。
结果应该是这样的:
1[secondary_label Output]
2{"ok":true}
创建一个文档
让我们从创建一个新的文件开始。
1curl -X POST -d '{"todo":"task 1", "done":false}' http://localhost:5984/new_database -H "Content-Type:application/json"
此命令在new_database
数据库中创建一个新文档。
-X
标志表明我们正在执行 HTTP POST 操作. -H
标志跟着标题将此请求的内容类型设置为 application/json
,因为我们正在发布 JSON 文档。
此操作的反应如下:
1[secondary_label Output]
2{"ok":true,"id":"803da996e1524591ce773d24400004ff","rev":"1-2fc1d70532433c39c9f61480607e3681"}
此响应的OK:true
部分表示操作成功. 响应包括id
和rev
字段,分别代表文档ID和文档修订。
在本示例中,CouchDB 生成了文档 ID,因为我们没有提供命令,如果需要,我们可以创建具有我们生成的唯一 ID 的文档。
** 使用指定 ID 创建**
创建一个 ID random_task
的文档:
1curl -X POST -d '{"_id":"random_task", "todo":"task 2", "done":false}' http://localhost:5984/new_database -H "Content-Type:application/json"
此命令会创建一个新的文档,其ID设置为random_task
。
1[secondary_label Output]
2{"ok":true,"id":"random_task","rev":"1-bceeae3c4a9154c87db1649473316e44"}
** 创建多个文档**
除了创建单个文档外,我们还可以大量创建文档。
1curl -X POST -d '{"docs": [{"todo":"task 3", "done":false}, {"todo":"task 4", "done":false}]}' http://localhost:5984/new_database/_bulk_docs -H "Content-Type:application/json"
此命令将创建两个文档,如 POST 体所指定的,与单个文档插件相比,有两点差异:
- 在插入单个文档时,POST 体只是一个标准的 JSON 对象。在大量插入的情况下,POST 体包含一个具有
docs
字段的对象。 这个字段包含要插入的文档的数组。 2。 插入单个文档时,POST 请求被发送到指向数据库的 URL(http://localhost:5984/new_database
)。 对于大量插入的请求,然而,POST 将被发送到http://localhost:5984/new_database/_bulk_docs
URL。
大量插入操作的响应如下:
1[secondary_label Output]
2[{"ok":true,"id":"803da996e1524591ce773d24400007df","rev":"1-778fd61f8f460d0c1df1bb174279489d"},{"ok":true,"id":"803da996e1524591ce773d2440001723","rev":"1-dc9e84861bba58e5cfefeed8f5133636"}]
阅读一份文件
从 CouchDB 数据库中获取文档是发出 HTTP GET 命令的一个简单问题,让我们尝试获取我们上面创建的文档之一:被称为随机_task
。
1curl -X GET http://localhost:5984/new_database/random_task
请注意,该 URL 包含正在检索的文档的 ID(random_task
)。 如下所示,对此 GET 请求的响应包含整个文档以及 _id
和 _rev
字段,可用于更新或删除此文档。
1[secondary_label Output]
2{"_id":"random_task","_rev":"1-bceeae3c4a9154c87db1649473316e44","todo":"task 2","done":false}
编辑 文档
在尝试更新文档时,重要的是包括_rev
字段。CouchDB 会拒绝任何不包含_rev
字段的更新请求。
要更新用ID random_task
创建的文档,我们需要发出以下 HTTP PUT 请求:
1curl -X PUT -d '{"_rev":"1-bceeae3c4a9154c87db1649473316e44", "todo":"task 2", "done":true}' http://localhost:5984/new_database/random_task
请确保将 _rev
值替换为您在上一个输出中收到的字符串。
这会更改文档,并将完成
字段更新为真
。
1[secondary_label Output]
2{"ok":true,"id":"random_task","rev":"2-4cc3dfb6e76befd665faf124b36b7f1c"}
正如答案所示,此特定文档的rev
字段在更新后会发生变化,未来更新或删除此文档的任何请求都必须使用最新的rev
值。
删除一份文件
让我们使用这个新的rev
值来使用以下 HTTP DELETE 请求删除此文档:
1curl -X DELETE http://localhost:5984/new_database/random_task?rev=2-4cc3dfb6e76befd665faf124b36b7f1c
与上面的 GET & PUT 请求一样,DELETE 请求使用指向文档的 URL. 但是,它还包含了 URL 中的额外查询参数。
在此特定情况下,我们使用在上一步更新操作后返回的值。
1[secondary_label Output]
2{"ok":true,"id":"random_task","rev":"3-07d6cde68be2a559497ec263045edc9d"}
重新启动、停止和启动 CouchDB 服务
启动、停止和重新启动 CouchDB 服务非常简单. 从 ** 服务器** 完成这些步骤。
重启
若要重新启动运行的 CouchDB 实例,请执行以下命令:
1sudo restart couchdb
此命令将重新启动正在运行的 CouchDB 实例并显示新实例的进程 ID。
1[secondary_label Output]
2restart: Unknown instance:
停止
要停止运行 CouchDB 实例,请执行以下命令:
1sudo stop couchdb
执行此命令将停止运行任何 CouchDB 实例,并提供如下确认消息:
1[secondary_label Output]
2couchdb stop/waiting
开始
要启动 CouchDB,请执行以下命令:
1sudo start couchdb
如果 CouchDB 尚未运行,执行此命令将启动 CouchDB,并提供如下确认消息:
1[secondary_label Output]
2couchdb start/running, process 12345
另一方面,如果有一个 CouchDB 实例已经运行,那么执行上述命令将导致这样的消息:
1[secondary_label Output]
2start: Job is already running: couchdb
状态
如果您想检查 CouchDB 的状态,您可以使用以下命令:
1sudo status couchdb
如果 CouchDB 正在运行,则会发出类似于以下的消息:
1[secondary_label Output]
2couchdb start/running, process 12345
如果 CouchDB 未运行,则检查状态会导致以下情况:
1[secondary_label Output]
2couchdb stop/waiting
结论
您现在在Droplet上有完全功能的CouchDB设置,您可以使用Futon或命令行从本地机器安全地管理。