Apache Ignite原生持久化概述

不少人會問,Ignite有沒有持久化存儲,或者說是否是一個單純的內存存儲?html

答案是都有,Ignite的原生持久化能夠打開,也能夠關閉。這使得Ignite能夠存儲比可用內存量大得多的數據集,也就是說,少許的操做型數據集能夠只存儲於內存中,而內存裝不下的更大的數據集能夠存儲在磁盤上,這樣將內存做爲一個緩存層,性能會更好。java

Ignite原生持久化

Ignite原生持久化是一個分佈式的支持ACID和兼容SQL的磁盤存儲,它能夠與Ignite的固化內存架構透明地集成。Ignite的持久化是可選的,能夠打開也能夠關閉,若是關閉,Ignite就是一個純內存的存儲。node

打開原生持久化以後,Ignite會始終在磁盤上存儲數據的超集,而後根據內存的容量在其中存儲儘量多的數據。好比,一共有100條數據,而後內存容量只能存儲20條,那麼全部的100條都會存儲於磁盤上,而後在內存中只緩存20條數據,這樣性能會更好。git

此外,還要注意,和內存存儲的場景同樣,若是打開了持久化,每個節點只會持有全部數據的一個子集,只會包含該節點做爲主/備節點所屬分區的數據,而整個集羣則包含完整的數據集。github

不一樣於做爲備份持久層的第三方數據庫,Ignite的原生持久化有以下的關鍵特性:數據庫

  • SQL查詢能夠跨越內存和磁盤的完整數據集,這意味着Ignite能夠做爲之內存爲中心的分佈式SQL數據庫;
  • 不須要將全部的數據和索引放在內存中,Ignite持久化能夠在磁盤上存儲數據的超集,而後只將最經常使用的子集保存在內存中;
  • 即時集羣重啓。若是整個集羣下線,那麼不須要從Ignite持久化中經過數據預加載對內存進行預熱,只要全部節點組成集羣,那麼整個集羣就會變爲可用狀態;
  • 數據和索引以相似的格式存儲於內存和磁盤上,這樣有助於在內存和磁盤之間移動數據時昂貴的轉換開銷;
  • 經過接入第三方的解決方案,能夠建立完整的或者增量的集羣快照功能。

用法

要啓用原生持久化,須要給集羣節點的配置傳遞一個DataStorageConfiguration對象:apache

啓用持久化以後,數據和索引將存儲於全部對應節點的內存和磁盤上,下圖顯示了每一個節點中文件系統層面的Ignite持久化的結構。緩存

內存區和緩存級的持久化

Ignite能夠爲具體的某個內存區開啓持久化,從而也能夠爲某個緩存開啓持久化,具體細節能夠參見內存區配置相關章節的介紹。性能優化

文件系統中的原生持久化結構

節點中部署的每一個緩存都有一個惟一的目錄,從上圖能夠看到,節點至少維護了兩個緩存(Cache_ACache_B)。架構

對於該節點(無論是主節點仍是備節點)的每一個分區,持久化都會在文件系統中建立專用的文件,好比在上圖所示的節點中,負責了分區1,10和564,而索引是每一個緩存一個文件。

緩存組和分區文件

若是Cache_ACache_B屬於同一個緩存組,則會只有一個目錄,兩個緩存會共享分區文件,具體細節能夠參見緩存組的相關文檔。

最後,還有和預寫日誌有關的文件和目錄,具體細節能夠參見預寫日誌檢查點的相關文檔。

集羣激活

要注意,若是使用Ignite的原生持久化,集羣默認會處於非激活狀態,沒法進行任何CRUD操做,用戶須要手工對集羣進行激活,關於如何激活集羣的更多信息,能夠參見基線拓撲的相關內容。

上面描述的文件層次結構,默認位於${IGNITE_HOME}/work/db共享目錄下,要改變存儲和WAL文件的默認位置,能夠分別使用DataStorageConfigurationsetStoragePath(...)setWalPath(...)setWalArchivePath(...)方法。

若是在一臺主機上啓動了多個節點,那麼每一個節點進程會在一個好比${IGNITE_HOME}/work/db/node{IDX}-{UUID}這樣的惟一子文件夾中有本身的持久化文件,這裏的IDXUUID由Ignite在節點啓動時自動計算,這裏有詳細的計算方法。若是在持久化文件層次結構中已經有了若干node{IDX}-{UUID}子目錄,那麼會按照先進先出的順序在節點間進行分配。若是要爲一個節點分配固定的子文件夾,即便節點重啓也不會發生變化,能夠在集羣範圍使用IgniteConfiguration.setConsistentId()配置一個惟一值,這個惟一性ID在node{IDX}-{UUID}字符串中會映射到UUID

單主機中隔離集羣的節點

Ignite能夠在一臺主機中運行彼此隔離的多個節點,這種狀況下,每一個集羣須要在不一樣的目錄結構中存儲本身的持久化文件,使用DataStorageConfigurationsetStoragePath(...)setWalPath(...)setWalArchivePath(...)方法能夠對這些路徑進行修改。

事務保證

Ignite的原生持久化是一個兼容ACID的分佈式存儲,每一個寫入存儲的更新都會先附加到WAL日誌,該更新由一個惟一ID進行標識,這就是說,在故障或者從新啓動後,集羣始終能夠恢復到最近成功提交的事務或者原子更新。

SQL支持

Ignite原生持久化能夠將Ignite做爲一個分佈式的SQL數據庫。

若是但願在整個集羣中執行SQL查詢,那麼不須要將全部的數據都保存在內存中,Ignite是能夠同時在內存和磁盤上執行SQL查詢的,也就是隻要集羣啓動運行,就能夠執行SQL查詢了,雖然也能夠選擇在集羣重啓後將數據從持久化預加載到內存中,可是這不是必須的。

Ignite持久化的內部設計

Ignite持久化的文檔,提供的是一個高層視圖,若是但願瞭解更底層的技術細節,能夠看下面的資料:

性能提示

相關的性能優化建議,能夠參見固化內存調優相關章節的文檔。

示例

若是要了解Ignite原生持久化在實踐中是如何使用的,能夠參見GitHub上的示例代碼,它也會隨着每一個Ignite發行版一塊兒提供。

相關文章
相關標籤/搜索