不少人會問,Ignite有沒有持久化存儲,或者說是否是一個單純的內存存儲?html
答案是都有,Ignite的原生持久化能夠打開,也能夠關閉。這使得Ignite能夠存儲比可用內存量大得多的數據集,也就是說,少許的操做型數據集能夠只存儲於內存中,而內存裝不下的更大的數據集能夠存儲在磁盤上,這樣將內存做爲一個緩存層,性能會更好。java
Ignite原生持久化是一個分佈式的支持ACID和兼容SQL的磁盤存儲,它能夠與Ignite的固化內存架構透明地集成。Ignite的持久化是可選的,能夠打開也能夠關閉,若是關閉,Ignite就是一個純內存的存儲。node
打開原生持久化以後,Ignite會始終在磁盤上存儲數據的超集,而後根據內存的容量在其中存儲儘量多的數據。好比,一共有100條數據,而後內存容量只能存儲20條,那麼全部的100條都會存儲於磁盤上,而後在內存中只緩存20條數據,這樣性能會更好。git
此外,還要注意,和內存存儲的場景同樣,若是打開了持久化,每個節點只會持有全部數據的一個子集,只會包含該節點做爲主/備節點所屬分區的數據,而整個集羣則包含完整的數據集。github
不一樣於做爲備份持久層的第三方數據庫,Ignite的原生持久化有以下的關鍵特性:數據庫
要啓用原生持久化,須要給集羣節點的配置傳遞一個DataStorageConfiguration
對象:apache
啓用持久化以後,數據和索引將存儲於全部對應節點的內存和磁盤上,下圖顯示了每一個節點中文件系統層面的Ignite持久化的結構。緩存
Ignite能夠爲具體的某個內存區開啓持久化,從而也能夠爲某個緩存開啓持久化,具體細節能夠參見內存區配置相關章節的介紹。性能優化
節點中部署的每一個緩存都有一個惟一的目錄,從上圖能夠看到,節點至少維護了兩個緩存(Cache_A
和Cache_B
)。架構
對於該節點(無論是主節點仍是備節點)的每一個分區,持久化都會在文件系統中建立專用的文件,好比在上圖所示的節點中,負責了分區1,10和564,而索引是每一個緩存一個文件。
若是Cache_A
和Cache_B
屬於同一個緩存組,則會只有一個目錄,兩個緩存會共享分區文件,具體細節能夠參見緩存組的相關文檔。
最後,還有和預寫日誌有關的文件和目錄,具體細節能夠參見預寫日誌和檢查點的相關文檔。
要注意,若是使用Ignite的原生持久化,集羣默認會處於非激活狀態,沒法進行任何CRUD操做,用戶須要手工對集羣進行激活,關於如何激活集羣的更多信息,能夠參見基線拓撲的相關內容。
上面描述的文件層次結構,默認位於${IGNITE_HOME}/work/db
共享目錄下,要改變存儲和WAL文件的默認位置,能夠分別使用DataStorageConfiguration
的setStoragePath(...)
,setWalPath(...)
和setWalArchivePath(...)
方法。
若是在一臺主機上啓動了多個節點,那麼每一個節點進程會在一個好比${IGNITE_HOME}/work/db/node{IDX}-{UUID}
這樣的惟一子文件夾中有本身的持久化文件,這裏的IDX
和UUID
由Ignite在節點啓動時自動計算,這裏有詳細的計算方法。若是在持久化文件層次結構中已經有了若干node{IDX}-{UUID}
子目錄,那麼會按照先進先出的順序在節點間進行分配。若是要爲一個節點分配固定的子文件夾,即便節點重啓也不會發生變化,能夠在集羣範圍使用IgniteConfiguration.setConsistentId()
配置一個惟一值,這個惟一性ID在node{IDX}-{UUID}
字符串中會映射到UUID
。
Ignite能夠在一臺主機中運行彼此隔離的多個節點,這種狀況下,每一個集羣須要在不一樣的目錄結構中存儲本身的持久化文件,使用DataStorageConfiguration
的setStoragePath(...)
、setWalPath(...)
和setWalArchivePath(...)
方法能夠對這些路徑進行修改。
Ignite的原生持久化是一個兼容ACID的分佈式存儲,每一個寫入存儲的更新都會先附加到WAL日誌,該更新由一個惟一ID進行標識,這就是說,在故障或者從新啓動後,集羣始終能夠恢復到最近成功提交的事務或者原子更新。
Ignite原生持久化能夠將Ignite做爲一個分佈式的SQL數據庫。
若是但願在整個集羣中執行SQL查詢,那麼不須要將全部的數據都保存在內存中,Ignite是能夠同時在內存和磁盤上執行SQL查詢的,也就是隻要集羣啓動運行,就能夠執行SQL查詢了,雖然也能夠選擇在集羣重啓後將數據從持久化預加載到內存中,可是這不是必須的。
Ignite持久化的文檔,提供的是一個高層視圖,若是但願瞭解更底層的技術細節,能夠看下面的資料:
相關的性能優化建議,能夠參見固化內存調優相關章節的文檔。
若是要了解Ignite原生持久化在實踐中是如何使用的,能夠參見GitHub上的示例代碼,它也會隨着每一個Ignite發行版一塊兒提供。