CouchDB學習-介紹


官方文檔

CouchDB

1文檔存儲

CouchDB服務器主機是一個存儲文檔的數據庫。每一個文檔在數據庫中都有唯一的名字。CouchDB提供RESTful HTTP API用來讀取和更新(添加,編輯,刪除)數據庫文檔。
文檔是CouchDB數據庫中的主要單元數據由任意字段和附件組成。文檔也包括由數據庫系統維護的元數據信息。文檔字段具有唯一的名字並且包含多種類型(文本,數字,布爾值,列表等)的值。並且文本大小或元素數量沒有限制。
CouchDB文檔更新模式是無鎖的並且優化的。由客戶端應用加載文檔進行文檔編輯,使用更新,最后存儲回數據庫。如果另一個客戶端編輯了相同的文檔並且首先保存了更新。那么客戶端將會在存儲時得到一個編輯沖突的錯誤。為了解決更新沖突,最新的文檔版本將會打開,編輯將重新應用並再次嘗試更新。
單個文檔更新(添加,編輯,刪除)是全有或者全沒有的,要么完全成功,要么完全失敗。數據庫不支持並行存儲或更新文檔。

2ACID屬性

CouchDB文件層和系統提交特性具有全部的原子性,一致性,隔離性和持久性(ACID)屬性。在硬盤中,CouchDB從不覆蓋提交的數據或者被連接的結構。確保數據庫文件總是保持一致性,這是一種“僅崩潰”設計,其中CouchDB服務器不執行關閉過程,而只是終止。
文檔更新(添加,編輯,刪除)是串行的,除了二進制字節的寫操作是並行的。數據庫讀取者從來不會被鎖住也不會寫操作完成或者其他讀者在讀時等待。任何數量的客戶端可以讀取文檔不需要加鎖或者是被並行的更新打斷即使是同一個文檔。CouchDB讀操作使用多版本並發控制(MVCC)模式。每一個客戶端從開始讀操作到結束看到的都是一致的數據庫快照。這意味着CouchDB可以保證每個文檔的事務語義。
文檔通過他們的名字和序列號通過B-trees進行索引。每一次更新到數據庫實例都會生成一個新的序列號。序列ID稍后用於在數據庫中增量查找更改。文檔存儲或刪除時B-tree索引也會同時進行更新。索引更新總是發生在文件(更新時只添加)最后。
文檔數據的優勢在於總是方便打包存儲而不是和眾多數據庫系統一樣分離成多個表和行。當文檔提交到硬盤中,文檔字段和元數據將序列化地一個文檔接着一個文檔(有助於稍后高效地構建視圖)打包進緩沖區。
當CouchDB文檔被更新后,所有的數據和相關的索引將被刷新到硬盤中總是以事務提交的方式使得數據庫保持一致狀態。提交通過兩個步驟進行:

  1. 所有的文檔數據和相關索引同步更新和刷新到硬盤。
  2. 更新后的數據庫頭以兩個連續的相同塊寫入,以構成文件的前4k,然后同步刷新到磁盤。

當在步驟一處系統崩潰或者電源被關閉,部分更新只是簡單的拋棄並重新啟動。如果崩潰發生在步驟二(頭部信息提交時),仍保留以前相同標頭的副本,以確保所有先前提交的數據的一致性。 除標題區域外,在崩潰或斷電后無需進行一致性檢查或修復。

3壓縮

通過偶爾壓縮來回收浪費的空間。 按計划,或者當數據庫文件超過一定數量的浪費空間時,壓縮過程會將所有活動數據克隆到新文件中,然后丟棄舊文件。數據庫在整個過程中始終保持完全在線,並且所有更新和讀取都可以成功完成。僅當所有數據都已復制並且所有用戶都已轉移到新文件時,才刪除舊數據庫文件。

4視圖

