cbase權(quán)威指南_第1頁
cbase權(quán)威指南_第2頁
cbase權(quán)威指南_第3頁
cbase權(quán)威指南_第4頁
cbase權(quán)威指南_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、Couchbase權(quán)威指南節(jié)點(diǎn)和集群Couchbase服務(wù)器可以單獨(dú)運(yùn)行,也可以作為集群運(yùn)行。在Couchbase集群里,運(yùn)行一個(gè)或多個(gè)Couchbase實(shí)例。集群里所有節(jié)點(diǎn)是相等的,提供相同的功能和信息,沒有層次結(jié)構(gòu)或者拓?fù)涞母拍?,也沒有主節(jié)點(diǎn)、從節(jié)點(diǎn)之分。整個(gè)集群共享每個(gè)獨(dú)立節(jié)點(diǎn)的信息,每個(gè)節(jié)點(diǎn)負(fù)責(zé)對數(shù)據(jù)的一部分進(jìn)行響應(yīng)。集群是水平擴(kuò)展的。要增加集群的容量,你只需加多一個(gè)節(jié)點(diǎn)。節(jié)點(diǎn)間沒有父子關(guān)系或者層次結(jié)構(gòu)。這意味著Couchbase在存儲(chǔ)容量和性能方面,都可以做到線性擴(kuò)容。集群管理集群里的每個(gè)節(jié)點(diǎn)包含了集群管理器組件。集群管理器負(fù)責(zé)下述行為:· 集群管理· 節(jié)點(diǎn)管理&

2、#183; 節(jié)點(diǎn)監(jiān)控· 可管理的REST API· 統(tǒng)計(jì)報(bào)表· 實(shí)時(shí)日志· Multitenancy· 訪問安全BucketsCouchbase使用命名buckets提供數(shù)據(jù)管理服務(wù),buckets是獨(dú)立的虛擬數(shù)據(jù)容器。一個(gè)bucket就是Couchbase服務(wù)器集群里的一邏輯組物理資源,它可以被集群里的多個(gè)客戶端應(yīng)用使用。buckets提供安全的機(jī)制來組織、管理、分析數(shù)據(jù)存儲(chǔ)資源。Couchbase提供兩種核心類型的buckets,如下描述。Couchbase根據(jù)bucket類型來提供運(yùn)行時(shí)的統(tǒng)計(jì)報(bào)告。· Couchbase類型:提

3、供高可用和動(dòng)態(tài)重配置的分布式數(shù)據(jù)存儲(chǔ),提供持久化存儲(chǔ)和復(fù)制服務(wù)。這種bucket也100%兼容Memcached協(xié)議。· Memcached類型:提供直接尋址的、分布式的、內(nèi)存型的文本緩存。這種bucket被設(shè)計(jì)來作為關(guān)系型數(shù)據(jù)庫的補(bǔ)充 緩存經(jīng)常查詢的數(shù)據(jù),從而減少對數(shù)據(jù)庫的查詢量,提高性能。不同的bucket類型提供不同的核心功能。Couchbase類型的bucket提供一種高可用、動(dòng)態(tài)重配置、分布式的數(shù)據(jù)存儲(chǔ),在集群的節(jié)點(diǎn)發(fā)生故障時(shí),它允許集群自我修復(fù),并繼續(xù)提供服務(wù)。Couchbase bucket的特有功能· 持久性:數(shù)據(jù)單元異步從內(nèi)存寫往磁盤,防范服務(wù)重啟或較小的

4、故障發(fā)生時(shí)數(shù)據(jù)丟失。持久性屬性是在bucket級設(shè)置的。· 復(fù)制:對couchbase類型的bucket,可以配置數(shù)據(jù)復(fù)制的份數(shù)。集群里的每個(gè)節(jié)點(diǎn)既保存活躍的數(shù)據(jù),又保存數(shù)據(jù)副本。假如某個(gè)節(jié)點(diǎn)掛了,數(shù)據(jù)副本可以提升為活躍的容器,從而繼續(xù)提供高可用服務(wù)。· 重新組織:集群里的數(shù)據(jù)可以重新組織和分布,從而動(dòng)態(tài)增加或刪除bucket和服務(wù)器。· bucket容積改變:couchbase類型的bucket可以動(dòng)態(tài)調(diào)整容積,在應(yīng)用需要時(shí)它們的大小可以被改變。buckets可以用來隔離單個(gè)應(yīng)用程序提供多租戶,或隔離數(shù)據(jù)類型,以提高性能和可視性。couchbase服務(wù)器允許你配

5、置不同的端口來訪問不同的buckets,每個(gè)bucket都可以設(shè)置密碼驗(yàn)證。Smart client客戶端通過使用couchbase的管理REST API,自動(dòng)發(fā)現(xiàn)集群結(jié)構(gòu)的改變。這點(diǎn)保證了客戶端應(yīng)用可以無間斷的從正確節(jié)點(diǎn)上訪問所需數(shù)據(jù)。couchbase服務(wù)器允許你在生產(chǎn)環(huán)境里混合使用不同類型的buckets。內(nèi)存和磁盤配額是基于bucket配置的,所以資源使用可以跨集群管理。配額可以在運(yùn)行時(shí)修改,使得管理員能隨時(shí)重新分配資源。vBuckets一個(gè)vBucket定義為couchbase集群里key空間的一個(gè)子集的擁有者。通過使用vBuckets,信息在集群里分發(fā)更有效。vBucket系統(tǒng)被用

