couchbase的簡單介紹

来源:http://www.cnblogs.com/kuiyu/archive/2016/04/30/5449572.html
-Advertisement-
Play Games

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。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 監聽EditText的文本變化需要給EditText控制項加一個addTextChangeListener監聽器 editText.addTextChangeListener(textWatcher); 這裡的textWatcher是一個TextWatcher對象, TextWatcher是一個介面, ...
  • 項目:蒙文詞語檢索 日期:2016-05-01 提示:The constructor User.Student(String, String, String) is not visible 出處:Dbdao.insert(new Student("Achilles", "Male", "14")); ...
  • 小喵的嘮叨話:最近京東圖書大減價,小喵手癢了就買了本《Redis設計與實現》[1]來看看。這裡權當小喵看書的筆記啦。這一系列的模式,主要是先介紹Redis的實現原理(可能很大一部分會直接照搬原作者的描述),加上小喵自己的想法,之後配合Redis官網上的各種相關的操作命令(原書上貌似沒有很多的介紹命令 ...
  • 某次,在使用PLSQ鏈接資料庫的時候,出現了錯誤如下: 然後點擊視窗上面的 工具 –> 首選項 –> Oracle –> 連接 ,然後看到這樣的視窗: 用電腦根據上面的地址搜索不到 \instantclient_11_2 說明電腦上面沒有 instantclient_11_2 插件,然後決定重新下載 ...
  • <!--?xml:namespace prefix = "v" ns = "urn:schemas-microsoft-com:vml" /--> Oracle中的觸發器是一個非常有用的技術,它與存儲過程和函數不同的是,存儲過程與函數需要用戶顯示調用才執行,而觸發器是由一個事件來啟動運行。即觸發器是 ...
  • SQL Server 與 Oracle 資料庫兩者一個最大的區別,就是其應用平臺的差異。 現在SQL Server資料庫只能夠部署在微軟的操作系統上。而Oracle資料庫其不但可以支持微軟的操作系統,而且還可以支持開源的操作系統,如Linux等等。 感覺最大區別是在鎖機制上,一個是頁級鎖,一個是行級 ...
  • NoSQL是非關係型資料庫,即not only sql,key/value鍵值對存儲。 現有Nosql DB產品:Redis/MongoDB/Memcached等等。 SQL Sever是關係型資料庫,由各種關係的列組成表。保障數據的完整性。 為什麼需要NoSQL? 對資料庫高併發讀寫的需求 對海量 ...
  • IO就是對磁碟的讀/寫。 一次IO,就是發出指令+執行命令。 磁碟IO的時間=尋道時間+數據傳輸時間 單盤不能併發IO。 radis多個盤併發IO。 影響IO的最大因素是尋道時間。 影響電腦速度:cpu、記憶體、IO. 提高電腦IO的方法:將機械硬碟換為液態硬碟。 cpu:可以將電腦轉速想象成一個人的 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...