介绍
Apache CouchDB,类似Redis,Cassandra和MongoDB,是一个NoSQL数据库。CouchDB将数据存储为JSON文档,这些文档本质上是非关系的。这允许CouchDB的用户以与其真实世界对应物非常相似的方式存储数据。
您可以从命令行或名为Futon的Web界面管理CouchDB。Futon可用于执行管理任务,如为CouchDB创建和操作数据库,文档和用户。
目标
到本文结束时,您将:
- 在运行Ubuntu 14.04的腾讯云CVM上安装CouchDB
- 将Futon安装在同一台服务器上
- 已经确保了CouchDB的安装
- 使用安全隧道从本地计算机使用Futon访问CouchDB
- 知道如何将管理员用户添加到CouchDB
- 使用Futon使用CouchDB执行CRUD操作
- 从命令行使用CouchDB执行CRUD操作
准备
请完成以下准备:
- Ubuntu 14.04 腾讯云CVM,没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器。
- 以具有管理权限的非root用户身份登录到服务器
注意:虽然本教程假设非root用户,但您也可以以root
用户身份执行以下步骤,以防您不想创建sudo用户。请注意,如果您使用的是非root用户,则在第一次使用sudo
权限执行命令时会要求您输入密码。
第1步 - 准备服务器
在我们安装CouchDB之前,我们需要确保为它设置服务器。
首先更新系统:
代码语言:javascript复制sudo apt-get update
安装允许您管理源存储库的软件:
代码语言:javascript复制sudo apt-get install software-properties-common -y
注意:-y
标志告诉apt-get
命令假定Yes
响应安装过程中可能出现的所有提示。如果您希望手动响应提示,则可以删除此标志。
添加PPA将帮助我们从相应的存储库中获取最新的CouchDB版本:
代码语言:javascript复制sudo add-apt-repository ppa:couchdb/stable -y
警告:在向服务器添加新的个人包存档(PPA)时应特别小心。由于任何人都可以创建PPA,因此不能保证它可以被信任或者它是安全的。在这种情况下,上述PPA是官方的,由Apache CouchDB团队维护。
现在我们已经添加了一个新的PPA,让我们更新系统,以便它具有最新的包信息:
代码语言:javascript复制sudo apt-get update
我们现在准备安装CouchDB和Futon。
第2步 - 安装CouchDB
如果您以前在此服务器上安装了CouchDB,请先删除现有版本:
代码语言:javascript复制sudo apt-get remove couchdb couchdb-bin couchdb-common -yf
注意:如果您有新的腾讯云CVM,则可以忽略此步骤。
现在安装CouchDB:
代码语言:javascript复制sudo apt-get install couchdb -y
这将在您的服务器上安装CouchDB和Futon。
默认情况下,CouchDB在localhost上运行并使用端口5984。您可以通过curl
从命令行运行来检索此基本信息:
curl localhost:5984
注意:如果尚未安装curl
,则可以使用sudo apt-get install curl
命令进行安装。
你应该得到类似于以下内容:
代码语言:javascript复制{"couchdb":"Welcome","uuid":"b9f278c743b5fc0b971c4e587d77582e","version":"1.6.1","vendor":{"name":"Ubuntu","version":"14.04"}}
您现在可以使用curl -X PUT
命令创建新数据库:
curl -X PUT localhost:5984/new_database
结果应如下所示:
代码语言:javascript复制{"ok":true}
第3步 - 确保CouchDB安装的安全
默认情况下,安装CouchDB时创建的某些文件和目录属于root用户和组。虽然在开发过程中这很好(虽然不可取),但在生产中可能存在安全风险。
安装CouchDB时,它会创建一个用户和名为couchdb的组。在本节中,我们将CouchDB文件的所有权和权限更改为couchdb用户和组。
更改所有权控制什么 CouchDB的进程可以访问和更改权限控制谁可以访问CouchDB的文件和目录。
在更改所有权和权限之前,请停止CouchDB:
代码语言:javascript复制sudo stop couchdb
更改/usr/lib/couchdb
,/usr/share/couchdb
,/etc/couchdb
目录和/usr/bin/couchdb
可执行文件的所有权,使得它们的主人是CouchDB的,他们属于CouchDB的组。
sudo 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的安装),而没有其他用户访问这些文件和目录。
sudo chmod -R 0770 /usr/lib/couchdb /usr/share/couchdb /etc/couchdb /usr/bin/couchdb
剩下要做的就是重启CouchDB:
代码语言:javascript复制sudo start couchdb
CouchDB的现在应该启动和运行没有任何文件或属于任一目录的根用户或根组。
第4步 - 访问Futon
CouchDB提供了一个方便的基于Web的控制面板,名为Futon。我们将从您的本地工作站访问它,通过SSH连接将流量隧道连接到您的服务器。这意味着只有具有SSH登录服务器的用户才能访问Futon控制面板。
要安全地连接到CouchDB,而不公开,可以从本地端口5984到远程服务器的端口5984创建SSH隧道。
您可以使用以下命令从本地计算机运行以设置隧道:
代码语言:javascript复制ssh -L5984:127.0.0.1:5984 sammy@your_server_ip
注意:请记住使用您的用户名替换sammy,并使用您的腾讯云CVM的IP地址替换your_server_ip。
当连接打开时,您可以使用端口5984从您喜欢的Web浏览器访问Futon。访问此URL以显示有用的Futon页面:
代码语言:javascript复制http://localhost:5984/_utils
默认情况下,访问Futon的所有CouchDB用户都具有管理权限。这是在右下角宣布的:
您可以通过单击“ 修复此链接”并创建新管理员来更改此设置。
第5步 - 添加管理员用户
现在我们已经启动并运行CouchDB,让我们开始使用它。
在创建管理员用户之前,所有用户都可以使用管理权限访问CouchDB(尽管他们首先需要SSH访问服务器)。
为CouchDB创建管理员帐户是一种很好的做法,可以防止意外或未经授权的数据丢失。
要执行此操作,请单击Futon右下角显示的“ 修复此链接”。这将打开一个允许您创建CouchDB管理员用户的屏幕,如下所示:
输入所需的用户名和密码:
输入新的CouchDB用户名和安全密码后,单击“ 创建”按钮。这将创建新的管理员用户。Futon右下角的消息将通过显示类似于以下内容的消息来确认:
注意:创建管理员用户可防止未经授权的用户删除和修改数据库,设计文档和CouchDB配置。但是,它不会阻止它们创建或访问文档。
小心分发对服务器的SSH访问权限。
至此,我们的CouchDB服务器现已完全配置。
要了解有关使用数据库的更多信息,请继续阅读。
从Futon执行CRUD操作
Futon有一个非常简单但有用的用户界面,允许您执行基本的CRUD操作(创建,读取,更新和删除)。
在本节中,我们将创建一个名为todos
的新数据库,向其中添加新文档,然后检索,更新和删除此文档。
注意:如果您已创建管理员用户,则必须以管理员身份登录才能创建新数据库。
确保您仍然打开SSH隧道。如果没有,请使用以下命令从本地计算机打开与服务器的连接:
代码语言:javascript复制ssh -L5984:127.0.0.1:5984 sammy@your_server_ip
让我们首先再http://localhost:5984/_utils/
上访问Futon页面。
注意:本节假定使用SSH隧道访问CouchDB,该隧道的设置如上面的“ 访问被褥”部分所述。如果您的设置不同,请确保您使用正确的URL访问Futon。
创建数据库和文档
要创建一个名为todos
的新数据库,请单击屏幕上的“ 创建数据库”链接。这将显示如下对话框:
输入数据库的名称,然后单击“ 创建”按钮。
这将创建一个名为 todos
的新数据库,并将您带到一个页面,您可以在该页面中开始在新创建的数据库中创建和修改文档。
创建文档
要创建新文档,请单击页面上的“ 新建文档”链接。
这将打开一个带有新文档的屏幕。这份文件只有该_id
领域。如果需要,您可以更改此字段的值,或者您可以保留原样。
单击“ 添加字段”链接以向此文档添加新字段。
如上所示,我们添加了两个名为todo
和done
的字段。默认情况下,新字段具有null
值。
双击该值以更改它。
在这个例子中,我们双击todo
和done
的价值领域,并分别输入Task 1
和false
的值。
输入值后,ENTER
按键或单击字段旁边的绿色小复选标记以保存其内容。(如果不这样做会将字段的值保留为null
。)这应该如下所示:
要保存文档,请单击“ 保存文档”链接。保存文档后,您将看到_rev
已添加一个字段,如下所示:
阅读文件
单击todos
链接(在链接Overview
旁边的顶部栏中)以查看新创建的文档,作为todos
数据库中的唯一文档。
单击表中文档的键(ID)以访问文档详细信息页面。
编辑文档
在此页面上,您可以编辑和更新文档字段,如下所示:
要编辑字段值,请双击它并开始编辑。
您可以删除任何字段(除了_id
和_rev
字段),添加新字段或更改现有字段的值。在这个例子中,我们已将done
的值从false
修改为true
,如下:
对更改满意后,单击“ 保存文档”链接以更新文档。完成后,您会注意到该_rev
字段的值也已更新。
删除文档
要删除文档,可以单击“ 删除文档”链接,该链接将提示您进行确认:
按“ 删除”按钮确认。
Futon将删除文档并将您带到todos
数据库页面,该页面现在应为空,确认文档确实已被删除。
从命令行执行CRUD操作
本节将说明如何使用curl
命令行在CouchDB数据库上执行基本CRUD(创建,读取,更新和删除)操作。
确保您仍然打开SSH隧道。如果没有,请使用以下命令从本地计算机打开与服务器的连接:
代码语言:javascript复制ssh -L5984:127.0.0.1:5984 sammy@your_server_ip
注意:本节将使用上面步骤2(安装CouchDB)中创建的数据库new_database
。本节还假设我们正在使用SSH隧道访问CouchDB,如上面的Accessing Futon步骤中所述。如果您的设置不同,请确保在执行下面使用的命令时适当地替换URL,PORT和数据库名称。
创建数据库
如果您尚未创建数据库new_database
,请立即执行此操作。应从本地工作站执行此命令:
curl -X PUT http://localhost:5984/new_database -u "admin:password"
{"ok":true}
由于我们向CouchDB添加了管理员用户,因此我们现在必须在创建新数据库时发送管理员用户名和密码。
结果应如下所示:
代码语言:javascript复制{"ok":true}
创建文档
让我们从创建一个新文档开始。
代码语言:javascript复制curl -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文档。最后,包含JSON文档本身以及-d
标志。
该操作的响应如下:
代码语言:javascript复制{"ok":true,"id":"803da996e1524591ce773d24400004ff","rev":"1-2fc1d70532433c39c9f61480607e3681"}
此响应的"ok":true
部分表明操作成功。响应包括字段id
和rev
,分别代表文档ID和文档修订。如果需要修改或删除此文档,则需要这两个字段。
在此示例中,文档ID由CouchDB生成,因为我们没有为其提供命令。如果需要,我们可以创建一个具有我们生成的唯一ID的文档。
使用指定的ID创建
使用random_task
ID创建文档:
curl -X POST -d '{"_id":"random_task", "todo":"task 2", "done":false}' http://localhost:5984/new_database -H "Content-Type:application/json"
此命令创建ID设置为random_task
的新文档。对此命令的响应如下:
{"ok":true,"id":"random_task","rev":"1-bceeae3c4a9154c87db1649473316e44"}
创建多个文档
除了创建单个文档外,我们还可以批量创建文档。
代码语言:javascript复制curl -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
字段的对象。该字段包含要插入的文档数组。 - 插入单个文档时,POST请求被发送到指向数据库的URL(
http://localhost:5984/new_database
)。但是,批量插入请求会POST到http://localhost:5984/new_database/_bulk_docs
URL。
批量插入操作的响应如下:
代码语言:javascript复制[{"ok":true,"id":"803da996e1524591ce773d24400007df","rev":"1-778fd61f8f460d0c1df1bb174279489d"},{"ok":true,"id":"803da996e1524591ce773d2440001723","rev":"1-dc9e84861bba58e5cfefeed8f5133636"}]
阅读文件
从CouchDB数据库中检索文档很简单,只需发出HTTP GET命令即可。让我们尝试检索上面创建的一个名为random_task
的文档。
curl -X GET http://localhost:5984/new_database/random_task
请注意,URL包含正在检索的文档的ID(random_task
)。该GET请求的响应,如以下所示,包含与沿着整个文件_id
和_rev
字段,其可被用于更新或删除该文件。
Output{"_id":"random_task","_rev":"1-bceeae3c4a9154c87db1649473316e44","todo":"task 2","done":false}
编辑文档
在尝试更新文档时,包含该_rev
字段非常重要。CouchDB将拒绝任何不包含_rev
字段的更新请求。由于CouchDB更新整个文档,而不仅仅是部分文档,因此在更新操作期间必须在请求正文中发送整个文档。
要更新使用random_task
ID创建的文档,我们需要发出HTTP PUT请求,如下所示:
curl -X PUT -d '{"_rev":"1-bceeae3c4a9154c87db1649473316e44", "todo":"task 2", "done":true}' http://localhost:5984/new_database/random_task
请务必使用您在上一个输出中收到的字符串替换_rev
值。
这会修改文档并将done
字段更新为true
。对此请求的回复如下:
Output{"ok":true,"id":"random_task","rev":"2-4cc3dfb6e76befd665faf124b36b7f1c"}
从响应中可以看出,此特定文档的字段rev
在更新后会发生更改。此后任何更新或删除此文档的请求现在都必须使用最新rev
值。
删除文档
让我们使用这个新rev
值来使用HTTP DELETE请求删除此文档,如下所示:
curl -X DELETE http://localhost:5984/new_database/random_task?rev=2-4cc3dfb6e76befd665faf124b36b7f1c
就像上面的GET和PUT请求一样,DELETE请求使用指向文档的URL。但是,它还在URL中包含其他查询参数。此参数rev
应具有删除操作成功的最新值_rev
。
在这种特殊情况下,我们使用在上一步中的更新操作之后返回的值。对上述请求的回复如下所示。
代码语言:javascript复制{"ok":true,"id":"random_task","rev":"3-07d6cde68be2a559497ec263045edc9d"}
重新启动,停止和启动CouchDB服务
启动,停止和重新启动CouchDB服务非常简单。从服务器完成这些步骤。
重新开始
要重新启动正在运行的CouchDB实例,请执行以下命令:
代码语言:javascript复制sudo restart couchdb
此命令将重新启动正在运行的CouchDB实例并显示新实例的进程ID。如果没有运行CouchDB的实例,执行此命令将给出类似的消息:
代码语言:javascript复制Outputrestart: Unknown instance:
停止
要停止正在运行的CouchDB实例,请执行以下命令:
代码语言:javascript复制sudo stop couchdb
执行此命令将停止任何正在运行的CouchDB实例,并提供如下确认消息:
代码语言:javascript复制couchdb stop/waiting
开始
要启动CouchDB,请执行以下命令:
代码语言:javascript复制sudo start couchdb
如果CouchDB尚未运行,执行此命令将启动CouchDB并提供如下确认消息:
代码语言:javascript复制couchdb start/running, process 12345
另一方面,如果已经运行了CouchDB实例,则执行上述命令将导致如下消息:
代码语言:javascript复制start: Job is already running: couchdb
状态
如果要检查CouchDB的状态,可以使用以下命令执行此操作:
代码语言:javascript复制sudo status couchdb
如果CouchDB正在运行,这将给出类似于以下内容的消息:
代码语言:javascript复制couchdb start/running, process 12345
如果CouchDB没有运行,检查状态将导致类似于:
代码语言:javascript复制couchdb stop/waiting
结论
您现在可以在腾讯云CVM上使用CouchDB进行全功能设置,您可以使用Futon或命令行从本地计算机安全地进行管理。
想要了解更多关于安装CouchDB和Futon的相关教程,请前往腾讯云 社区学习更多知识。
参考文献:《How To Install CouchDB and Futon on Ubuntu 14.04》