如果說雲計算這個新瓶裝的是虛擬化+ SOA/網格計算+SaaS(軟件即服務)的老酒,那么內存計算則重點是釋放了計算這一部分的能量。
但是對內存計算經常有一些誤解:
1、大容量內存很貴
2、 內存計算不會持久化:實際上幾乎所有的內存計算中間件都提供多種內存備份、持久存儲備份以及基於磁盤的swap空間溢出的策略。
3、內存計算要取代數據倉庫:內存計算的目的是要改善那些需要OLTP和OLAP混合處理的可操作數據集(Operational Dataset)的計算,而非歷史數據集(Historical dataset)。簡言之,內存計算不是要把企業的所有數據都放進內存。
4、閃存已經足夠快了:內存計算不是要達到2-3倍的邊際效應提升(Marginal Effect),而是10-100倍的提升,使之前那些不可行的業務和服務成為可能。
5、內存計算等於內存數據庫:首先,內存計算是一種技術而不是某種產品。其次,內存數據庫只是目前內存計算觸手可及的成果,內存計算長期的發展還是在流式處理(Stream Processing)上。此外,內存計算與傳統內存數據庫的區別是:內存計算是為分布式、彈性環境以及內存數據處理而設計的。
一、內存計算產品分類
根據內存計算技術的發展順序,內存計算大致可以分為三類產品:
1、 分布式緩存(Memcached/Redis):主要使用場景就是將頻繁訪問的數據保存在內存中避免磁盤加載。多數產品都是分布式內存key/value存儲,並提供簡單的put和get方法。隨着不斷成熟,與后端的read/write-through,ACID事務,復制和分區,eviction策略等也逐漸加入到產品中,這些特性也成為了后來出現的IMDG/IMCG產品的基礎。
2、內存數據/計算網格(IMDG/IMCG, GemFire/Hazelcast/GridGain):數據網格的顯著特性是co-location計算,將計算過程發送到數據本地執行。這是數據/計算網格的關鍵創新點,在數據量不斷增長的情況下再加數據抓取過來執行計算已經變得不現實了。這種創新也不僅使內存計算從簡單的緩存產品進化,也激發了后來IMDB的誕生。
3、分布式內存數據庫(IMDB, VoltDB/Impala):分布式內存數據庫的顯著特性是增加了基於標准SQL或MapReduce的MPP(大規模並行處理)能力。如果說數據網格的核心是解決數據量不斷增長下計算的困境,那么分布式內存數據庫就是解決計算復雜度不斷增長的困境。它提供了分布式SQL、復雜(分布式共享)索引、MapReduce處理等工具。
值得注意的是,隨着技術的發展,有些界限不再那樣清晰。像現在很多IMDG產品已經具有IMDB的特性,能夠提供復雜的分布式SQL和MapReduce計算能力。不管怎樣,這些產品中的核心技術和算法都是不變的,所以學習時不必過分糾結某個產品到底屬於那一類。
二、應用場景
以上提到的各種內存計算產品可以應用到大數據處理的各個環節上,如下圖所示,其中涉及內存計算的技術標成紅色
1)事務處理:主要分為Cache(Memcached, Redis, GemFire)、RDBMS、NewSQL(以VoltDB為首的)三部分,緩存和NewSQL數據庫是關注的重點。
2)流式處理:Storm本身只是計算的框架,而Spark-Streaming才實現了內存計算式的流處理。
3)分析階段的對比:
通用處理:MapReduce,Spark
查詢:Hive,Pig,Spark-Shark
數據挖掘:Mahout,Spark-MLLib,Spark-GraphX
從上可以看出,Spark生態圈的子項目以及Impala都是值得關注的重點。
三、核心技術
因為內存計算主要釋放了雲計算中的計算部分的能量,所以它主要涉及並行/分布式計算和內存數據管理這兩大方面的技術體系:
1、並行/分布式計算:網絡拓撲、RPC通信、系統同步、持久化、日志。
2、內存數據管理:字典編碼、數據壓縮、內存中數據格式、數據操作、內存索引、內存中並發控制和事務。
以下簡單列舉了內存計算主流產品中涉及到的技術點:
(1)Memcached/Redis:一致性哈希。
(2)GridGain:DHT、refresh-ahead、off-heap、continuous query。
(3)Infinispan:LIRS eviction。
(4)Spark(LMAX):immutable model(RDD)。
(5)VoltDB:single-threaded。
(6)Impala(Dremel):LLVM optimizing、nested record、MPP