couchbase作為新興的NOSQL資料庫,可堪使用的資料少的可憐,更別提中文資料了,基本上就是在官網的手冊和論壇上查詢所需資料,所以這要求有一定的英語基礎,辭彙量不是問題,不認識的直接百度,關鍵是語法和耐心要過關,我從剛接觸couchbase開始天天啃英文手冊也是讀得煩躁不安,所以耐心十分重要。 ...
couchbase作為新興的NOSQL資料庫,可堪使用的資料少的可憐,更別提中文資料了,基本上就是在官網的手冊和論壇上查詢所需資料,所以這要求有一定的英語基礎,辭彙量不是問題,不認識的直接百度,關鍵是語法和耐心要過關,我從剛接觸couchbase開始天天啃英文手冊也是讀得煩躁不安,所以耐心十分重要。現在使用的是couchbase 2.2 community版本的,所以手冊是這個:http://docs.couchbase.com/couchbase-manual-2.2/。這個手冊中,Best Practices 與 Administrators Tasks是關於配置上的說明,Views and Indexs是關於構建數據關係的說明,這三個是最優先需要閱讀的章節。Command-line Interface for Administration是講解配置參數的工具,當具體要配置參數時應仔細閱讀這一章節。
如果以前沒有nosql的經驗,那麼理解couchbase的時候關鍵有兩點:延後寫入和鬆散存儲。延後寫入,顧名思義,couchbase在對數據進行增刪時會先體現在記憶體中,而不會立刻體現在硬碟上,從記憶體的修改到硬碟的修改這一步驟是由couchbase自動完成,等待執行的硬碟操作會以write queue的形式排隊等待執行,也正是通過這個方法,硬碟的I/O效率在write queue滿之前是不會影響couchbase的吞吐效率的,而write queue的長度是可以設置的。鬆散存儲也很好理解,在關係型資料庫中,要先建庫建表,最後插數據,而在couchbase中,bucket就相當於庫,沒有表的存在,直接就插數據了。關係型資料庫依賴表來進行條件查詢,couchbase一開始沒有具備表功能的結構,所以是無法執行條件查詢的,但是通過view則可以手動添加所需要的關係,view的設置是非常複雜的一部分,詳情去manul里Views and indexs里學習。總之couchbase的一般邏輯是建bucket——>插入數據——>建立View。正是因為關係可以後天建立,才使得不必預先規劃數據應具備的關係,隨用隨建即可。當然,對couchbase而言插入數據其實是插入json格式的文件。
接下來聊聊couchbase的記憶體。對於couchbase來說配置記憶體是很重要的環節,因為couchbase的精髓就在於依賴記憶體最大化降低硬碟I/O對吞吐量的負面影響。記憶體資源肯定遠遠少於硬碟資源,如果數據量小,那麼全部數據都放在記憶體上自然是最優選擇,這時候couchbase的效率也是異常高,但是數據量大的時候過多的數據就會被放在硬碟之中。當然,最終所有數據都會寫入硬碟,不過有些頻繁使用的數據提前放在記憶體中自然會提高效率。couchbase後臺有個進程,專門把一定時間沒有被訪問的數據移出記憶體,這個進程的掃描時間和數據的最大無活動時間都是可以設置的。這裡有個低水位的概念,也就是說當移除數據過多以至於記憶體中有效數據占用記憶體低於低水位的時候,couchbase會隨機挑一些文件到記憶體中以達到低水位。對於所有文件couchbase都會建立一個額外的56byte的metadata,這個metadata功能之一就是表明數據狀態,是否活動在記憶體中。同時文件的key也作為標識符和metadata一起長期活動在記憶體中。couchbase官方建議bucket申請的記憶體中,metadata和key所占用的記憶體不應超過一半,否則couchbase的性能會顯著下降。而這個建議我也測試過,準確無誤。因此一定記憶體所能支持的數據條數其實也就一定了,具體算一下就能估摸個大概。為了保證這個條件,顯然當有效數據占用超過一定記憶體時就需要把超額數據移除了,這裡有個概念,高水位。當有效數據記憶體占用超過高水位時,couchbase就會移除數據。高低水位都是可以設置的。
對於配置節點記憶體的問題,官方給了一個詳細的計算公式,如下:
變數:
documents_num 工作集中文件總數
ID_size 文件key的平均大小
value_size 文件內容平均大小
number_of_replicas 為文件做的備份數
working_set_percentage 工作集中放置於記憶體中的比率
per_node_ram_quota 每個節點給bucket申請的記憶體大小
metadata_per_document 56Byte
headroom 固態硬碟:25% ,傳統硬碟: 30%
high_water_mark 預設值為85%
公式:
no_of_copies 1 + number_of_replicas
total_metadata (documents_num) * (metadata_per_document + ID_size) * (no_of_copies)
total_dataset (documents_num) * (value_size) * (no_of_copies)
working_set total_dataset * (working_set_percentage)
Cluster RAM quota required (total_metadata + working_set) * (1 + headroom) / (high_water_mark)
number of nodes Cluster RAM quota required / per_node_ram_quota
Couchbase相比其他資料庫操作起來要更為麻煩一些,尤其是操作數據上,可以說couchbase server本身為了追求效率直接就把一些工作放棄了,為此在其他資料庫上簡單的數據操作到這裡必須要好好規劃一番才行。這一次主要是簡單介紹一下在Couchbase中如何進行條件查詢,而理解了條件查詢自然也就能明白相應的數據刪改是如何操作。
首先要清楚地認識到,couchbase本身存儲的數據之間是毫無關係的,如果不提前做好準備就無法進行任何條件查詢,而條件查詢的必要前提就是建立了正確的View。在couchbase中,一個bucket下包含多個design document,而每一個document中又包含多個View,這個結構的意義會在後面說,總之先有個概念。
View的寫法還是結合manul中的實例比較方便,http://docs.couchbase.com/couchbase-manual-2.2/#writing-views,寫法並不複雜,但是需要註意key的作用。這裡的key就是可供我們條件查詢的索引,所以根據條件查詢的檢索條件不同會需要不同的key,也就需要準備不同的View,這就是View為什麼會有多個的原因,因為每一個View只能針對單一類型檢索條件。當bucket中出現一個新的View時,就會遍歷bucket中的數據,並把最終結果集保存在硬碟上,這個結果集就是Index,也是條件查詢時直接查詢的數據列表。當數據有所變動時,view不會立刻隨之更新,而是受一個定時運行的後臺進程管理使之更新,這個周期預設是5000ms(可以自行設置)。除了依靠自動更新外,也可以依賴客戶端請求觸發更新。客戶端進行查詢時有三種模式,第一種是直接獲取當前存儲的Index,第二種是先更新Index然後獲取最新的,第三種是獲取當前存儲的Index併在獲得結果後更新Index。顯然根據查詢壓力和Index對同步要求的不同,這個模式要酌情選擇。當View有所改變之時,所述Document下所有的View都會重新遍歷所有數據來生成新的index,這會造成相當大的I/O壓力,這也是為什麼要有多個design document。
關於建立View的概念說的差不多了,剩下的細節就看manul補充即可,下麵說一下有了View又應該如何查詢。沒有了傳統的SQL語句,我們的查詢方式自然也大不一樣。這裡的查詢取決於View。在View中利用函數我們返回了一組key-value值,而我們查詢的就是生成的key值,最後返回的則是id-key-value的組合。查詢的語法與細節看這個http://docs.couchbase.com/couchbase-manual-2.2/#querying-views,有前端經驗的學習起來一定很順手,因為語法是按照REST來的,只要看一下有哪些參數怎麼用就可以了。
最後特別提一點,那就是如何修改數據。在當前版本下,修改數據的方式暫時只有一種:先查詢到數據,把這個數據取出,在客戶端修改需要修改的部分,再用強制寫入的模式把數據存回去,這就是一個完整的修改周期,異常麻煩。
最後就是取出的數據如何方便地抽離。因為取回的是json格式文檔,也就是一個長字元串,需要取出相應條目的內容就需要專門的處理。我是用C SDK的,所以我可以藉助一個第三方的庫,也就是libyajl,這個庫可以用來分割就json中的各條目以方便我們使用。yajl可以直接在ubuntu下用apt-get安裝,也可以手動安裝https://github.com/lloyd/yajl。如果用其他SDK要如何處理我就不清楚了,其他語言的SDK我沒研究過,python這類腳本語言本身就有各種庫大概直接就能處理了。不過我建議儘量用腳本語言,這樣改起來也方便,SDK提供的介面也要更細緻更方便,我是只會C才只能用C SDK的,真是麻煩。
總之這裡只是講一下基本概念,具體操作的實施方法需要查閱官方手冊,無論是建立View還是查詢Index都是有嚴格語法的,照著manul的教程走就沒錯了。如果熟悉REST方法的話,查詢甚至可以直接用curl或wget加上合適的指令完成,其他工作也可以這樣完成,參考http://docs.couchbase.com/couchbase-manual-2.2/#using-the-rest-api和http://docs.couchbase.com/couchbase-manual-2.2/#design-document-rest-api。