您當前的位置:首頁 > 寵物

DolphinDB資料庫日誌與CacheEngine教程

作者:由 DolphinDB智臾科技 發表于 寵物時間:2022-04-28

這篇教程介紹DolphinDB中的Redo Log和CacheEngine,它們相互之間的關係以及對整體效能的影響。

需要注意的是,它們只對DFS資料庫起作用,對磁碟表和流表不起作用。另外,啟用了Redo Log之後必須啟用CacheEngine。

1 Redo Log

1.1 什麼是Redo Log

在關係型資料庫系統中,預寫式日誌(Write-ahead logging, WAL)是用於提供原子性和永續性的一系列技術。DolphinDB中的Redo Log與WAL的概念類似。簡而言之,Redo Log的核心思想是:只有在描述更改的日誌記錄重新整理到持久化儲存以後,才對資料庫檔案進行修改。如果遵循這個過程,就不需要在每次提交事務時都將資料頁重新整理到磁碟上,因為在資料庫發生宕機時,可以使用日誌來恢復資料庫,尚未應用的所有更改可以從日誌記錄重做。

使用Redo Log的主要好處是大大減少了磁碟的寫入次數,因為在事務提交時只需要將日誌檔案重新整理到磁碟,而不是將事務涉及到的所有檔案重新整理。使用Redo Log的另一個原因是順序寫入效能更好。由於DolphinDB中一張表的每一列都分別儲存為一個檔案,當列數特別多時,這種差異尤為明顯。

Redo Log有兩種回收機制,一種是定期回收,一種是大小到限度時回收,兩種方法都有對應的引數可以進行設定。

1.2 為什麼需要Redo Log

引入Redo Log主要是為了解決斷電、資料庫系統宕機等極端情況下的資料一致性問題。如果沒有Redo Log,但是仍要解決這個問題,那麼每次提交事務以後都必須呼叫fsync來將所有記憶體中的資料刷到磁碟上,那麼整個系統的效能會急劇下降。這是由於硬碟每秒鐘fsync的次數非常有限。引入Redo Log以後,只需對個別log檔案進行fsync即可,而資料檔案採用非同步的方式寫入,有利於整體的寫入效能。Redo Log主要用於資料庫實時寫入的場景。如果只是用於對歷史資料分析,可以考慮不開啟Redo Log。

1.3 Redo Log對效能的影響

Redo Log會增加磁碟的負載,這是由於在資料檔案以外額外寫了Redo Log檔案;也會增加對記憶體的使用,由於系統內部對還未寫到磁碟上的資料檔案進行了快取。基於以上兩點,開啟Redo Log以後,系統的整體負載會有上升,寫入效能也會下降,下降幅度與實際的資料有關,一般在20%左右。另外系統的啟動時間也有可能增加,因為啟動時需要對上次遺留的Redo Log進行重做,重做過程當中DFS資料庫處於不可用狀態。

1.4 相關引數介紹

如果是叢集模式,Redo Log只在資料節點上需要配置,只對資料庫的資料存部分做Redo,不涉及主節點。因為主節點上只儲存DFS資料庫的元資料,與Redo Log無關。

dataSync:該引數控制是否使用Redo Log功能,取值為1代表開啟Redo Log。預設值為0,表示不啟用該功能。

redoLogDir:該引數控制Redo Log檔案的存放位置,一般建議將該位置設定到ssd上以獲取最佳的效能。預設在homeDir(由home引數決定)下的log/redoLog目錄下。如果是叢集模式,注意要分別設定不同資料節點的目錄,避免使用相同目錄,造成寫入錯誤。

redoLogPurgeLimit:該引數控制Redo Log檔案佔用的最大空間,單位為GB,預設值為4。當redo Log檔案大小超過該值時會自動開始回收。

redoLogPurgeInterval:該引數控制Redo Log自動回收的週期,單位為秒,預設值為30,表示每30秒自動回收一次。

2 CacheEngine

2.1 什麼是CacheEngine

CacheEngine是DolphinDB中的一種資料寫入快取機制,它是為了解決資料表列數過多的情況下寫入效能急劇下降的問題而引入的。DolphinDB採用的是列式儲存,一個分割槽內的每一列資料單獨存放在一個檔案中。如果表的列數過多(比如物聯網場景下同時記錄幾千個指標),每進行一次資料寫入,就要對幾千個物理檔案進行操作(開啟,寫入,關閉等)。引入CacheEngine以後,寫入操作時首先寫入快取中,到達一定閾值以後,開始非同步將快取中的資料寫入磁碟中。

CacheEngine能夠提升寫入效能的基本邏輯在於:對一個檔案進行寫入時,寫入1行資料和寫入1000行資料的時間基本相等,大部分時間都花在開啟和關閉檔案上;因此,如果把多次少量的寫入快取起來,在一次檔案IO中批次寫入,那麼就可以節省許多對檔案進行開啟和關閉帶來的時間開銷,從而在整體上提升系統的寫入效能。

2.2 CacheEngine與Redo Log的關係

使用CacheEngine時,為了防止斷電、宕機等情況下快取中的資料丟失,需要配合Redo Log來完成。這種情況下,Redo Log的垃圾回收就會依賴於CacheEngine的垃圾回收。簡而言之,為了保證極端情況下還能夠從Redo Log中恢復資料,Redo Log在對某個事務的日誌進行回收之前,首先要向CacheEngine確認該事務已經不在快取當中,即已經被CacheEngine回收。因此要注意不可以將CacheEngine的快取區大小設定得太大,否則會導致事務長期滯留在快取當中,無法被Redo Log回收,導致Redo Log佔用的空間持續增長。如果發生這種情況,可能導致Redo Log佔滿磁碟空間,導致後續的寫入失敗。也可能導致資料庫在恢復時,重做大量事務,導致重啟時間過長。