6、于分布式數(shù)據(jù),以及支持多節(jié)點(diǎn)間的數(shù)據(jù)復(fù)制。客戶端在訪問bucket里的數(shù)據(jù)時(shí),是與存儲(chǔ)了該數(shù)據(jù)的vBucket所在的集群節(jié)點(diǎn)進(jìn)行通信。這種直接訪問方式允許客戶端與數(shù)據(jù)節(jié)點(diǎn)直接通信,而無需使用代理或重定向架構(gòu)。其結(jié)果是從邏輯分區(qū)數(shù)據(jù)里抽象了物理拓?fù)?,保證了couchbase的彈性服務(wù)。這種架構(gòu)也不同于memcached所用的方法,memcached使用客戶端key哈希,從預(yù)定義的列表里選取服務(wù)器。這要求維護(hù)一份服務(wù)器的活躍列表,并指定哈希算法例如Ketama,以在拓?fù)淅锞S護(hù)數(shù)據(jù)一致性。vBucket架構(gòu)也比傳統(tǒng)的RDBMS系統(tǒng)使用的數(shù)據(jù)分區(qū)更靈活。vBuckets并非面向用戶的組件,但它們是co

7、uchbase服務(wù)器里非常重要的組件,是至關(guān)重要的可用性和彈性服務(wù)的支承。每個(gè)文檔ID屬于一個(gè)vBucket。有一個(gè)映射函數(shù)用來計(jì)算給定的文檔屬于哪個(gè)vBucket。在couchbase服務(wù)器里,該映射函數(shù)是個(gè)哈希函數(shù),它取文檔ID作為輸入,輸出vBucket標(biāo)識(shí)符。一旦定位了vBucket標(biāo)識(shí)符,會(huì)繼續(xù)從一個(gè)表里查找該vBucket位于哪個(gè)服務(wù)器上。這個(gè)表包含每行一個(gè)vBucket,vBucket與它的宿主主機(jī)成對出現(xiàn)。位于該表里的服務(wù)器通常服務(wù)了多個(gè)vBuckets。內(nèi)存數(shù)據(jù)Couchbase架構(gòu)包含了一個(gè)內(nèi)置的cache層。這種機(jī)制允許非常快速的響應(yīng)時(shí)間,因?yàn)閿?shù)據(jù)是直接寫往內(nèi)存的,并且讀

8、的時(shí)候,也是從內(nèi)存返回?cái)?shù)據(jù)給客戶端。這種設(shè)計(jì)的效果,提供了一個(gè)內(nèi)置的cache層作為系統(tǒng)操作的中央部分延伸。客戶端接口與內(nèi)存數(shù)據(jù)打交道,它將信息寫往Couchbase的內(nèi)存;返回的數(shù)據(jù)也是從內(nèi)存里獲取,或者先從磁盤加載到內(nèi)存,再返回給客戶端。這種處理方式保證了最佳性能。為了提高性能,你應(yīng)該給每個(gè)節(jié)點(diǎn)分配最大數(shù)量的可用內(nèi)存。內(nèi)存跨集群匯總起來以供使用。這點(diǎn)與其他數(shù)據(jù)庫系統(tǒng)的設(shè)計(jì)不同,其他數(shù)據(jù)庫的處理方式是,信息寫往數(shù)據(jù)庫,然后要么有一個(gè)獨(dú)立的cache層,要么依賴于操作系統(tǒng)的cache機(jī)制,把經(jīng)常使用的信息放在內(nèi)存以供訪問。EjectionEjection是和Couchbase buckets一

9、起使用的機(jī)制,它的作用是從內(nèi)存里刪除數(shù)據(jù),給活躍的、更頻繁使用的數(shù)據(jù)讓出空間,它是cache系統(tǒng)的核心部分。Ejection自動(dòng)執(zhí)行,它聯(lián)合磁盤持久存儲(chǔ)系統(tǒng),保證內(nèi)存里的數(shù)據(jù)已經(jīng)持久寫往磁盤,從而安全的刪除。該系統(tǒng)確保內(nèi)存存儲(chǔ)的數(shù)據(jù)在刪除前,已經(jīng)寫往磁盤,在下次客戶端需要時(shí),它又可以從磁盤加載到內(nèi)存。Ejection的核心作用是讓系統(tǒng)能夠保持經(jīng)常使用的數(shù)據(jù)駐留在內(nèi)存,并且在客戶端需要從磁盤加載數(shù)據(jù)時(shí),它能重新在內(nèi)存里分配空間。對于Couchbase buckets,數(shù)據(jù)永不刪除,除非客戶端明確的刪除文檔,或者文檔已到達(dá)過期時(shí)間。而ejection機(jī)制在從內(nèi)存里刪除數(shù)據(jù)時(shí),會(huì)保存數(shù)據(jù)的副本到磁盤

