MemSQL 自稱是最快的內存數據庫。目前已發布了2.5版本。
MemSQL 具有以下特點
1 高效的並行,尤其是分布式的MemSQL.
2 高效的並發,采用lock-free的內存數據結構skip list 和hash.支持MVCC.
3 查詢執行計划編譯成C++的形式,可以高效執行並且可以重用
4 支持數據的冗余存儲,提高可用性
5 支持重放事物日志的復制
6 支持JSON格式的數據處理
下面來看看Memsql的share-nothing分布式架構
兩層架構:分為aggregator 和 leaf
Aggregator 存儲元數據,負責分發sql給leaf,然后綜合leaf的查詢結果。aggregator可以有多個,其中有一個為主aggregator。 主aggregator 還可以執行DDL和負責Leaf的auto-failover.其它普通aggregator 則不行。當主aggregator 失效,可以從其它普通aggregator 選擇一個通過sql命令設置為主aggregator 。
Leaf上存儲真正的數據,數據通過主鍵hash存儲到各個leaf節點,leaf之間的數據均勻分布不會傾斜。目前還不支持范圍分區。在建庫時指定分區數,分區數應該為leaf節點的整數倍,一般設為8倍。每個leaf都是一個分庫,分取數據存儲在分庫的表中。表只持二級索引,同時支持以主鍵為前綴的唯一索引。
兩種表類型:
參照表(reference table): 數據分布在主aggregator和每個leaf節點。每個節點的數據都是完整的(沒有分區)。參照表同過復制從主aggregator向每個leaf節點同步數據。另外參照表的寫只能在主aggregator進行。
分布表 (sharded table):數據通過hash分片存儲在每個leaf節點,每個leaf節點只有部分數據。
數據冗余:
可用組(availability group),每個組是一些leaf的集合。組與組之間是冗余存儲的。目前最多支持兩個組。以兩個組為例,每個組都包含完整數據,每個分區表在兩個組都有一分copy.可以基於電力和網絡條件進行分組。
擴展性:
支持動態增刪Leaf節點,但需要執行rebalance partitions命令來重新分布分區數據。rebalance 操作都是在線進行的,即操作過程中不影響數據正常訪問。rebalance操作的單位是庫,最小粒度是 partition.
下面是leaf節點狀態變化圖

MemSQL兼容mysql協議。支持mysql的ODBC,JDBC及其它語言接口。
一些思考:
1 支持mysql 協議,使的memsql學習成本較低,同時mysql的ODBC,JDBC可以直接拿來使用,提高了可用性,同時也減少了MemSQL自身的開發成本。
2 redundancy_level目前最高支持2.集群中出現兩個Leaf節點同時故障的可能性不是很低。后需應該支持3及以上的level;在redundancy_level為2的情況下,如果一個leaf節點出現故障,對應的冗余節點負載一般會提升一倍,負載不均衡,很可能造成新的故障。
3 availability group是一個很好的分組方式,可以將不同的組放在不同的機房,提高可用性。
4 對於reblance table 操作,可以做到在線的方式進行,感覺難度比較大,但文檔中沒有看到更詳細的實現說明。
參考: