![cbase權(quán)威指南_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/26/ce6536b4-99bc-49ac-8c74-b0e199ffe152/ce6536b4-99bc-49ac-8c74-b0e199ffe1521.gif)
![cbase權(quán)威指南_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/26/ce6536b4-99bc-49ac-8c74-b0e199ffe152/ce6536b4-99bc-49ac-8c74-b0e199ffe1522.gif)
![cbase權(quán)威指南_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/26/ce6536b4-99bc-49ac-8c74-b0e199ffe152/ce6536b4-99bc-49ac-8c74-b0e199ffe1523.gif)
![cbase權(quán)威指南_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/26/ce6536b4-99bc-49ac-8c74-b0e199ffe152/ce6536b4-99bc-49ac-8c74-b0e199ffe1524.gif)
![cbase權(quán)威指南_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/26/ce6536b4-99bc-49ac-8c74-b0e199ffe152/ce6536b4-99bc-49ac-8c74-b0e199ffe1525.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、Couchbase權(quán)威指南節(jié)點和集群Couchbase服務(wù)器可以單獨運行,也可以作為集群運行。在Couchbase集群里,運行一個或多個Couchbase實例。集群里所有節(jié)點是相等的,提供相同的功能和信息,沒有層次結(jié)構(gòu)或者拓撲的概念,也沒有主節(jié)點、從節(jié)點之分。整個集群共享每個獨立節(jié)點的信息,每個節(jié)點負責(zé)對數(shù)據(jù)的一部分進行響應(yīng)。集群是水平擴展的。要增加集群的容量,你只需加多一個節(jié)點。節(jié)點間沒有父子關(guān)系或者層次結(jié)構(gòu)。這意味著Couchbase在存儲容量和性能方面,都可以做到線性擴容。集群管理集群里的每個節(jié)點包含了集群管理器組件。集群管理器負責(zé)下述行為:· 集群管理· 節(jié)點管理&
2、#183; 節(jié)點監(jiān)控· 可管理的REST API· 統(tǒng)計報表· 實時日志· Multitenancy· 訪問安全BucketsCouchbase使用命名buckets提供數(shù)據(jù)管理服務(wù),buckets是獨立的虛擬數(shù)據(jù)容器。一個bucket就是Couchbase服務(wù)器集群里的一邏輯組物理資源,它可以被集群里的多個客戶端應(yīng)用使用。buckets提供安全的機制來組織、管理、分析數(shù)據(jù)存儲資源。Couchbase提供兩種核心類型的buckets,如下描述。Couchbase根據(jù)bucket類型來提供運行時的統(tǒng)計報告。· Couchbase類型:提
3、供高可用和動態(tài)重配置的分布式數(shù)據(jù)存儲,提供持久化存儲和復(fù)制服務(wù)。這種bucket也100%兼容Memcached協(xié)議。· Memcached類型:提供直接尋址的、分布式的、內(nèi)存型的文本緩存。這種bucket被設(shè)計來作為關(guān)系型數(shù)據(jù)庫的補充 緩存經(jīng)常查詢的數(shù)據(jù),從而減少對數(shù)據(jù)庫的查詢量,提高性能。不同的bucket類型提供不同的核心功能。Couchbase類型的bucket提供一種高可用、動態(tài)重配置、分布式的數(shù)據(jù)存儲,在集群的節(jié)點發(fā)生故障時,它允許集群自我修復(fù),并繼續(xù)提供服務(wù)。Couchbase bucket的特有功能· 持久性:數(shù)據(jù)單元異步從內(nèi)存寫往磁盤,防范服務(wù)重啟或較小的
4、故障發(fā)生時數(shù)據(jù)丟失。持久性屬性是在bucket級設(shè)置的。· 復(fù)制:對couchbase類型的bucket,可以配置數(shù)據(jù)復(fù)制的份數(shù)。集群里的每個節(jié)點既保存活躍的數(shù)據(jù),又保存數(shù)據(jù)副本。假如某個節(jié)點掛了,數(shù)據(jù)副本可以提升為活躍的容器,從而繼續(xù)提供高可用服務(wù)。· 重新組織:集群里的數(shù)據(jù)可以重新組織和分布,從而動態(tài)增加或刪除bucket和服務(wù)器。· bucket容積改變:couchbase類型的bucket可以動態(tài)調(diào)整容積,在應(yīng)用需要時它們的大小可以被改變。buckets可以用來隔離單個應(yīng)用程序提供多租戶,或隔離數(shù)據(jù)類型,以提高性能和可視性。couchbase服務(wù)器允許你配
5、置不同的端口來訪問不同的buckets,每個bucket都可以設(shè)置密碼驗證。Smart client客戶端通過使用couchbase的管理REST API,自動發(fā)現(xiàn)集群結(jié)構(gòu)的改變。這點保證了客戶端應(yīng)用可以無間斷的從正確節(jié)點上訪問所需數(shù)據(jù)。couchbase服務(wù)器允許你在生產(chǎn)環(huán)境里混合使用不同類型的buckets。內(nèi)存和磁盤配額是基于bucket配置的,所以資源使用可以跨集群管理。配額可以在運行時修改,使得管理員能隨時重新分配資源。vBuckets一個vBucket定義為couchbase集群里key空間的一個子集的擁有者。通過使用vBuckets,信息在集群里分發(fā)更有效。vBucket系統(tǒng)被用
6、于分布式數(shù)據(jù),以及支持多節(jié)點間的數(shù)據(jù)復(fù)制??蛻舳嗽谠L問bucket里的數(shù)據(jù)時,是與存儲了該數(shù)據(jù)的vBucket所在的集群節(jié)點進行通信。這種直接訪問方式允許客戶端與數(shù)據(jù)節(jié)點直接通信,而無需使用代理或重定向架構(gòu)。其結(jié)果是從邏輯分區(qū)數(shù)據(jù)里抽象了物理拓撲,保證了couchbase的彈性服務(wù)。這種架構(gòu)也不同于memcached所用的方法,memcached使用客戶端key哈希,從預(yù)定義的列表里選取服務(wù)器。這要求維護一份服務(wù)器的活躍列表,并指定哈希算法例如Ketama,以在拓撲里維護數(shù)據(jù)一致性。vBucket架構(gòu)也比傳統(tǒng)的RDBMS系統(tǒng)使用的數(shù)據(jù)分區(qū)更靈活。vBuckets并非面向用戶的組件,但它們是co
7、uchbase服務(wù)器里非常重要的組件,是至關(guān)重要的可用性和彈性服務(wù)的支承。每個文檔ID屬于一個vBucket。有一個映射函數(shù)用來計算給定的文檔屬于哪個vBucket。在couchbase服務(wù)器里,該映射函數(shù)是個哈希函數(shù),它取文檔ID作為輸入,輸出vBucket標識符。一旦定位了vBucket標識符,會繼續(xù)從一個表里查找該vBucket位于哪個服務(wù)器上。這個表包含每行一個vBucket,vBucket與它的宿主主機成對出現(xiàn)。位于該表里的服務(wù)器通常服務(wù)了多個vBuckets。內(nèi)存數(shù)據(jù)Couchbase架構(gòu)包含了一個內(nèi)置的cache層。這種機制允許非??焖俚捻憫?yīng)時間,因為數(shù)據(jù)是直接寫往內(nèi)存的,并且讀
8、的時候,也是從內(nèi)存返回數(shù)據(jù)給客戶端。這種設(shè)計的效果,提供了一個內(nèi)置的cache層作為系統(tǒng)操作的中央部分延伸??蛻舳私涌谂c內(nèi)存數(shù)據(jù)打交道,它將信息寫往Couchbase的內(nèi)存;返回的數(shù)據(jù)也是從內(nèi)存里獲取,或者先從磁盤加載到內(nèi)存,再返回給客戶端。這種處理方式保證了最佳性能。為了提高性能,你應(yīng)該給每個節(jié)點分配最大數(shù)量的可用內(nèi)存。內(nèi)存跨集群匯總起來以供使用。這點與其他數(shù)據(jù)庫系統(tǒng)的設(shè)計不同,其他數(shù)據(jù)庫的處理方式是,信息寫往數(shù)據(jù)庫,然后要么有一個獨立的cache層,要么依賴于操作系統(tǒng)的cache機制,把經(jīng)常使用的信息放在內(nèi)存以供訪問。EjectionEjection是和Couchbase buckets一
9、起使用的機制,它的作用是從內(nèi)存里刪除數(shù)據(jù),給活躍的、更頻繁使用的數(shù)據(jù)讓出空間,它是cache系統(tǒng)的核心部分。Ejection自動執(zhí)行,它聯(lián)合磁盤持久存儲系統(tǒng),保證內(nèi)存里的數(shù)據(jù)已經(jīng)持久寫往磁盤,從而安全的刪除。該系統(tǒng)確保內(nèi)存存儲的數(shù)據(jù)在刪除前,已經(jīng)寫往磁盤,在下次客戶端需要時,它又可以從磁盤加載到內(nèi)存。Ejection的核心作用是讓系統(tǒng)能夠保持經(jīng)常使用的數(shù)據(jù)駐留在內(nèi)存,并且在客戶端需要從磁盤加載數(shù)據(jù)時,它能重新在內(nèi)存里分配空間。對于Couchbase buckets,數(shù)據(jù)永不刪除,除非客戶端明確的刪除文檔,或者文檔已到達過期時間。而ejection機制在從內(nèi)存里刪除數(shù)據(jù)時,會保存數(shù)據(jù)的副本到磁盤
10、上。Expiration每個存在Couchbase里的文檔有一個可選的過期時間(expiration)。默認是沒有過期時間(例如,數(shù)據(jù)永久存儲)。過期時間可用來設(shè)置數(shù)據(jù)的生命周期,系統(tǒng)自動從數(shù)據(jù)庫里刪除過期的數(shù)據(jù)。在數(shù)據(jù)存儲時,由用戶指定文檔的過期時間。在數(shù)據(jù)更新時,過期時間可以同步被更新,還可以通過couchbase協(xié)議手工更新。過期時間可以是相對時間(例如60秒),也可以是絕對時間(例如2012年12月31日中午12點)。使用過期時間的典型場景是Web session。假如用戶停止了活動,你希望session里的數(shù)據(jù)自動刪除。通過設(shè)置expiration,session數(shù)據(jù)會過期并且自動刪
11、除,從而釋放內(nèi)存和磁盤給其他數(shù)據(jù)使用。EvictionEviction是針對memcached buckets從內(nèi)存里完全刪除數(shù)據(jù)的過程。memcached使用一種LRU(最少近期使用)算法來從系統(tǒng)里完全刪除不再使用的數(shù)據(jù)。在memcached bucket里,LRU數(shù)據(jù)會完全刪除以釋放空間,因為memcached buckets沒有持久化存儲。磁盤存儲為了提高性能,Couchbase傾向于在內(nèi)存里存儲數(shù)據(jù)和提供服務(wù)。然而,很難保證有足夠的資源可以做到這點。比較常見的做法是把經(jīng)常使用的工作數(shù)據(jù)存放在內(nèi)存,并且快速響應(yīng)給客戶端。除了盡可能多的存放數(shù)據(jù)在內(nèi)存外,couchbase也保存數(shù)據(jù)到磁盤。
12、磁盤持久性允許更容易的備份/恢復(fù)操作,也允許數(shù)據(jù)量增大到超過內(nèi)置cache層的容量。Couchbase自動在內(nèi)存和磁盤間轉(zhuǎn)移數(shù)據(jù)(在后臺異步執(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集群里每個bucket的預(yù)先設(shè)定的閾值來決定何時執(zhí)行ejection.使用磁盤存儲引發(fā)的問題是,客戶端在請求文檔ID時,必須知道信息是否存在。couchbase使用元數(shù)據(jù)結(jié)構(gòu)來解決這個問題。元數(shù)據(jù)里存儲了
13、數(shù)據(jù)庫里每個文檔的信息,并且元數(shù)據(jù)位于內(nèi)存里。這意味著假如文檔ID無效,服務(wù)器可以立刻返回”document ID not found”消息。當然,如果文檔有效,那么要么從內(nèi)存里立刻返回,要么先從磁盤讀取到內(nèi)存再返回(從磁盤讀會產(chǎn)生延時,或者導(dǎo)致超時)。轉(zhuǎn)移數(shù)據(jù)到磁盤的過程是異步的。在couchbase提供服務(wù)的同時,數(shù)據(jù)在后臺異步轉(zhuǎn)移到磁盤。如果并發(fā)寫往數(shù)據(jù)庫的量很大,客戶端可能收到服務(wù)器內(nèi)存臨時不夠的通知,直到更多數(shù)據(jù)轉(zhuǎn)移到磁盤,內(nèi)存有剩余為止。類似的,假如couchbase需要從磁盤加載數(shù)據(jù)回內(nèi)存,這個過程也是在后臺發(fā)生的,后臺進程從隊列里讀取請求,然后從磁盤讀取數(shù)據(jù)裝載回內(nèi)存??蛻舳艘?/p>
14、直等待,直到數(shù)據(jù)加載到內(nèi)存,然后返回給客戶端。這種異步機制以及使用隊列的方式,使得讀寫處理非???,從而消除了典型的負載和性能尖峰,這通常是造成RDBMS性能不穩(wěn)定的原因。熱啟動當couchbase重啟,或者執(zhí)行備份恢復(fù)的啟動時,它進入熱啟動的狀態(tài)。熱啟動從磁盤加載數(shù)據(jù)到內(nèi)存,從而讓數(shù)據(jù)對客戶端可用。在服務(wù)請求之前,熱啟動必須完成。根據(jù)數(shù)據(jù)庫容量和配置的不同,以及存儲數(shù)據(jù)數(shù)量的不同,熱啟動可能要花費一定的時間來完成。Rebalancing數(shù)據(jù)在couchbase里的存儲方式是通過vBucket結(jié)構(gòu)提供的分布式機制來實現(xiàn)的。假如你想擴展或收縮couchbase集群,這時存儲在vBuckets里的信
15、息需要在集群節(jié)點間重新分布,并且對應(yīng)的vBucket映射表也需要更新來適應(yīng)新的結(jié)構(gòu)。這個過程叫做rebalancing.在集群的存儲結(jié)構(gòu)改變時,rebalancing必須手工執(zhí)行。rebalance進程重新對存儲信息的vBuckets進行分配,在集群節(jié)點間物理的轉(zhuǎn)移數(shù)據(jù),以匹配新的結(jié)構(gòu)。Rebalancing過程可以在集群運行并正常服務(wù)請求時執(zhí)行。數(shù)據(jù)在后臺進行轉(zhuǎn)移,客戶端的讀和寫仍然針對當前存在的結(jié)構(gòu),直到轉(zhuǎn)移完成,系統(tǒng)會更新vBucket映射表,并將結(jié)果通知smart clients和Moxi proxy(它們是couchbase的客戶端)。其結(jié)果是整個集群的分布式數(shù)據(jù)重新分配,數(shù)據(jù)在整個
16、數(shù)據(jù)庫里均衡分布,并兼顧了支持系統(tǒng)運轉(zhuǎn)的數(shù)據(jù)和數(shù)據(jù)副本的數(shù)量。副本和復(fù)制除了集群里的分布式數(shù)據(jù)外,couchbase還可以在集群里創(chuàng)建數(shù)據(jù)副本。這些副本也與vBucket結(jié)構(gòu)協(xié)調(diào)工作,各個vBucket的數(shù)據(jù)副本在整個集群里分布。分布式副本跟核心數(shù)據(jù)的處理方式一樣,而副本的存在可以防止集群里的單點故障。集群里的副本復(fù)制是完全點對點的,數(shù)據(jù)在節(jié)點間直接交換,沒有拓撲、層次或主從關(guān)系??蛻舳藢?shù)據(jù)寫往一個節(jié)點時,數(shù)據(jù)被存在vBucket里,同時使用TAB系統(tǒng)分發(fā)到一個或多個副本vBucket.在集群里的一個節(jié)點發(fā)生故障時,副本vBucket被激活,用來代替故障節(jié)點的vBuckets進行工作。這個過
17、程秒完成,因為副本是在原始數(shù)據(jù)創(chuàng)建的同時就創(chuàng)建了,不會臨時執(zhí)行拷貝;副本vBucket已經(jīng)持有數(shù)據(jù)在那里,坐等被激活。副本vBucket激活后,會更新系統(tǒng)的映射表,以便客戶端直接與新的vBucket結(jié)構(gòu)通信。副本的配置是基于每個bucket的。根據(jù)數(shù)據(jù)安全層次的不同,你可以對不同的bucket配置不同數(shù)量的副本。請注意,只有在集群里的機器數(shù)量足夠時,副本才可能被激活。例如,你配置了一個bucket保持3個副本,只有在集群里有4個節(jié)點時,副本才會激活。一個bucket的副本數(shù)量,在bucket創(chuàng)建后不允許再修改。Failover數(shù)據(jù)的副本在整個集群里分布。對于couchbase類型的bucket
18、你可以配置副本的數(shù)量,就是說在一個couchbase集群里對每份數(shù)據(jù)保存多少數(shù)量的副本。在服務(wù)器發(fā)生故障時(不管是臨時故障還是管理維護),可以使用稱為failover的技術(shù)把故障節(jié)點標記為不可用,從而激活該服務(wù)器對應(yīng)的副本vBuckets。failover進程聯(lián)系每個保存了副本的服務(wù)器,更新內(nèi)部映射表,將客戶端的請求映射到新的可用節(jié)點上。可以手工執(zhí)行failover,也可以使用內(nèi)置的自動failover機制,在集群里的節(jié)點不可用超過一定時間后,failover自動打開。TAPTAP是couchbase集群的內(nèi)部協(xié)議,在多個方面用來進行內(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ù)在整個系統(tǒng)里重新分布??蛻舳私涌谟性S多couchbase的客戶端可用,它們歸為2類,一類是smart clients,另一類是memcached兼容客戶端。smart clients完全與集群進行通信,根據(jù)內(nèi)置的集群配置和基于vBuckets的分布式信息,數(shù)據(jù)自動寫往集群里的正確節(jié)點。smart clients與集群保持通信,確保在故障轉(zhuǎn)移或者rebalancing時,客戶端更新自己的配置,將數(shù)據(jù)寫入到正確的節(jié)點。如果使用非智能的memcached兼容的客戶端,
20、就必須使用一個位于客戶端的Moxi組件。Moxi作為一個代理服務(wù)器存在,位于客戶端連接和couchbase集群之間。除了讓傳統(tǒng)的memcached客戶端可以寫往couchbase集群,Moxi還提供了集群級的分布和接口。使用Moxi還讓你在不改變?nèi)魏我汛嬖诘膍emcached應(yīng)用的前提下,獲取couchbase的特有功能所帶來的優(yōu)勢。在couchbase服務(wù)器里,存儲和獲取信息的方式根據(jù)實際情況而不同。所有方法可以歸類為CRUD這4類基本操作:Create(創(chuàng)建),Retrieve(獲取),Update(更新),Delete(刪除)。創(chuàng)建使用couchbase的客戶端接口,根據(jù)文檔ID將文檔信
21、息存儲到數(shù)據(jù)庫里。批量操作也可行,并且比多個單次操作更有效。對于基本的存儲、獲取信息的操作,couchbase兼容memcached客戶端協(xié)議。對于更高級的操作,你需要使用couchbase客戶端庫。存儲的值可以是任何二進制值,包括結(jié)構(gòu)化和非結(jié)構(gòu)化的串,序列化對象,或者原生的二進制數(shù)據(jù)例如圖片或音頻。獲取為了獲取數(shù)據(jù),你必須先知道文檔ID。也可以執(zhí)行批量操作,同時獲取多個文檔,這比單次操作更有效。更新包括更新整個文檔的操作,也包括追加數(shù)據(jù)到已存在記錄的操作,或者遞增和遞減整數(shù)值。刪除有個單一的刪除操作,用來從數(shù)據(jù)庫里刪除整個文檔。各語言的庫couchbase官方支持下列語言和環(huán)境的smart
22、clients庫:· Java (· .NET (· PHP (· Ruby (· C libcouchbase (在筆者寫此書時,也有一個實驗性的Python庫可用( Nunberg還寫了個Perl客戶端Couchbase:Client,它基于C的libcouchbase庫。你可以在CPAN上獲取到這個庫。Proxy (Moxi)Couchbase的Moxi組件提供了一個代理服務(wù),允許傳統(tǒng)的memcached客戶端在不修改應(yīng)用的前提下,使用couchbase服務(wù)。該代理服務(wù)提供了在客戶端和服務(wù)器之間的連接池,在couchbase集群的內(nèi)部拓撲
23、變更時,它及時通知客戶端,從而保證了信息在集群里分布正確。假如你使用了smart clients客戶端庫,就不必使用Moxi。Moxi可以部署在服務(wù)端,也可以在客戶端。產(chǎn)品環(huán)境里在服務(wù)端部署Moxi可能會帶來問題,建議只部署在客戶端。管理工具Couchbase被設(shè)計為盡可能易用,不要求管理員太多的關(guān)注,除了監(jiān)控健康狀態(tài)和容量。系統(tǒng)提供了三種途徑來管理和監(jiān)控couchbase服務(wù)器和集群。· Web管理控制臺· Couchbase包含一個內(nèi)置的web管理控制臺,提供了完整的接口功能,包括配置、管理、監(jiān)控你的服務(wù)器。· 命令行接口· Couchbase提供了
24、一套命令行工具,用于控制和訪問couchbase服務(wù)器和集群。可以結(jié)合命令行和你自己的腳本和管理過程,來提供附加的功能,比如自動故障轉(zhuǎn)移、備份等。· 管理REST APIWeb控制臺和命令行工具都利用了內(nèi)置的REST API,API提供了完整的管理功能。所有的管理功能都通過REST API提供,并且它扮演了服務(wù)器的認證接口的角色。因為REST API提供了完善的功能,你可以在自己的管理腳本或程序里使用它,來實現(xiàn)不同的操作。統(tǒng)計和監(jiān)控為了了解couchbase集群正在做什么以及如何執(zhí)行,系統(tǒng)提供了完整的統(tǒng)計和監(jiān)控信息。統(tǒng)計信息在所有的管理接口都可以看到。統(tǒng)計系統(tǒng)非常完整,你可以監(jiān)控和定
25、位到每一個細節(jié)。監(jiān)控系統(tǒng)健康的核心統(tǒng)計報表通過web控制臺提供,該報表使用內(nèi)置的實時圖形,允許你實時監(jiān)控系統(tǒng)的健康和性能狀況。Hello CouchbaseCouchbase存儲信息時,信息的值為文檔,鍵是文檔ID。這使得開發(fā)和部署應(yīng)用非常簡單。在存儲信息時,提供文檔內(nèi)容和對應(yīng)的文檔ID。在獲取信息時,提供文檔ID就可以獲取到對應(yīng)的值。只要你知道文檔ID,就總可以獲取到信息的內(nèi)容。數(shù)據(jù)簡單的按字節(jié)順序存放。這意味著你既可以存放裸信息(例如字串或整數(shù))、復(fù)雜的數(shù)據(jù)結(jié)構(gòu)(例如JSON),也可以存放序列化對象。序列化會轉(zhuǎn)換特定語言的原生對象為合適的字節(jié)串,今后從服務(wù)器里獲取時,它們又可以還原為對象。
26、基本的存取過程非常簡單。下述示例里我使用了Ruby,不過其他語言的客戶端都以相同方式工作,因為它們都使用了相同的核心協(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必須指向集群里的至少一個節(jié)點,這里是本機地址。default表示bucket名字,你可以使用其他bucket,假如已經(jīng)配置了。· 后面的行執(zhí)行獲取和存儲操作。假如初次獲取操作(針對spoon這個ID)失敗,我們就將數(shù)據(jù)寫入到DB里。只要文檔ID存在,腳本就打印出對應(yīng)的存放值。你可以從命令行運行和測試該腳本。第一次運行時,應(yīng)該輸出這個錯誤串:shell> ruby hello-world.rbThere is no spoon.指定的文檔并沒有存在于數(shù)據(jù)庫,但隨后就加進去了。第二次運行時,就可以打印文檔的值:shell> ruby h
29、ello-world.rbHello World!此外,字串文檔在存儲時,賦予了一個過期時間10秒。這意味著在存放信息后,等待超過10秒信息就被刪除了。假如首次運行腳本后,超過10秒再第二次運行該腳本,會輸出如下錯誤串:shell> ruby hello-world.rbThere is no spoon.盡管這是一個非常簡單的示例程序,它描述了使用基本的get/set操作,在couchbase里存取信息的原理。配置選項為了得到最佳的couchbase服務(wù)器和客戶端環(huán)境,你應(yīng)該使用couchbase客戶端的一種。這些smart clients結(jié)合了核心接口協(xié)議(用來存取數(shù)據(jù))和管理協(xié)議。
30、后者允許客戶端直接與couchbase集群通信,理解vBucket映射表,以便信息能直接發(fā)送到集群里的單個節(jié)點。在故障轉(zhuǎn)移或rebalance時,同樣的機制允許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的同時,又利用了couchbase集群架構(gòu)的優(yōu)勢。Moxi代理服務(wù)在memcached協(xié)議和couchbase集群之間扮演接口角色。couchbase在協(xié)議級100%與memcached兼容。你應(yīng)當在每個客戶端安裝Moxi,配置Moxi連接到couchbase集群,然后本地程序使用localhost作為主機名連接到Moxi服務(wù)。更多信息請參考couchbase官方文檔:盡管couchbase兼容memcached協(xié)議,但是某些高級couchbase協(xié)議是memcached不支持的,這些優(yōu)勢就會利用不上?;静僮鱟ouchbase基于文檔ID,執(zhí)行非常簡單的文檔存取模型。
32、在存儲信息時,不需要定義表或結(jié)構(gòu),不需要寫復(fù)雜的查詢?nèi)カ@取信息。couchbase里的所有操作遵循下列規(guī)則:· 所有操作是原子性的· 這意味著服務(wù)器里沒有鎖機制,不可能存在來自多個客戶端的并發(fā)命令破壞了數(shù)據(jù)。然而,這也意味著如果多個客戶端對同一文檔ID執(zhí)行set操作,只有最后一個操作有效。為了管理這種并發(fā)和競爭條件,可以使用CAS操作。這要求提供一個附加的校驗值,在校驗值不合的情況下,文檔不會被更新。· 所有數(shù)據(jù)操作都要求key· 所有對數(shù)據(jù)的操作,都要求提供一個key。不能執(zhí)行全局操作,或者針對多個key的操作(multiple-get除外)。
33、3; 沒有內(nèi)部鎖· 在存儲或更新數(shù)據(jù)時,系統(tǒng)并沒有一個內(nèi)部鎖。操作要么完全成功,要么因為某種理由失?。ɡ纾R時內(nèi)存不足)。· 不同的客戶端語言執(zhí)行core協(xié)議,從而與couchbase服務(wù)器通信:· 所有客戶端執(zhí)行core協(xié)議· 對不同的語言和環(huán)境,盡管在結(jié)構(gòu)和函數(shù)名字上有些不同,但它們都執(zhí)行同樣的核心操作協(xié)議。例如,所有實現(xiàn)里都有set()協(xié)議調(diào)用,盡管有些客戶端把它叫做”store”.· 函數(shù)調(diào)用結(jié)構(gòu)差異· 因為不同的語言和環(huán)境的差異,對于core協(xié)議的函數(shù)調(diào)用結(jié)構(gòu)也許不同。例如在java里,可變參數(shù)方法不可用,因而有多個同一函
34、數(shù)的變體。在其他語言里,例如perl、python、ruby,hash是核心變量類型,經(jīng)常被用來存儲和返回信息。· 不同的語言提供額外的功能· 某些客戶端實現(xiàn)提供額外的函數(shù)調(diào)用和結(jié)構(gòu),這些是原生core協(xié)議所沒有的。例如在java里,所有操作既可以是同步也可以是異步的,允許你在get或set操作時,繼續(xù)處理其他信息。· 并非所有實現(xiàn)支持標簽· 標簽在服務(wù)器里和數(shù)據(jù)一起存儲,并非被所有語言的客戶端支持。couchbase支持的core協(xié)議和操作方法如下表所示。不管客戶端庫如何,這些函數(shù)在各種語言里工作方式都差不多,可能在語言自己的實現(xiàn)規(guī)范上有所不同。例如,
35、可以在ruby里增加一個值:1couchbase.incr("counter", 5)在.NET里,函數(shù)調(diào)用是:1client.Increment("counter", 100, 1);上述第二個參數(shù)是假如指定文檔ID不存在時的默認值。CAS機制除了核心函數(shù)外,還有一個特殊函數(shù)叫做CAS (compare and swap). CAS提供了一個校驗合,讓多個客戶端在同時更新文檔時避免產(chǎn)生沖突。例如,考慮如下場景:1. 客戶端A獲取到文檔Martin的值2. 客戶端B也獲取到文檔Martin的值3. 客戶端A修改文檔,并更新到數(shù)據(jù)庫4. 客戶端B也修改文檔
36、,并更新到數(shù)據(jù)庫在上述場景里,客戶端B的修改會覆蓋掉A修改的值。為了解決這種情況,可以使用cas()函數(shù)。它要求提供從數(shù)據(jù)庫里返回的唯一的CAS值。CAS值在文檔更新時,每次都會改變,即使文檔更新后的內(nèi)容不變。將更新發(fā)送到服務(wù)器時,假如客戶端提供的CAS值與服務(wù)器里當前存儲的CAS不匹配,更新就會失敗。使用CAS后的應(yīng)用場景如下:1. 客戶端A獲取到文檔Martin的值,以及對應(yīng)的CAS值2. 客戶端B也獲取到文檔Martin的值,以及對應(yīng)的CAS值3. 客戶端A修改了文檔,并且提交到數(shù)據(jù)庫,同時提交CAS,本次更新成功,數(shù)據(jù)庫也同步更新CAS4. 客戶端B也修改了文檔,并且嘗試使用CAS進行
37、數(shù)據(jù)庫更新,本次更新失敗,因為客戶端的CAS與服務(wù)器存儲的CAS現(xiàn)在不同了因此,CAS提供了一種檢查機制,保證你當前更新的文檔自上次獲取以來,沒有發(fā)生變更過。在編程代碼里,CAS是一個類似于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的局限性是在客戶端庫這一級并沒有強制執(zhí)行它。假如你想對所有的更新操作使用CAS,就必須明確的使用它來代替標準的文檔更新函數(shù)。在couchbase里存儲數(shù)據(jù)couchbase是一個嚴格的文檔型數(shù)據(jù)庫。這就意味著,信息根據(jù)文檔ID存儲在數(shù)據(jù)庫里。沒有必要設(shè)置數(shù)據(jù)格式、創(chuàng)建表結(jié)構(gòu),甚至不需要告訴couchbase關(guān)于要存儲的信息。你要做的所有工作就是根據(jù)指定文檔ID存儲文檔數(shù)據(jù)。因為文檔的結(jié)構(gòu)原因,在開發(fā)應(yīng)用時有一些不同的考慮點。讓我們了解下文檔ID和文檔值的基本因素。文檔ID文檔
39、ID(或key)非常重要,它用來索引存儲的數(shù)據(jù)。key在一個bucket里必須是唯一的。key用來標識所存儲的信息,可以是任意字串,通常最大長度128位。couchbase沒有機制為你自動創(chuàng)建文檔ID。假如使用UUID,就必須在你自己的程序里使用對應(yīng)的UUID庫。通常實踐是,使用前綴、類型、分隔符來區(qū)分存儲在每個bucket里的不同信息。例如,可以使用beer_9834759這個ID來存儲關(guān)于啤酒的信息。這里的beer前綴標識記錄類型,下劃線作為分隔符,后面的數(shù)字作為唯一的啤酒ID。couchbase 1.8沒有獲取文檔ID列表的功能,也不能遍歷一個bucket里的所有文檔。除非指定文檔ID,
40、你不能查詢信息。然而,這一點會在couchbase 2.0里予以改進和支持。針對上述問題的一個解決方案是在應(yīng)用里創(chuàng)建信息鏈。例如,當一個新的啤酒記錄追加到數(shù)據(jù)庫里時,你可以更新一個beer_list的文檔,它包含了所有的啤酒記錄ID。因為更新是原子性的,所以可以維護這么一份最新的信息列表。實踐做法可以參考這篇博客:應(yīng)用程序可以通過使用和讀取一個固定的記錄來引導(dǎo)自身的數(shù)據(jù)查詢,這個記錄要么是本地的配置,要么是在數(shù)據(jù)庫里的配置記錄。文檔數(shù)據(jù)文檔數(shù)據(jù)是純字節(jié)序列,服務(wù)器不會試圖去解析或理解存儲的文檔格式。這意味著你可以存儲從數(shù)字到圖片的任何東西。這種開放的存儲結(jié)構(gòu),也意味著不必去聲明或定義要存儲信息
41、的結(jié)構(gòu),你可以充分靈活的自己定義所需要的結(jié)構(gòu)。存儲簡單的信息,例如數(shù)字或字串,只需簡單的將數(shù)據(jù)寫進文檔值。存儲復(fù)雜的信息結(jié)構(gòu),你可能需要序列化對象,或者更通用的JSON結(jié)構(gòu)。序列化序列化將特定語言的復(fù)雜的內(nèi)部結(jié)構(gòu),例如hash或?qū)ο?,轉(zhuǎn)換為字節(jié)序列,從而可以存儲在couchbase里。序列化的結(jié)構(gòu)還能被還原成原來的數(shù)據(jù)結(jié)構(gòu),從而被特定的語言直接使用。所有的couchbase客戶端庫在存取文檔時,都自動支持序列化和反序列化結(jié)構(gòu)或?qū)ο?。JSON序列化信息的問題是,它是語言約定的。假如你在Java里存儲一個對象或數(shù)據(jù)結(jié)構(gòu)到couchbase,它被序列化為一個只有java語言庫才能識別的串。假如要跨語言進行信息存儲,你需要使用更通用的格式,比如JSON。JSON之所以流行,一是因為它很簡潔(它看起來像許多腳本語言的內(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)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 胸外科護士工作心得
- 2025年全球及中國單擺銑頭行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報告
- 2025-2030全球倒置行星滾柱絲杠行業(yè)調(diào)研及趨勢分析報告
- 2025年全球及中國虛擬試穿平臺行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報告
- 2025年全球及中國汽車天線定位器行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報告
- 2025年全球及中國重載有軌穿梭小車(RGV)行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報告
- 2025年全球及中國絲素蛋白敷料行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報告
- 2025-2030全球直線式桁架機器人行業(yè)調(diào)研及趨勢分析報告
- 2025-2030全球裝運前檢驗(PSI)服務(wù)行業(yè)調(diào)研及趨勢分析報告
- 2025年全球及中國電子鑰匙柜行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報告
- 江西省部分學(xué)校2024-2025學(xué)年高三上學(xué)期1月期末英語試題(含解析無聽力音頻有聽力原文)
- GA/T 2145-2024法庭科學(xué)涉火案件物證檢驗實驗室建設(shè)技術(shù)規(guī)范
- 2024年中考語文試題分類匯編:非連續(xù)性文本閱讀(學(xué)生版)
- 2024年度窯爐施工協(xié)議詳例細則版B版
- 第一屆山東省職業(yè)能力大賽濟南市選拔賽制造團隊挑戰(zhàn)賽項目技術(shù)工作文件(含樣題)
- 尿毒癥替代治療
- 【課件】2025屆高考英語一輪復(fù)習(xí)小作文講解課件
- 基底節(jié)腦出血護理查房
- 工程公司總經(jīng)理年終總結(jié)
- 2024年海南省高考地理試卷(含答案)
- 【企業(yè)盈利能力探析的國內(nèi)外文獻綜述2400字】
評論
0/150
提交評論