10、上。Expiration每個(gè)存在Couchbase里的文檔有一個(gè)可選的過期時(shí)間(expiration)。默認(rèn)是沒有過期時(shí)間(例如,數(shù)據(jù)永久存儲(chǔ))。過期時(shí)間可用來設(shè)置數(shù)據(jù)的生命周期,系統(tǒng)自動(dòng)從數(shù)據(jù)庫里刪除過期的數(shù)據(jù)。在數(shù)據(jù)存儲(chǔ)時(shí),由用戶指定文檔的過期時(shí)間。在數(shù)據(jù)更新時(shí),過期時(shí)間可以同步被更新,還可以通過couchbase協(xié)議手工更新。過期時(shí)間可以是相對時(shí)間(例如60秒),也可以是絕對時(shí)間(例如2012年12月31日中午12點(diǎn))。使用過期時(shí)間的典型場景是Web session。假如用戶停止了活動(dòng),你希望session里的數(shù)據(jù)自動(dòng)刪除。通過設(shè)置expiration,session數(shù)據(jù)會(huì)過期并且自動(dòng)刪

11、除,從而釋放內(nèi)存和磁盤給其他數(shù)據(jù)使用。EvictionEviction是針對memcached buckets從內(nèi)存里完全刪除數(shù)據(jù)的過程。memcached使用一種LRU(最少近期使用)算法來從系統(tǒng)里完全刪除不再使用的數(shù)據(jù)。在memcached bucket里,LRU數(shù)據(jù)會(huì)完全刪除以釋放空間,因?yàn)閙emcached buckets沒有持久化存儲(chǔ)。磁盤存儲(chǔ)為了提高性能,Couchbase傾向于在內(nèi)存里存儲(chǔ)數(shù)據(jù)和提供服務(wù)。然而,很難保證有足夠的資源可以做到這點(diǎn)。比較常見的做法是把經(jīng)常使用的工作數(shù)據(jù)存放在內(nèi)存,并且快速響應(yīng)給客戶端。除了盡可能多的存放數(shù)據(jù)在內(nèi)存外,couchbase也保存數(shù)據(jù)到磁盤。

12、磁盤持久性允許更容易的備份/恢復(fù)操作,也允許數(shù)據(jù)量增大到超過內(nèi)置cache層的容量。Couchbase自動(dòng)在內(nèi)存和磁盤間轉(zhuǎn)移數(shù)據(jù)(在后臺(tái)異步執(zhí)行),保持經(jīng)常使用的數(shù)據(jù)在內(nèi)存,不經(jīng)常使用的數(shù)據(jù)在磁盤。couchbase經(jīng)常監(jiān)控客戶端訪問的信息,讓活躍的數(shù)據(jù)保留在cache層內(nèi)。將數(shù)據(jù)從cache里刪除,騰出空間給更活躍信息使用的過程叫做ejection(前面的章節(jié)已描述)。通過couchbase集群里每個(gè)bucket的預(yù)先設(shè)定的閾值來決定何時(shí)執(zhí)行ejection.使用磁盤存儲(chǔ)引發(fā)的問題是,客戶端在請求文檔ID時(shí),必須知道信息是否存在。couchbase使用元數(shù)據(jù)結(jié)構(gòu)來解決這個(gè)問題。元數(shù)據(jù)里存儲(chǔ)了

13、數(shù)據(jù)庫里每個(gè)文檔的信息,并且元數(shù)據(jù)位于內(nèi)存里。這意味著假如文檔ID無效,服務(wù)器可以立刻返回”document ID not found”消息。當(dāng)然,如果文檔有效,那么要么從內(nèi)存里立刻返回,要么先從磁盤讀取到內(nèi)存再返回(從磁盤讀會(huì)產(chǎn)生延時(shí),或者導(dǎo)致超時(shí))。轉(zhuǎn)移數(shù)據(jù)到磁盤的過程是異步的。在couchbase提供服務(wù)的同時(shí),數(shù)據(jù)在后臺(tái)異步轉(zhuǎn)移到磁盤。如果并發(fā)寫往數(shù)據(jù)庫的量很大,客戶端可能收到服務(wù)器內(nèi)存臨時(shí)不夠的通知,直到更多數(shù)據(jù)轉(zhuǎn)移到磁盤,內(nèi)存有剩余為止。類似的,假如couchbase需要從磁盤加載數(shù)據(jù)回內(nèi)存,這個(gè)過程也是在后臺(tái)發(fā)生的,后臺(tái)進(jìn)程從隊(duì)列里讀取請求,然后從磁盤讀取數(shù)據(jù)裝載回內(nèi)存??蛻舳艘?/p>

14、直等待,直到數(shù)據(jù)加載到內(nèi)存,然后返回給客戶端。這種異步機(jī)制以及使用隊(duì)列的方式,使得讀寫處理非???,從而消除了典型的負(fù)載和性能尖峰,這通常是造成RDBMS性能不穩(wěn)定的原因。熱啟動(dòng)當(dāng)couchbase重啟,或者執(zhí)行備份恢復(fù)的啟動(dòng)時(shí),它進(jìn)入熱啟動(dòng)的狀態(tài)。熱啟動(dòng)從磁盤加載數(shù)據(jù)到內(nèi)存,從而讓數(shù)據(jù)對客戶端可用。在服務(wù)請求之前,熱啟動(dòng)必須完成。根據(jù)數(shù)據(jù)庫容量和配置的不同,以及存儲(chǔ)數(shù)據(jù)數(shù)量的不同,熱啟動(dòng)可能要花費(fèi)一定的時(shí)間來完成。Rebalancing數(shù)據(jù)在couchbase里的存儲(chǔ)方式是通過vBucket結(jié)構(gòu)提供的分布式機(jī)制來實(shí)現(xiàn)的。假如你想擴(kuò)展或收縮couchbase集群,這時(shí)存儲(chǔ)在vBuckets里的信

15、息需要在集群節(jié)點(diǎn)間重新分布,并且對應(yīng)的vBucket映射表也需要更新來適應(yīng)新的結(jié)構(gòu)。這個(gè)過程叫做rebalancing.在集群的存儲(chǔ)結(jié)構(gòu)改變時(shí),rebalancing必須手工執(zhí)行。rebalance進(jìn)程重新對存儲(chǔ)信息的vBuckets進(jìn)行分配,在集群節(jié)點(diǎn)間物理的轉(zhuǎn)移數(shù)據(jù),以匹配新的結(jié)構(gòu)。Rebalancing過程可以在集群運(yùn)行并正常服務(wù)請求時(shí)執(zhí)行。數(shù)據(jù)在后臺(tái)進(jìn)行轉(zhuǎn)移,客戶端的讀和寫仍然針對當(dāng)前存在的結(jié)構(gòu),直到轉(zhuǎn)移完成,系統(tǒng)會(huì)更新vBucket映射表,并將結(jié)果通知smart clients和Moxi proxy(它們是couchbase的客戶端)。其結(jié)果是整個(gè)集群的分布式數(shù)據(jù)重新分配,數(shù)據(jù)在整個(gè)

16、數(shù)據(jù)庫里均衡分布,并兼顧了支持系統(tǒng)運(yùn)轉(zhuǎn)的數(shù)據(jù)和數(shù)據(jù)副本的數(shù)量。副本和復(fù)制除了集群里的分布式數(shù)據(jù)外,couchbase還可以在集群里創(chuàng)建數(shù)據(jù)副本。這些副本也與vBucket結(jié)構(gòu)協(xié)調(diào)工作,各個(gè)vBucket的數(shù)據(jù)副本在整個(gè)集群里分布。分布式副本跟核心數(shù)據(jù)的處理方式一樣,而副本的存在可以防止集群里的單點(diǎn)故障。集群里的副本復(fù)制是完全點(diǎn)對點(diǎn)的,數(shù)據(jù)在節(jié)點(diǎn)間直接交換,沒有拓?fù)?、層次或主從關(guān)系。客戶端將數(shù)據(jù)寫往一個(gè)節(jié)點(diǎn)時(shí),數(shù)據(jù)被存在vBucket里,同時(shí)使用TAB系統(tǒng)分發(fā)到一個(gè)或多個(gè)副本vBucket.在集群里的一個(gè)節(jié)點(diǎn)發(fā)生故障時(shí),副本vBucket被激活,用來代替故障節(jié)點(diǎn)的vBuckets進(jìn)行工作。這個(gè)過

17、程秒完成,因?yàn)楦北臼窃谠紨?shù)據(jù)創(chuàng)建的同時(shí)就創(chuàng)建了,不會(huì)臨時(shí)執(zhí)行拷貝;副本vBucket已經(jīng)持有數(shù)據(jù)在那里,坐等被激活。副本vBucket激活后,會(huì)更新系統(tǒng)的映射表,以便客戶端直接與新的vBucket結(jié)構(gòu)通信。副本的配置是基于每個(gè)bucket的。根據(jù)數(shù)據(jù)安全層次的不同,你可以對不同的bucket配置不同數(shù)量的副本。請注意,只有在集群里的機(jī)器數(shù)量足夠時(shí),副本才可能被激活。例如,你配置了一個(gè)bucket保持3個(gè)副本,只有在集群里有4個(gè)節(jié)點(diǎn)時(shí),副本才會(huì)激活。一個(gè)bucket的副本數(shù)量,在bucket創(chuàng)建后不允許再修改。Failover數(shù)據(jù)的副本在整個(gè)集群里分布。對于couchbase類型的bucket

18、你可以配置副本的數(shù)量,就是說在一個(gè)couchbase集群里對每份數(shù)據(jù)保存多少數(shù)量的副本。在服務(wù)器發(fā)生故障時(shí)(不管是臨時(shí)故障還是管理維護(hù)),可以使用稱為failover的技術(shù)把故障節(jié)點(diǎn)標(biāo)記為不可用,從而激活該服務(wù)器對應(yīng)的副本vBuckets。failover進(jìn)程聯(lián)系每個(gè)保存了副本的服務(wù)器,更新內(nèi)部映射表,將客戶端的請求映射到新的可用節(jié)點(diǎn)上??梢允止?zhí)行failover,也可以使用內(nèi)置的自動(dòng)failover機(jī)制,在集群里的節(jié)點(diǎn)不可用超過一定時(shí)間后,failover自動(dòng)打開。TAPTAP是couchbase集群的內(nèi)部協(xié)議,在多個(gè)方面用來進(jìn)行內(nèi)部數(shù)據(jù)交換。TAP提供了系統(tǒng)內(nèi)執(zhí)行了變更的數(shù)據(jù)的數(shù)據(jù)流。T

