1. 程式人生 > >ArangoDB---儲存引擎(RocksDB)

ArangoDB---儲存引擎(RocksDB)

儲存引擎

儲存引擎位於ArangoDB資料庫的最底層。儲存引擎負責將文件儲存在磁碟上,在記憶體中儲存副本,提供索引和快取以加快查詢速度。

3.1版本之前,ArangoDB僅支援記憶體對映檔案(MMFiles)作為唯一的儲存引擎。從3.2之後,ArangoDB開始支援可插拔的儲存引擎。第二個支援的引擎是來自Facebook的RocksDB。

MMFiles RocksDB
預設 可選的
資料集需要適合記憶體 儘可能多地處理磁碟上的資料
記憶體中的索引 記憶體熱設定,磁碟上的資料和索引
由於重建索引而導致重啟速度緩慢 快速啟動(不重建索引)
非易失性集合(僅在記憶體中,可選) 收集資料一直存在
集合級別鎖定(寫塊讀取) 併發讀取和寫入

部落格文章:Comparing new RocksDB and MMFiles storage engines

RocksDB是一個可嵌入的永續性key-value儲存。它是一個日誌結構的資料庫,並針對快速儲存進行了優化。

MMFiles引擎針對資料放入主記憶體的用例進行了優化。它允許非常快速的併發讀取。但是,寫操作會阻塞讀操作,並且鎖定是在集合級別上的。索引始終在記憶體中,並在啟動時重建。這樣可以獲得更好的效能,但導致啟動時間更長。

RocksDB引擎針對大型資料集進行了優化,即使資料集比主記憶體大得多,也可以確保穩定的插入效能。索引始終儲存在磁碟上,但快取用於加速效能。RocksDB使用文件級別的鎖來允許併發寫入。寫入不會阻止讀取。讀取不會阻止寫入。

必須為整個伺服器/叢集選擇引擎,不可以混合使用。事務處理和預寫日誌格式在各個引擎中是不同的,因此不能混合使用。

RocksDB

優點

RocksDB是一個非常靈活的引擎,可以配置為各種使用情況。

RocksDB的主要優點是

文件級鎖
支援大型資料集
永續性索引
注意事項

RocksDB允許併發寫入。但是,當寫入相同的文件時會產生寫入衝突。MMFiles引擎不會發生這種情況,因此將引擎切換為RocksDB要做好出現這種異常的準備。執行AQL時可以專門鎖定集合。這將避免寫入衝突,但也阻止了併發寫入。

目前,另一個限制是由於RocksDB中的事務處理。事務總數是有限制的。如果你有一個修改大量文件的語句,則需要在中間提交資料。這將在預設情況下自動完成AQL。

效能

RocksDB是基於日誌結構的合併樹。下面是一些很好的介紹:

http://www.benstopford.com/2015/02/14/log-structured-merge-trees/
https://blog.acolyer.org/2014/11/26/the-log-structured-merge-tree-lsm-tree/
其基本思想是資料是按層次組織的,每個層次都比前一個要素要大。新的資料將駐留在較小的級別,而舊的資料將下移到較大的級別。這允許在較長時間內支援高速插入。原則上不同的級別可能駐留在不同的儲存介質上。較小的放在快速的固態硬碟,大的級別就放在較大的機械硬碟。

RocksDB本身提供了許多不同的旋鈕來根據您的使用情況微調儲存引擎。ArangoDB支援使用下面的選項最常見的。

儲存引擎的效能報告可以在這裡找到:

https://github.com/facebook/rocksdb/wiki/performance-benchmarks
https://github.com/facebook/rocksdb/wiki/RocksDB-Tuning-Guide
ArangoDB選項

ArangoDB擁有一個用於RocksDB中持久索引的快取。該快取的總大小通過該選項控制
--cache.size

RocksDB也有一個儲存在磁碟上的塊快取。該快取的大小由該選項控制
--rocksdb.block-cache-size

ArangoDB預設在兩個快取之間平均分配可用記憶體。
ArangoDB為RocksDB中的各個級別選擇適合於通用應用程式的大小。
RocksDB日誌結構化的資料級別越來越大

MEM: --
L0:  --
L1:  -- --
L2:  -- -- -- --
...

新的或更新的文件首先儲存在記憶體中。如果這個memtable達到了給定的限制
--rocksdb.write-buffer-size
它將轉換為SST檔案並插入0級。

以下選項控制每個級別的大小和深度。

--rocksdb.num-levels N
將等級數限制為N.預設情況下,等於7,很少有理由改變這個。只有前一個數據太多才會開啟一個新的級別。

--rocksdb.max-bytes-for-level-base B
L0最多可以容納B位元組。

--rocksdb.max-bytes-for-level-multiplier M
每個級別最多是前一個位元組的M倍。因此,L級的最大位元組數可以計算為
max-bytes-for-level-base * (max-bytes-for-level-multiplier ^ (L-1))

未來

RocksDB對事務規模施加了限制。它經過優化,能夠非常有效地處理小型交易,但卻有效地限制了交易的總規模。

ArangoDB目前使用RocksDB的事務來實現ArangoDB事務處理。因此,在使用RocksDB引擎時,ArangoDB交易也有相同的限制。

我們將通過在未來版本的ArangoDB中引入分散式事務來改善這一點。這將允許處理大型交易作為一系列小型RocksDB交易,從而消除尺寸限制。