ACID屬性僅處理存儲和更新,但是我們還需要以有趣且有用的方式顯示數據的能力,不像SQL數據庫的數據必須小心地分解表,CouchDB中的數據以細小的機構存儲在文檔中。CouchDB文檔變得更靈活並且他們擁有自己的隱含的結構。這減輕了雙向復制表模式及其所包含數據的最困難的問題和陷阱。
但是,除了充當精美的文件服務器之外,用於數據存儲和共享的簡單文檔模型太簡單了,無法在其上構建真實的應用程序–它根本無法滿足我們的期望和期望。 我們想要切片和切塊,並以多種不同方式查看我們的數據。 現在需要一種過濾,組織和報告尚未分解為表格的數據的方法。

4.1視圖模型

為了解決將結構添加回非結構化和半結構化數據的問題,CouchDB集成了視圖模型。 視圖是聚合和報告數據庫中文檔的方法,並且按需構建以聚合,聯接和報告數據庫文檔。 由於視圖是動態構建的,並且不會影響基礎文檔,因此您可以根據需要使用相同數據的不同視圖表示。
視圖定義嚴格是虛擬的,並且僅顯示當前數據庫實例中的文檔,從而使其與顯示的數據分離並與復制兼容。 CouchDB視圖是在特殊設計文檔中定義的,並且可以跨數據庫實例(如常規文檔)進行復制,因此不僅數據可以在CouchDB中復制,而且整個應用程序設計也可以復制。

4.2JavaScript視圖功能

視圖是使用JavaScript功能定義的,該功能在map-reduce系統中充當map的一部分。 視圖函數將CouchDB文檔作為參數,然后進行所需的任何計算以確定通過視圖提供的數據(如果有)。 它可以基於單個文檔向視圖添加多行,也可以根本不添加任何行。

4.3視圖索引

視圖是數據庫實際文檔內容的動態表示,而CouchDB可以輕松創建有用的數據視圖。 但是,生成包含數十萬或數百萬個文檔的數據庫視圖既浪費時間和資源,又不是系統每次都要從頭做的事情。
為了保持視圖的快速查詢,視圖引擎維護其視圖的索引,並對其進行增量更新以反映數據庫中的更改。 CouchDB的核心設計在很大程度上圍繞着對視圖及其索引的高效,增量創建的需求進行了優化。
視圖及其功能在特殊的“設計”文檔中定義,並且設計文檔可以包含任意數量的唯一命名的視圖功能。 當用戶打開一個視圖並自動更新其索引時,同一設計文檔中的所有視圖都被索引為一個組。
視圖構建器使用數據庫序列ID來確定視圖組是否與數據庫完全同步。 如果不是,則視圖引擎將檢查自上次刷新以來更改的所有數據庫文檔(以打包的順序排列)。 按照在磁盤文件中出現的順序讀取文檔,從而減少了磁盤頭搜索的頻率和成本。
可以同時讀取和查詢視圖,同時也可以刷新視圖。 如果客戶端正在緩慢地流出大視圖的內容,則可以同時為另一個客戶端打開和刷新同一視圖,而不會阻塞第一個客戶端。 這適用於任何數量的同時進行的客戶端閱讀器,它們可以在同時為其他客戶端刷新索引的同時讀取和查詢視圖,而不會給閱讀器造成問題。
當視圖引擎通過您的“地圖”和“縮小”功能處理文檔時,它們的前一行值將從視圖索引中刪除(如果存在)。 如果通過視圖功能選擇了文檔,則功能結果將作為新行插入到視圖中。
將視圖索引更改寫入磁盤后,更新總是附加在文件末尾,以減少磁盤提交期間的磁盤頭查找時間,並確保崩潰和電源故障不會導致索引損壞。 如果在更新視圖索引時發生崩潰,則不完整的索引更新將丟失並從其先前提交的狀態逐步重建。

5安全與驗證

為了保護可以讀取和更新文檔的人員,CouchDB具有簡單的讀取器訪問和更新驗證模型,該模型可以擴展為實現自定義安全模型。

5.1 管理員訪問