2.3 CacheEngine對效能的影響

CacheEngine的使用會減少磁碟的負載,因為寫入的次數減少了,少量多次的寫入變成了批次寫入;會增加記憶體佔用,因為系統對還未寫入磁碟的資料進行了快取;可以提高系統的寫入效能,列數增多是尤為明顯。

2.4 相關引數介紹

chunkCacheEngineMemSize: 該引數代表CacheEngine最大滯留的資料大小,單位為GB,型別為double。預設值為0。0,代表不使用CacheEngine。如該值大於0,那麼當CacheEngine佔用記憶體大於該值的30%時,會主動開始非同步回收。除此以外,資料庫每分鐘會對CacheEngine進行一次垃圾回收。

2.5 相關函式介紹

purgeCacheEngine: 使用該函式可以手動清空快取,需要注意的是隻有已經完成的事務才會被清空,正在進行但是還沒有提交的事務不會被清空。

getCacheEngineStat: 使用該函式檢視CacheEngine的狀態。

getCacheEngineMemSize: 使用該函式檢視CacheEngine已經使用的記憶體大小。

3 DolphinDB叢集的啟動流程以及注意事項

DolphinDB叢集啟動流程一般如下,首先啟動master節點,然後啟動各agent節點,最後啟動資料節點。

如果啟動時間過長,可能的原因是上一次叢集執行結束後遺留的Redo Log過多,原因有三個:

Redo Log配置的磁碟空間太大,導致Redo Log檔案一直沒有回收。

Redo Log配置的回收週期太長,導致一直沒有觸發回收。

CacheEngine配置的記憶體太大,導致CacheEngine一直沒有回收,阻塞了Redo Log的回收。

為了避免以上幾種情況,需要注意叢集的引數中,合理配置redoLogPurgeLimit, redoLogPurgeInterval, chunkCacheEngineMemSize這三個引數。

還有一種可能的情況是Redo Log檔案儲存在機械硬碟上,叢集啟動的時候讀取這些檔案耗費的時間較多,因此建議將redoLogDir配置到ssd上,也可以加快叢集的重啟速度。

4 RaftLog

4.1 什麼是Raft

Raft是一種在分散式系統中用來維持多副本一致性的協議。在一個具有一致性的性質的集群裡面,同一時刻所有的結點對儲存在其中的某個值都有相同的結果,即對其共享的儲存保持一致。叢集具有自動恢復的性質,當少數結點失效的時候不影響叢集的正常工作,當大多數叢集中的結點失效的時候,叢集則會停止服務(不會返回一個錯誤的結果)。

4.2 Raft在DolphinDB中的應用

DolphinDB中引入了raft協議來完成元資料的高可用,即控制節點的高可用。DolphinDB中的控制節點上儲存了分散式檔案系統的元資料,如果控制節點宕機,則整個系統會處於不可用狀態。

而有了Raft支援的高可用以後,我們可以同時開啟多個控制節點,儲存相同的元資料資訊,任意時刻只要大多數節點處於可用狀態,整個系統就是可用的。

關於元資料高可用,可以參考DolphinDB高可用叢集部署教程。

5 必須使用Log的場景

以下幾種場景必須使用以上的log:

實時資料寫入場景,對資料可靠性有要求,無法接受宕機情況下資料丟失的情況,必須開啟Redo Log和CacheEngine。

資料寫入場景下,DFS表的列數特別多的情況,必須開啟Redo Log和CacheEngine。

要求DFS資料庫具有高可用的場景,必須開啟RaftLog。

6 總體效能最佳化的建議

根據以上敘述,為了提升資料庫的整體寫入效能,有以下幾點建議:

將所有元資料的存放目錄以及Redo Log存放目錄配置到ssd上,有條件的情況下使用工業級ssd。具體建議如下:

dfsMetaDir: 控制節點元資料儲存目錄,設定到SSD磁碟上,在controller。cfg裡面設定。

chunkMetadir: 資料節點元資料儲存目錄,設定到SSD磁碟上,在cluster。cfg裡面設定。

rodoLogDir: 設定到SSD磁碟上,在cluster。cfg裡面設定。

persistenceDir: 流資料的儲存路徑,建議設定到SSD磁碟上。在cluter。cfg中設定。

logFile: 各個節點的執行日誌,記錄節點的執行狀態、錯誤資訊等,可以寫到HDD磁碟上。controller。cfg, agent。cfg, cluster。cfg中設定。

batchJobDir: 批處理任務的日誌目錄,例如submiJob提交的任務日誌,可以寫到HDD磁碟上。在cluster。cfg中設定。

jobLogFile: 各個節點的query日誌,記錄各個query的執行情況,可以寫到HDD磁碟上。cluster。cfg中設定。

2。 合理配置RedoLog的記憶體大小和垃圾回收週期,一般建議配置記憶體不超過4G,不低於1G,回收週期配置為60秒。

3。 合理配置CacheEngine的記憶體大小,不宜過大或過小,最大不超過資料節點記憶體配置的1/4。1~4G的記憶體大小適合大部分情況,具體結合機器的實際資源和寫入資料的速率來決定。

標簽: redo  log  寫入  CacheEngine  磁碟