19、AP被用于數(shù)據(jù)復(fù)制,在不同的vBuckets之間拷貝數(shù)據(jù)副本。它也用于rebalance過程,在vBuckets之間轉(zhuǎn)移數(shù)據(jù)從而使數(shù)據(jù)在整個(gè)系統(tǒng)里重新分布??蛻舳私涌谟性S多couchbase的客戶端可用,它們歸為2類,一類是smart clients,另一類是memcached兼容客戶端。smart clients完全與集群進(jìn)行通信,根據(jù)內(nèi)置的集群配置和基于vBuckets的分布式信息,數(shù)據(jù)自動(dòng)寫往集群里的正確節(jié)點(diǎn)。smart clients與集群保持通信,確保在故障轉(zhuǎn)移或者rebalancing時(shí),客戶端更新自己的配置,將數(shù)據(jù)寫入到正確的節(jié)點(diǎn)。如果使用非智能的memcached兼容的客戶端,

20、就必須使用一個(gè)位于客戶端的Moxi組件。Moxi作為一個(gè)代理服務(wù)器存在,位于客戶端連接和couchbase集群之間。除了讓傳統(tǒng)的memcached客戶端可以寫往couchbase集群,Moxi還提供了集群級的分布和接口。使用Moxi還讓你在不改變?nèi)魏我汛嬖诘膍emcached應(yīng)用的前提下,獲取couchbase的特有功能所帶來的優(yōu)勢。在couchbase服務(wù)器里,存儲(chǔ)和獲取信息的方式根據(jù)實(shí)際情況而不同。所有方法可以歸類為CRUD這4類基本操作:Create(創(chuàng)建),Retrieve(獲?。?,Update(更新),Delete(刪除)。創(chuàng)建使用couchbase的客戶端接口,根據(jù)文檔ID將文檔信

21、息存儲(chǔ)到數(shù)據(jù)庫里。批量操作也可行,并且比多個(gè)單次操作更有效。對于基本的存儲(chǔ)、獲取信息的操作,couchbase兼容memcached客戶端協(xié)議。對于更高級的操作,你需要使用couchbase客戶端庫。存儲(chǔ)的值可以是任何二進(jìn)制值,包括結(jié)構(gòu)化和非結(jié)構(gòu)化的串,序列化對象,或者原生的二進(jìn)制數(shù)據(jù)例如圖片或音頻。獲取為了獲取數(shù)據(jù),你必須先知道文檔ID。也可以執(zhí)行批量操作,同時(shí)獲取多個(gè)文檔,這比單次操作更有效。更新包括更新整個(gè)文檔的操作,也包括追加數(shù)據(jù)到已存在記錄的操作,或者遞增和遞減整數(shù)值。刪除有個(gè)單一的刪除操作,用來從數(shù)據(jù)庫里刪除整個(gè)文檔。各語言的庫couchbase官方支持下列語言和環(huán)境的smart

22、clients庫:· Java (· .NET (· PHP (· Ruby (· C libcouchbase (在筆者寫此書時(shí),也有一個(gè)實(shí)驗(yàn)性的Python庫可用( Nunberg還寫了個(gè)Perl客戶端Couchbase:Client,它基于C的libcouchbase庫。你可以在CPAN上獲取到這個(gè)庫。Proxy (Moxi)Couchbase的Moxi組件提供了一個(gè)代理服務(wù),允許傳統(tǒng)的memcached客戶端在不修改應(yīng)用的前提下,使用couchbase服務(wù)。該代理服務(wù)提供了在客戶端和服務(wù)器之間的連接池,在couchbase集群的內(nèi)部拓?fù)?/p>

23、變更時(shí),它及時(shí)通知客戶端,從而保證了信息在集群里分布正確。假如你使用了smart clients客戶端庫,就不必使用Moxi。Moxi可以部署在服務(wù)端,也可以在客戶端。產(chǎn)品環(huán)境里在服務(wù)端部署Moxi可能會(huì)帶來問題,建議只部署在客戶端。管理工具Couchbase被設(shè)計(jì)為盡可能易用,不要求管理員太多的關(guān)注,除了監(jiān)控健康狀態(tài)和容量。系統(tǒng)提供了三種途徑來管理和監(jiān)控couchbase服務(wù)器和集群。· Web管理控制臺(tái)· Couchbase包含一個(gè)內(nèi)置的web管理控制臺(tái),提供了完整的接口功能,包括配置、管理、監(jiān)控你的服務(wù)器。· 命令行接口· Couchbase提供了

24、一套命令行工具,用于控制和訪問couchbase服務(wù)器和集群。可以結(jié)合命令行和你自己的腳本和管理過程,來提供附加的功能,比如自動(dòng)故障轉(zhuǎn)移、備份等。· 管理REST APIWeb控制臺(tái)和命令行工具都利用了內(nèi)置的REST API,API提供了完整的管理功能。所有的管理功能都通過REST API提供,并且它扮演了服務(wù)器的認(rèn)證接口的角色。因?yàn)镽EST API提供了完善的功能,你可以在自己的管理腳本或程序里使用它,來實(shí)現(xiàn)不同的操作。統(tǒng)計(jì)和監(jiān)控為了了解couchbase集群正在做什么以及如何執(zhí)行,系統(tǒng)提供了完整的統(tǒng)計(jì)和監(jiān)控信息。統(tǒng)計(jì)信息在所有的管理接口都可以看到。統(tǒng)計(jì)系統(tǒng)非常完整,你可以監(jiān)控和定

25、位到每一個(gè)細(xì)節(jié)。監(jiān)控系統(tǒng)健康的核心統(tǒng)計(jì)報(bào)表通過web控制臺(tái)提供,該報(bào)表使用內(nèi)置的實(shí)時(shí)圖形,允許你實(shí)時(shí)監(jiān)控系統(tǒng)的健康和性能狀況。Hello CouchbaseCouchbase存儲(chǔ)信息時(shí),信息的值為文檔,鍵是文檔ID。這使得開發(fā)和部署應(yīng)用非常簡單。在存儲(chǔ)信息時(shí),提供文檔內(nèi)容和對應(yīng)的文檔ID。在獲取信息時(shí),提供文檔ID就可以獲取到對應(yīng)的值。只要你知道文檔ID,就總可以獲取到信息的內(nèi)容。數(shù)據(jù)簡單的按字節(jié)順序存放。這意味著你既可以存放裸信息(例如字串或整數(shù))、復(fù)雜的數(shù)據(jù)結(jié)構(gòu)(例如JSON),也可以存放序列化對象。序列化會(huì)轉(zhuǎn)換特定語言的原生對象為合適的字節(jié)串,今后從服務(wù)器里獲取時(shí),它們又可以還原為對象。

26、基本的存取過程非常簡單。下述示例里我使用了Ruby,不過其他語言的客戶端都以相同方式工作,因?yàn)樗鼈兌际褂昧讼嗤暮诵膮f(xié)議。安裝了ruby客戶端庫后,就可以編寫一段簡單的程序來存放信息到couchbase,然后再獲取信息。如下是示例的hello-wrold.rb程序:1. require 'rubygems' 2. require 'couchbase' 3. client = Couchbase.new ":8091/pools/default" 4. client.quiet =

27、false 5. begin 6. spoon = client.get "spoon" 7. puts spoon 8. rescue Couchbase:Error:NotFound => e 9. puts "There is no spoon." 10. client.set "spoon", "Hello World!", :ttl => 10 11. end· 頭兩行加載必要的庫· 下一行打開到couc

28、hbase集群的連接。此處定義里,URL必須指向集群里的至少一個(gè)節(jié)點(diǎn),這里是本機(jī)地址。default表示bucket名字,你可以使用其他bucket,假如已經(jīng)配置了。· 后面的行執(zhí)行獲取和存儲(chǔ)操作。假如初次獲取操作(針對spoon這個(gè)ID)失敗,我們就將數(shù)據(jù)寫入到DB里。只要文檔ID存在,腳本就打印出對應(yīng)的存放值。你可以從命令行運(yùn)行和測試該腳本。第一次運(yùn)行時(shí),應(yīng)該輸出這個(gè)錯(cuò)誤串:shell> ruby hello-world.rbThere is no spoon.指定的文檔并沒有存在于數(shù)據(jù)庫,但隨后就加進(jìn)去了。第二次運(yùn)行時(shí),就可以打印文檔的值:shell> ruby h

29、ello-world.rbHello World!此外,字串文檔在存儲(chǔ)時(shí),賦予了一個(gè)過期時(shí)間10秒。這意味著在存放信息后,等待超過10秒信息就被刪除了。假如首次運(yùn)行腳本后,超過10秒再第二次運(yùn)行該腳本,會(huì)輸出如下錯(cuò)誤串:shell> ruby hello-world.rbThere is no spoon.盡管這是一個(gè)非常簡單的示例程序,它描述了使用基本的get/set操作,在couchbase里存取信息的原理。配置選項(xiàng)為了得到最佳的couchbase服務(wù)器和客戶端環(huán)境,你應(yīng)該使用couchbase客戶端的一種。這些smart clients結(jié)合了核心接口協(xié)議(用來存取數(shù)據(jù))和管理協(xié)議。

30、后者允許客戶端直接與couchbase集群通信,理解vBucket映射表,以便信息能直接發(fā)送到集群里的單個(gè)節(jié)點(diǎn)。在故障轉(zhuǎn)移或rebalance時(shí),同樣的機(jī)制允許vBucket映射表的變更快速生效。couchbase直接支持六種客戶端庫:· Java· .NET· PHP· Ruby· C (libcouchbase)· Python上述每種都叫做smart client,提供了系統(tǒng)關(guān)鍵功能和集群管理配置的最佳組合??梢詮倪@里了解更多信息:假如你想使用memcached兼容的庫,或者你的應(yīng)用已經(jīng)使用了這種協(xié)議,那么建議用Moxi服務(wù),它

31、在兼容memcached的同時(shí),又利用了couchbase集群架構(gòu)的優(yōu)勢。Moxi代理服務(wù)在memcached協(xié)議和couchbase集群之間扮演接口角色。couchbase在協(xié)議級100%與memcached兼容。你應(yīng)當(dāng)在每個(gè)客戶端安裝Moxi,配置Moxi連接到couchbase集群,然后本地程序使用localhost作為主機(jī)名連接到Moxi服務(wù)。更多信息請參考couchbase官方文檔:盡管couchbase兼容memcached協(xié)議,但是某些高級couchbase協(xié)議是memcached不支持的,這些優(yōu)勢就會(huì)利用不上?;静僮鱟ouchbase基于文檔ID,執(zhí)行非常簡單的文檔存取模型。

32、在存儲(chǔ)信息時(shí),不需要定義表或結(jié)構(gòu),不需要寫復(fù)雜的查詢?nèi)カ@取信息。couchbase里的所有操作遵循下列規(guī)則:· 所有操作是原子性的· 這意味著服務(wù)器里沒有鎖機(jī)制,不可能存在來自多個(gè)客戶端的并發(fā)命令破壞了數(shù)據(jù)。然而,這也意味著如果多個(gè)客戶端對同一文檔ID執(zhí)行set操作,只有最后一個(gè)操作有效。為了管理這種并發(fā)和競爭條件,可以使用CAS操作。這要求提供一個(gè)附加的校驗(yàn)值,在校驗(yàn)值不合的情況下,文檔不會(huì)被更新。· 所有數(shù)據(jù)操作都要求key· 所有對數(shù)據(jù)的操作,都要求提供一個(gè)key。不能執(zhí)行全局操作,或者針對多個(gè)key的操作(multiple-get除外)。

33、3; 沒有內(nèi)部鎖· 在存儲(chǔ)或更新數(shù)據(jù)時(shí),系統(tǒng)并沒有一個(gè)內(nèi)部鎖。操作要么完全成功,要么因?yàn)槟撤N理由失?。ɡ纾R時(shí)內(nèi)存不足)。· 不同的客戶端語言執(zhí)行core協(xié)議,從而與couchbase服務(wù)器通信:· 所有客戶端執(zhí)行core協(xié)議· 對不同的語言和環(huán)境,盡管在結(jié)構(gòu)和函數(shù)名字上有些不同,但它們都執(zhí)行同樣的核心操作協(xié)議。例如,所有實(shí)現(xiàn)里都有set()協(xié)議調(diào)用,盡管有些客戶端把它叫做”store”.· 函數(shù)調(diào)用結(jié)構(gòu)差異· 因?yàn)椴煌恼Z言和環(huán)境的差異,對于core協(xié)議的函數(shù)調(diào)用結(jié)構(gòu)也許不同。例如在java里,可變參數(shù)方法不可用,因而有多個(gè)同一函

34、數(shù)的變體。在其他語言里,例如perl、python、ruby,hash是核心變量類型,經(jīng)常被用來存儲(chǔ)和返回信息。· 不同的語言提供額外的功能· 某些客戶端實(shí)現(xiàn)提供額外的函數(shù)調(diào)用和結(jié)構(gòu),這些是原生core協(xié)議所沒有的。例如在java里,所有操作既可以是同步也可以是異步的,允許你在get或set操作時(shí),繼續(xù)處理其他信息。· 并非所有實(shí)現(xiàn)支持標(biāo)簽· 標(biāo)簽在服務(wù)器里和數(shù)據(jù)一起存儲(chǔ),并非被所有語言的客戶端支持。couchbase支持的core協(xié)議和操作方法如下表所示。不管客戶端庫如何,這些函數(shù)在各種語言里工作方式都差不多,可能在語言自己的實(shí)現(xiàn)規(guī)范上有所不同。例如,

35、可以在ruby里增加一個(gè)值:1couchbase.incr("counter", 5)在.NET里,函數(shù)調(diào)用是:1client.Increment("counter", 100, 1);上述第二個(gè)參數(shù)是假如指定文檔ID不存在時(shí)的默認(rèn)值。CAS機(jī)制除了核心函數(shù)外,還有一個(gè)特殊函數(shù)叫做CAS (compare and swap). CAS提供了一個(gè)校驗(yàn)合,讓多個(gè)客戶端在同時(shí)更新文檔時(shí)避免產(chǎn)生沖突。例如,考慮如下場景:1. 客戶端A獲取到文檔Martin的值2. 客戶端B也獲取到文檔Martin的值3. 客戶端A修改文檔,并更新到數(shù)據(jù)庫4. 客戶端B也修改文檔

36、,并更新到數(shù)據(jù)庫在上述場景里,客戶端B的修改會(huì)覆蓋掉A修改的值。為了解決這種情況,可以使用cas()函數(shù)。它要求提供從數(shù)據(jù)庫里返回的唯一的CAS值。CAS值在文檔更新時(shí),每次都會(huì)改變,即使文檔更新后的內(nèi)容不變。將更新發(fā)送到服務(wù)器時(shí),假如客戶端提供的CAS值與服務(wù)器里當(dāng)前存儲(chǔ)的CAS不匹配,更新就會(huì)失敗。使用CAS后的應(yīng)用場景如下:1. 客戶端A獲取到文檔Martin的值,以及對應(yīng)的CAS值2. 客戶端B也獲取到文檔Martin的值,以及對應(yīng)的CAS值3. 客戶端A修改了文檔,并且提交到數(shù)據(jù)庫,同時(shí)提交CAS,本次更新成功,數(shù)據(jù)庫也同步更新CAS4. 客戶端B也修改了文檔,并且嘗試使用CAS進(jìn)行

37、數(shù)據(jù)庫更新,本次更新失敗,因?yàn)榭蛻舳说腃AS與服務(wù)器存儲(chǔ)的CAS現(xiàn)在不同了因此,CAS提供了一種檢查機(jī)制,保證你當(dāng)前更新的文檔自上次獲取以來,沒有發(fā)生變更過。在編程代碼里,CAS是一個(gè)類似于update()的函數(shù)。取決于環(huán)境的不同,你可能先要使用gets()函數(shù)來獲取到文檔信息和CAS值。例如,在java里先用gets()獲取文檔信息和CAS值,接著用cas()方法來更新文檔:1. CASValue customer = client.gets("customer"); 2. CASResponse casr = client.cas("customer

38、", customer.getCas(), "new string value");CAS的局限性是在客戶端庫這一級并沒有強(qiáng)制執(zhí)行它。假如你想對所有的更新操作使用CAS,就必須明確的使用它來代替標(biāo)準(zhǔn)的文檔更新函數(shù)。在couchbase里存儲(chǔ)數(shù)據(jù)couchbase是一個(gè)嚴(yán)格的文檔型數(shù)據(jù)庫。這就意味著,信息根據(jù)文檔ID存儲(chǔ)在數(shù)據(jù)庫里。沒有必要設(shè)置數(shù)據(jù)格式、創(chuàng)建表結(jié)構(gòu),甚至不需要告訴couchbase關(guān)于要存儲(chǔ)的信息。你要做的所有工作就是根據(jù)指定文檔ID存儲(chǔ)文檔數(shù)據(jù)。因?yàn)槲臋n的結(jié)構(gòu)原因,在開發(fā)應(yīng)用時(shí)有一些不同的考慮點(diǎn)。讓我們了解下文檔ID和文檔值的基本因素。文檔ID文檔

39、ID(或key)非常重要,它用來索引存儲(chǔ)的數(shù)據(jù)。key在一個(gè)bucket里必須是唯一的。key用來標(biāo)識(shí)所存儲(chǔ)的信息,可以是任意字串,通常最大長度128位。couchbase沒有機(jī)制為你自動(dòng)創(chuàng)建文檔ID。假如使用UUID,就必須在你自己的程序里使用對應(yīng)的UUID庫。通常實(shí)踐是,使用前綴、類型、分隔符來區(qū)分存儲(chǔ)在每個(gè)bucket里的不同信息。例如,可以使用beer_9834759這個(gè)ID來存儲(chǔ)關(guān)于啤酒的信息。這里的beer前綴標(biāo)識(shí)記錄類型,下劃線作為分隔符,后面的數(shù)字作為唯一的啤酒ID。couchbase 1.8沒有獲取文檔ID列表的功能,也不能遍歷一個(gè)bucket里的所有文檔。除非指定文檔ID,

40、你不能查詢信息。然而,這一點(diǎn)會(huì)在couchbase 2.0里予以改進(jìn)和支持。針對上述問題的一個(gè)解決方案是在應(yīng)用里創(chuàng)建信息鏈。例如,當(dāng)一個(gè)新的啤酒記錄追加到數(shù)據(jù)庫里時(shí),你可以更新一個(gè)beer_list的文檔,它包含了所有的啤酒記錄ID。因?yàn)楦率窃有缘?,所以可以維護(hù)這么一份最新的信息列表。實(shí)踐做法可以參考這篇博客:應(yīng)用程序可以通過使用和讀取一個(gè)固定的記錄來引導(dǎo)自身的數(shù)據(jù)查詢,這個(gè)記錄要么是本地的配置,要么是在數(shù)據(jù)庫里的配置記錄。文檔數(shù)據(jù)文檔數(shù)據(jù)是純字節(jié)序列,服務(wù)器不會(huì)試圖去解析或理解存儲(chǔ)的文檔格式。這意味著你可以存儲(chǔ)從數(shù)字到圖片的任何東西。這種開放的存儲(chǔ)結(jié)構(gòu),也意味著不必去聲明或定義要存儲(chǔ)信息