CouchDB數據庫實例具有管理員帳戶。 管理員帳戶可以創建其他管理員帳戶並更新設計文檔。 設計文檔是包含視圖定義和其他特殊公式以及常規字段和Blob的特殊文檔。

5.2 更新驗證

將文檔寫入磁盤后,可以使用JavaScript函數動態地對其進行驗證,以實現安全性和數據驗證。 當文檔通過所有公式驗證標准時,將允許更新繼續。 如果驗證失敗,更新將中止,用戶客戶端將收到錯誤響應。
用戶憑證和更新的文檔都作為驗證公式的輸入,可以通過驗證用戶的文檔更新權限來實現自定義安全模型。
基本的“僅作者”更新文檔模型的實現很簡單,其中驗證文檔更新以檢查用戶是否在現有文檔的“作者”字段中列出。 還可以使用更多的動態模型,例如檢查單獨的用戶帳戶配置文件的權限設置。
對於實時使用情況和復制的更新都執行更新驗證,以確保共享的分布式系統中的安全性和數據驗證。

6分布式更新和復制

CouchDB是基於節點的分布式數據庫系統。它允許用戶和服務器在斷開連接時訪問和更新相同的共享數據。這些更改隨后可以雙向復制。
CouchDB文檔的存儲,視圖和安全模型旨在協同工作,以使真正的雙向復制高效且可靠。文檔和設計都可以復制,從而允許將完整的數據庫應用程序(包括應用程序設計,邏輯和數據)復制到便攜式計算機上以供脫機使用,或復制到遠程辦公室中的連接緩慢或不可靠,難以共享數據的服務器。
復制過程是增量的。在數據庫級別,復制僅檢查自上次復制以來已更新的文檔。如果由於網絡問題或崩潰等原因導致復制在任何步驟上失敗,則下一個復制將在最后一個檢查點重新啟動。
可以創建和維護部分副本。可以通過JavaScript函數過濾復制,以便僅復制特定文檔或滿足特定條件的文檔。這可以允許用戶脫機使用大型共享數據庫應用程序的子集供自己使用,同時保持與應用程序和該數據子集的正常交互。

6.1沖突

沖突檢測和管理是任何分布式編輯系統的關鍵問題。 CouchDB存儲系統將編輯沖突視為一種常見狀態,而不是例外狀態。 沖突處理模型簡單且“無損”,同時保留了單個文檔的語義並允許分散式沖突解決。
CouchDB允許數據庫中同時存在任何數量沖突的文檔,每個數據庫實例都確定性地確定哪個文檔是“贏家”,哪些是沖突。 只有贏家文檔可以顯示在視圖中,而“丟失”沖突仍然可以訪問並保留在數據庫中,直到在數據庫壓縮期間將其刪除或清除為止。 因為沖突文檔仍然是常規文檔,所以它們像常規文檔一樣進行復制,並且要遵循相同的安全性和驗證規則。
當發生分布式編輯沖突時,每個數據庫副本都會看到相同的勝出版本,並且每個都有解決沖突的機會。 解決沖突可以手動完成,也可以根據數據的性質和沖突由自動代理完成。 該系統使分散式沖突解決成為可能,同時保持了單文檔數據庫的語義。
即使多個斷開連接的用戶或代理嘗試解決相同的沖突,沖突管理也繼續起作用。 如果解決的沖突導致更多的沖突,則系統將以相同的方式處理它們,在每台機器上確定相同的獲勝者,並維護單個文檔的語義。

6.2應用

僅使用基本復制模型,幾乎無需額外的工作就可以使許多傳統的單服務器數據庫應用程序分布式。 CouchDB復制旨在立即用於基本數據庫應用程序,同時還可以擴展以用於更詳盡和功能齊全的用途。
只需很少的數據庫工作,就可以構建具有精細安全性和完整修訂歷史記錄的分布式文檔管理應用程序。 可以實施文檔更新以利用增量字段和Blob復制,其中復制的更新幾乎與實際編輯差異(“差異”)一樣高效和增量。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM