(作者 Srini Penchikala 譯者 丁雪豐)
對於文檔、物件圖、鍵值對這樣的非關聯式資料類型,NoSQL資料庫為它們提供了另一種可選的資料存儲方式。 分散式緩存能被用作NoSQL資料庫嗎? Ehcache的Greg Luck撰文描述了分散式緩存與NoSQL資料庫的相似性。 InfoQ就此採訪了他,討論了該方案的利弊之處。
InfoQ:你能否就分散式緩存解決方案與NoSQL資料庫做個對比?
Greg Luck:分散式緩存通常會把資料放在記憶體裡,用於降低延時。 NoSQL資料庫是沒有R的DBMS(即沒有關系的資料庫管理系統),一般也缺乏對事務和其他高級特性的支援。 對於不支援關係的系統,表關係的關聯是SQL裡最麻煩的部分,這也正是NoSQL這個名字的起源。
其中一種NoSQL資料庫是鍵值存儲。 典型的例子包括Dynamo、Oracle NoSQL Database和Redis。 緩存也是鍵值存儲,因此說這兩者是相關的。 很多緩存實現能被配置為可持久化的,之所以很多時候不那麼做,是因為緩存是要提升性能而不是做持久化。 而NoSQL資料庫則與此相反,它是用來做持久化的。
持久化緩存也可當作鍵值NoSQL資料庫來使用。 NoSQL也提到了Big Data,通常是指比能放進一個單獨的RDBMS節點的量要大的資料,一般從幾TB到幾PB。
分散式緩存通常用於降低事務性資料的延時,這些資料開始時並不大,但慢慢就會往Big Data這個方向發展。 由於緩存將資料保存在記憶體裡,這提高了存儲的成本,而且需要限制資料的大小。 如果依賴于堆存儲,每個伺服器節點可能只有可憐的2GB。 如果依賴于分散式緩存,Ehcache還提供了堆外存儲,每台伺服器可以存儲幾百GB資料,可以用作TB級別的緩存。
持久化、分散式的緩存可以適用于一些NoSQL的場景。 NoSQL資料庫也可以應對一些緩存的場景,只是延時稍高而已。
InfoQ:從架構角度來看,分散式緩存和NoSQL資料庫有什麼相似之處嗎?
Greg:它們都想提供優於RDBMS的TPS和可擴充性。 為此,它們都在功能上做了簡化,拋開了那些麻煩的問題,比如表關聯、預存程序和ACID事務。
雖然JAVA緩存領域裡有JSR 107,它為Spring和JAVA EE程式師提供了一套標準的緩存API,但是比起標準化介面,它們都更傾向于使用私有介面。
它們都採用對用戶端透明的方式對資料進行分區,做向外擴展。 非JAVA產品向上擴展做得也很好。 擁有Terracotta BigMemory,我們在JAVA平臺上的向上擴展方面也做得很特別。 最後,兩者都可以部署在常見的硬體和作業系統上,這讓它們都能理想地運行于雲端。
InfoQ:架構上這兩項技術又有何不同呢?
Greg:NoSQL和RDBMS通常使用的是磁片。 磁片是機械設備,延時很厲害,因為搜尋時間是磁頭移動到正確的磁軌的時間,讀寫時間依賴于磁片的RPM。 NoSQL嘗試優化磁片的使用,例如,僅僅在磁頭當前位置追加日誌,偶爾才刷新到磁片上。 相反,緩存主要都把資料放記憶體裡。
NoSQL和RDBMS的用戶端很薄(想想Thrift或JDBC),只是在網路中傳輸資料,而像Ehcache這樣的緩存使用進程記憶體儲和遠端存放,因此常用請求在本地就能被成功處理。 在分散式緩存上下文中,每個應用程式伺服器的進程記憶體儲中都會緩存熱點資料,增加伺服器數量並不會增加網路或後端的負載。
RDBMS專注于成為通用的SOR(System of Record)。 NoSQ希望成為某類特定資料類型的SOR,比如鍵值對、文檔、稀疏表(寬表)或圖。 緩存著眼于性能,一般會與RDBMS或NoSQL資料庫結合使用,資料類型就是SOR。 往往緩存中會存儲Web服務調用的結果,業務物件的計算結果,這個結果可能需要成百SOR調用才能得到。
像Ehcache這樣的緩存部分運行在應用程式的作業系統進程裡,部分運行在網路那頭自己機器的進程裡。 但也不是全部分散式緩存都這樣:memcache就是一個例子,所有的資料都跨網路存儲。
InfoQ:哪類應用程式最適合這種方式?
Greg:這還得從先前的問題說起,要將分散式緩存用於你現有的應用程式,通常只需要很小的工作量,而NoSQL則需要做很多事,還有大的架構變更。
因此適用分散式緩存的第一類應用程式是現有系統,特別是有以下需要的:
由於使用量或負載激增而需要向外擴展 為達到SLA而需要有更低的延時 為了將大型機這樣的昂貴基礎設施的使用減到最低 減少Web服務調用而帶來的費用 應對極端負載高峰(比如黑色星期五一樣的促銷)
InfoQ:這種方式有什麼局限麼?
Greg:緩存,置於記憶體之中,在大小上有制約,它們的技術局限受限於有多少記憶體給它們使用(下面還會具體展開說明)。
緩存,就算它提供持久化功能,也未必算的上作為SOR的上選。 緩存故意回避了備份到磁片和從中還原的複雜功能,儘管也有簡單的。 RDMBS在過去30年裡開發了豐富的備份、還原、遷移、報表和ETL特性。 而NoSQL則介於兩者之間。
緩存提供了改變數據與訪問資料的程式設計API。 NoSQL和RDBMS則提供了工具,可以執行腳本化語言(比如SQL、UnSQL和Thrift)。
但關鍵一點是要記住緩存並不想成為你的SOR。 它能輕鬆地與你的RDBMS和睦相處,為此它並不需要RDBMS所有用的複雜功能。
InfoQ:以後分散式緩存解決方案、NoSQL資料庫和傳統RDBMS互相協同工作,你有何看法?
Greg:速度大幅快于RDBMS,依賴于部署拓撲的NoSQL,還有資料訪問模式,分散式緩存可以位於這三者之間的任意位置。 那些需要更低延時的人可以將緩存作為NoSQL的一個補充,就像現在對待RDBMS那樣。
稍有不同的是,在你想將RDBMS擴展到多個節點時,經常會難於擴展,或者影響程式設計契約,或者受制于
(責任編輯:蒙遺善)