41、的結(jié)構(gòu),你可以充分靈活的自己定義所需要的結(jié)構(gòu)。存儲(chǔ)簡單的信息,例如數(shù)字或字串,只需簡單的將數(shù)據(jù)寫進(jìn)文檔值。存儲(chǔ)復(fù)雜的信息結(jié)構(gòu),你可能需要序列化對象,或者更通用的JSON結(jié)構(gòu)。序列化序列化將特定語言的復(fù)雜的內(nèi)部結(jié)構(gòu),例如hash或?qū)ο螅D(zhuǎn)換為字節(jié)序列,從而可以存儲(chǔ)在couchbase里。序列化的結(jié)構(gòu)還能被還原成原來的數(shù)據(jù)結(jié)構(gòu),從而被特定的語言直接使用。所有的couchbase客戶端庫在存取文檔時(shí),都自動(dòng)支持序列化和反序列化結(jié)構(gòu)或?qū)ο蟆SON序列化信息的問題是,它是語言約定的。假如你在Java里存儲(chǔ)一個(gè)對象或數(shù)據(jù)結(jié)構(gòu)到couchbase,它被序列化為一個(gè)只有java語言庫才能識(shí)別的串。假如要跨語言進(jìn)行信息存儲(chǔ),你需要使用更通用的格式,比如JSON。JSON之所以流行,一是因?yàn)樗芎啙崳ㄋ雌饋硐裨S多腳本語言的內(nèi)置hash結(jié)構(gòu)),二是它可以被Javascript直接使用,這樣在web基礎(chǔ)的應(yīng)用里,不必對它做特別處理。JSON的格式有良好的描述,詳見http:/json.o

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論