Apache CouchDB資料庫,它類似於Redis,Cassandra和MongoDB,也是一個NoSQL資料庫。 CouchDB將資料儲存為非關係性的JSON文件。 這使得CouchDB的使用者可以以與現實世界相似的方式來儲存資料。
可以從命令列或一個叫作Futon的Web介面來管理CouchDB。 Futon可用於執行管理任務,如建立和操作CouchDB的資料庫,文件和使用者等。
在閱讀學習本文完後,您將學會以下知識:
請準備/完成以下兩個先決條件:
注意:本教學假設使用的是非root使用者,並可以執行root使用者許可權。請注意,如果您使用非root使用者,首次使用sudo執行命令時,系統將要求您輸入root使用者的密碼。
在安裝CouchDB之前,需要確保已經設定好了伺服器。
開始更新系統:
$ sudo apt-get update
安裝允許管理源儲存庫的軟體:
$ sudo apt-get install software-properties-common -y
注意:-y標誌告訴apt-get命令對安裝過程中可能出現的所有提示以Yes響應。 如果您喜歡手動響應提示,可以刪除此標誌。
新增PPA,以從相應的儲存庫獲取最新的CouchDB版本:
$ sudo add-apt-repository ppa:couchdb/stable -y
警告:在您的伺服器上新增一個新的個人包存檔(PPA)時,應該非常小心。 因為任何人都可以建立PPA,所以不能保證它是可信賴的,或者它是安全的。 在這種情況下,上述PPA是由Apache CouchDB團隊維護的官方PPA。
經過上一步,已經新增了一個新的PPA,接下來需要更新系統,使其具有最新的包資訊:
$ sudo apt-get update
現在可以安裝CouchDB和Futon了。
如果之前有在此伺服器上安裝過CouchDB,請先刪除現有版本,使用以下命令:
$ sudo apt-get remove couchdb couchdb-bin couchdb-common -yf
現在安裝CouchDB:
$ sudo apt-get install couchdb -y
這將在您伺服器上安裝CouchDB和Futon。
預設情況下,CouchDB在localhost上並使用埠5984執行,可以通過從命令列執行curl來檢索此基本資訊:
$ curl localhost:5984
注意:如果沒有安裝curl程式工具,可以使用sudo apt-get install curl命令進行安裝。
執行上面命令請求,應該得到類似於以下內容:
{"couchdb":"Welcome","uuid":"b9dsf278cfdas743b5fdfsaafd399fas7582e","version":"1.6.1","vendor":{"name":"Ubuntu","version":"14.04"}}
現在可以使用curl -X PUT命令建立一個新的資料庫:
curl -X PUT localhost:5984/new_database
執行後返回的響應結果如下 -
{"ok":true}
預設情況下,安裝CouchDB時建立的某些檔案和目錄屬於root使用者和組。 這在開發過程中雖然不錯,但這可能是生產中的安全風險。
安裝CouchDB時,它將建立一個使用者和一個名為couchdb的組。 在本節中,我們將把CouchDB檔案的所有權和許可權更改為couchdb使用者和組。
更改所有權控制CouchDB進程可以存取內容,並更改可以存取CouchDB檔案和目錄的許可權控制。
更改所有權和許可權之前,先停止CouchDB:
$ 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:
sudo start couchdb
CouchDB現在應該啟動並執行,而沒有任何屬於root使用者或root組的檔案或目錄。
CouchDB提供了一個基於Web的方便控制面板,它叫作:Futon。從本地伺服器存取它,將流量通過SSH連線隧道傳輸到您的伺服器。只有SSH登入到您的伺服器的使用者才能存取Futon控制面板。
要安全地連線到CouchDB(不用公開),您可以建立從本地埠5984到遠端伺服器埠5984的SSH隧道。
可以使用以下命令在本地計算機執行,以設定隧道:
$ ssh -L5984:127.0.0.1:5984 yiibai_user@your_server_ip
注意:請記住用您的使用者名替換yiibai_user,將your_server_ip替換為伺服器的IP地址。
連線開啟時,使用埠5984從Web瀏覽器存取Futon。存取此URL以顯示Futon頁面:
http://localhost:5984/_utils
預設情況下,存取Futon的所有CouchDB使用者都具有管理許可權。如在右下角所示:
可以通過點選修復此(Fix this)連結並建立新管理員來更改此內容。
現在已經啟動執行CouchDB,可以開始使用它了。
在建立管理員使用者之前,所有使用者都可以以管理許可權存取CouchDB(儘管它們首先需要SSH存取伺服器)。
為CouchDB建立管理員帳戶是一個很好的做法,以防止意外或未經授權的資料丟失。
要執行此操作,請單擊顯示在「Futon」的右下角的「修復此(Fix this)」連結。 這將顯示一個允許您建立CouchDB管理員使用者的螢幕,如下所示:
輸入使用者名和密碼:
輸入新的CouchDB使用者名和密碼後,單擊建立(Create)按鈕然後就建立新的管理員使用者。 Futon右下角的訊息將通過顯示類似於以下內容的訊息來確認:
注意:建立管理使用者可防止未經授權的使用者刪除和修改資料庫,設計文件和CouchDB組態。 但是,它不會阻止其它建立或存取文件。
就這樣,有關CouchDB伺服器現已完全組態。要了解有關使用資料庫的更多資訊,請繼續閱讀。
下面是一條美麗的分割線…
上面是一條美麗的分割線…
Futon有一個非常簡單但有用的使用者介面,用來執行基本的CRUD操作(建立,讀取,更新和刪除)。
在本節中,我們將建立一個名為todos的新資料庫,向其中新增一個新文件,然後檢索,更新和刪除此文件。
注意:如果您已建立管理員使用者,則必須以管理員身份登入才能建立新的資料庫。
要建立一個名為todos的新資料庫,請單擊螢幕的左上方的建立資料庫(Create Database)連結。 這將出現類似如下對話方塊:
輸入資料庫的名稱:todos,然後單擊建立按鈕。
這將建立一個名為todos的新資料庫,並轉到可以在新建立的資料庫中建立和修改文件的頁面。
建立文件
要建立新文件,請單擊頁面上的「新建文件(New Document)」連結。
這將開啟一個帶有新文件的螢幕。 這個文件預設只有_id欄位。 如果需要,您可以更改此欄位的值,也可以按原樣保留。
單擊新增欄位(Add Field)連結以向此文件新增新欄位。
如上所述,我們新增了兩個名為todo和done的欄位。 預設情況下,新欄位具有空(null)值。可通過雙擊該值以更改它。
在這個例子中,我們雙擊了todo和done的值欄位,並分別輸入了Task 1和false。
輸入值後,按ENTER鍵或點選欄位旁邊的小綠色複選標記來儲存內容(不這樣做會使該欄位的值為空)。這應該如下所示:
要儲存文件,請單擊「儲存文件(Save Document)」連結。 儲存文件後,您將看到已經新增了_rev欄位,如下所示:
單擊todos連結(在「概覽(Overview)」連結旁邊的頂部欄中)檢視新建立的文件,現在它是todos資料庫中的唯一文件。
單擊表格中的文件(ID)的鍵(紅色部分),以存取文件詳細資訊頁面。
在此頁面上,可以編輯和更新文件欄位,如下:
要編輯欄位值,可雙擊對應欄位並開始編輯。
您可以刪除任何欄位(除了_id和_rev欄位外),新增新欄位,或更改現有欄位的值。 在這個例子中,已經將done欄位的值從false更改為true,如下所示:
要刪除文件,可以單擊刪除文件連結,該連結將提示您進行確認:
按刪除(Delete)按鈕進行確認。
Futon將刪除文件並跳轉到todos資料庫頁面,該頁面中文件現在應為空,確認文件確實已被刪除。
本節將說明如何使用curl從命令列在CouchDB資料庫上執行基本的CRUD(建立,讀取,更新和刪除)操作。
如果您尚未建立資料庫new_database,請按照以下步驟現在來建立。 該命令應從安裝CouchDB資料庫的伺服器上執行:
curl -X PUT http://localhost:5984/new_database -u "admin:password" {"ok":true}
由於之前我們向CouchDB新增了管理員使用者,因此現在必須在建立新的資料庫時傳送管理員使用者名和密碼。
結果應如下所示:
{"ok":true}
我們先來建立一個新的文件,使用以下請求命令:
curl -X POST -d '{"todo":"task 1", "done":false}' http://localhost:5984/new_database -H "Content-Type:application/json"
此命令將在new_database資料庫中建立一個新文件。
-X標誌表示執行HTTP POST方法請求操作。 由於POST方法請求傳送一個JSON文件,所以後面的-H標誌將此請求的內容型別設定為application/json。 最後,包含了JSON文件本身,使用-d標誌。
此操作的響應結果如下:
{"ok":true,"id":"803da996e1524591ce773d24400004ff","rev":"1-2fc1d70532433c39c9f61480607e3681"}
此響應的部分"ok":true表示操作成功。 響應包括分別代表文件ID和文件修訂的欄位id和rev。 需要修改或刪除此文件時,才需要這兩個欄位。
在此範例中,文件ID由CouchDB生成,因為沒有提供該命令。 如果需要,可以建立一個具有生成唯一ID的文件。
建立一個ID為random_task的文件:
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"}
建立多個文件
除了建立單個文件,還可以批次建立文件。
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正文包含具有文件欄位的物件。 該欄位儲存要插入的文件陣列。
在插入單個文件時,POST請求已傳送到指向資料庫的URL(http://localhost:5984/new_database)。 但是,對批次插入請求,URL為:URL:http://localhost:5984/new_database/_bulk_docs。
批次插入操作的響應如下:
[{"ok":true,"id":"803da996e1524591ce773d24400007df","rev":"1-778fd61f8f460d0c1df1bb174279489d"},{"ok":true,"id":"803da996e1524591ce773d2440001723","rev":"1-dc9e84861bba58e5cfefeed8f5133636"}]
可通過發出HTTP GET命令來從CouchDB資料庫檢索文件。現在嘗試檢索上面建立的一個文件:一個叫random_task的檔案。
curl -X GET http://localhost:5984/new_database/random_task
請注意,URL包括正在檢索的文件的ID(random_task)。如下所示,對此GET請求的響應包含整個文件以及_id和_rev欄位,可用於更新或刪除此文件。
{"_id":"random_task","_rev":"1-bceeae3c4a9154c87db1649473316e44","todo":"task 2","done":false}
在要更新文件時,包含_rev欄位很重要。 CouchDB將拒絕任何不包含_rev欄位的更新請求。 由於CouchDB更新整個文件,而不僅僅是其中的一部分,所以在更新操作期間,必須在請求正文中傳送整個文件。
要更新使用ID為random_task的文件,我們需要發出HTTP PUT請求,如下所示:
curl -X PUT -d '{"_rev":"1-bceeae3c4a9154c87db1649473316e44", "todo":"task 2", "done":true}' http://localhost:5984/new_database/random_task
因為每個_rev值可能不太一樣,所以請確保將_rev值替換為上一個輸出中接收到的字串。
這將修改文件並將done欄位更新為true。 對此請求的響應如下:
{"ok":true,"id":"random_task","rev":"2-4cc3dfb6e76befd665faf124b36b7f1c"}
從響應中可以看出,該指定文件的rev欄位在更新後會發生更改。 任何將來更新或刪除此文件的請求現在都必須使用最新的rev值。
使用HTTP DELETE請求要指定包含這個新的rev值來刪除這個文件,如下所示:
curl -X DELETE http://localhost:5984/new_database/random_task?rev=2-4cc3dfb6e76befd665faf124b36b7f1c
就像上面的GET&PUT請求一樣,DELETE請求使用指向文件的URL。但是,它還包括URL中的附加查詢引數。 該引數rev應具有刪除操作成功的最新_rev值。
在這種特殊情況下,使用上一步中更新操作後返回的值。 對上述請求的響應如下所示。
{"ok":true,"id":"random_task","rev":"3-07d6cde68be2a559497ec263045edc9d"}
啟動,停止和重新啟動CouchDB服務是非常簡單的。下面我們來看看如何從伺服器完成這些步驟。
要重新啟動正在執行的CouchDB範例,請執行以下命令:
$ sudo restart couchdb
此命令將重新啟動正在執行的CouchDB範例並顯示新範例的進程ID。如果沒有CouchDB的範例執行,執行該命令會給出一個訊息:
$ restart: Unknown instance:
要停止執行的CouchDB範例,請執行以下命令:
$ sudo stop couchdb
執行此命令將停止任何正在執行的CouchDB範例,並提供如下所示的確認訊息:
$ couchdb stop/waiting
要啟動CouchDB,請執行以下命令:
$ sudo start couchdb
如果CouchDB尚未執行,則執行此命令將啟動CouchDB並提供如下所示的確認訊息:
$ couchdb start/running, process 12345
如果有CouchDB範例已經執行,那麼執行上面的命令就會產生一個這樣的訊息:
$ start: Job is already running: couchdb
如果想檢視CouchDB的狀態,可以使用以下命令:
$ sudo status couchdb
如果CouchDB正在執行,則會提供類似於以下內容的訊息:
$ couchdb start/running, process 12345
如果CouchDB沒有執行,檢視狀態將提示訊息如下:
couchdb stop/waiting
結束
您現在可以在伺服器上使用CouchDB的所有功能了,可以使用Futon或命令列從本地機器安全地管理CouchDB。
最後宣告:對伸手黨,需要注意的是:本教學包教不包會。