CouchDB 是如何工作的?
CouchDB 構(gòu)建在強大的 B-樹儲存引擎之上。這種引擎負責對 CouchDB 中的數(shù)據(jù)進行排序,并提供一種能夠在對數(shù)均攤時間內(nèi)執(zhí)行搜索、插入和刪除操作的機制。CouchDB 將這個引擎用于所有內(nèi)部數(shù)據(jù)、文檔和視圖。
因為 CouchDB 數(shù)據(jù)庫的結(jié)構(gòu)獨立于模式,所以它依賴于使用視圖創(chuàng)建文檔之間的任意關(guān)系,以及提供聚合和報告特性。使用 Map/Reduce 計算這些視圖的結(jié)果,Map/Reduce 是一種使用分布式計算來處理和生成大型數(shù)據(jù)集的模型。Map/Reduce 模型由 Google 引入,可分為 Map 和 Reduce 兩個步驟。在 Map 步驟中,由主節(jié)點接收文檔并將問題劃分為多個子問題。然后將這些子問題發(fā)布給工作節(jié)點,由它處理后再將結(jié)果返回給主節(jié)點。在 Reduce 步驟,主節(jié)點接收來自工作節(jié)點的結(jié)果并合并它們,以獲得能夠解決初問題的總體結(jié)果和答案。
CouchDB 中的 Map/Reduce 特性生成鍵/值對,CouchDB 將它們插入到 B-樹引擎中并根據(jù)它們的鍵進行排序。這能通過鍵進行高效查找,并且提高 B-樹中的操作的性能。此外,這還意味著可以在多個節(jié)點上對數(shù)據(jù)進行分區(qū),而不需要單獨查詢每個節(jié)點。
傳統(tǒng)的關(guān)系數(shù)據(jù)庫管理系統(tǒng)有時使用鎖來管理并發(fā)性,從而防止其他客戶機訪問某個客戶機正在更新的數(shù)據(jù)。這防止多個客戶機同時更改相同的數(shù)據(jù),但對于多個客戶機同時使用一個系統(tǒng)的情況,數(shù)據(jù)庫在確定哪個客戶機應(yīng)該接收鎖并維護鎖隊列的次序時會遇到困難,這很常見。在 CouchDB 中沒有鎖機制,它使用的是多版本并發(fā)性控制(Multiversion concurrency controlMVCC)— 它向每個客戶機提供數(shù)據(jù)庫的新版本的快照。這意味著在提交事務(wù)之前,其他用戶不能看到更改。許多現(xiàn)代數(shù)據(jù)庫開始從鎖機制前移到 MVCC,包括 Oracle(V7 之后)和 Microsoft® SQL Server 2005 及更新版本。