在生產環境中使用預寫日誌WAL的SQLite - victoria

banq發表於2021-05-22

SQLite(“ see-quell-lite”)是一種輕量級的Sequel或結構化查詢語言(SQL)資料庫引擎。而不使用客戶端-伺服器資料庫管理系統模型,SQLite完全包含在單個檔案中。它是庫,資料庫和資料,都在一個包中。
對於某些應用程式,SQLite是生產資料庫的可靠選擇。它是輕量級的,超行動式的,並且沒有外部依賴性。還記得MacBook Air首次問世的時間嗎?沒什麼
SQLite最適合在以下應用程式中進行生產使用:
  • 期望快速簡單的設定。
  • 小包裝要求高可靠性。
  • 擁有,並希望保留很小的空間。
  • 讀大量但不寫大量。
  • 不需要多個使用者帳戶或多版本併發快照之類的功能。

如果您的應用程式可以從SQLite的無伺服器便利中受益,則您可能想了解可用於管理資料庫更改的不同模式。
 

有無預寫日誌WAL區別
POSIX系統呼叫fsync()將由指定檔案描述符引用的緩衝資料(儲存在作業系統快取記憶體中的資料)提交到永久儲存器或磁碟。這與理解SQLite的兩種模式之間的差異有關,因為fsync()它將阻塞直到裝置報告傳輸完成為止。
為了提高效率,SQLite使用原子提交將資料庫更改批處理為單個事務。這使許多事務可以同時明顯地寫入資料庫檔案。原子提交使用兩種模式之一執行:回滾日誌或預寫日誌(WAL)。
 

  • 1. 回滾日誌

一個回滾日誌基本上是之前上的資料庫檔案發生更改寫SQLite所建立的備份檔案。它具有透過在磁碟寫入過程中損壞寫入操作的情況下幫助SQLite將資料庫還原到其原始狀態來提供高可靠性的優勢。
假定冷快取,SQLite首先需要從資料庫檔案讀取相關頁面,然後才能對其進行寫入。資訊被讀取到作業系統快取中,然後傳輸到使用者空間中。SQLite在資料庫檔案上獲得了保留鎖,從而防止其他程式寫入資料庫。此時,其他程式可能仍會從資料庫中讀取。
SQLite建立一個單獨的檔案,即回滾日誌,其中包含將要更改的頁面的原始內容。回滾日誌最初存在於快取中,並被fsync()寫入永久磁碟儲存中,以使SQLite可以在資料庫的下一個操作受到損害時還原資料庫。
然後,SQLite獲得一個排他鎖,以防止其他程式讀取或寫入,並將頁面更改寫入快取中的資料庫檔案。由於寫入磁碟的速度比與快取的互動慢,因此不會立即發生磁碟寫入。回滾日誌將繼續存在,直到第二fsync()財政將更改安全地寫入磁碟為止。從使用者空間過程的角度來看,一旦刪除回滾日誌,即會立即進行磁碟更改(COMMIT或事務結束),因此,原子提交。但是,從事務的角度來看,完成COMMIT所需的兩個fsync()操作使此選項比SQLite鮮為人知的WAL模式要慢。
  • 2. 預寫日誌記錄(WAL)

回滾日誌方法使用一個單獨的檔案來保留原始資料庫狀態,而WAL方法使用一個單獨的WAL檔案來代替記錄更改。將一個或多個提交的記錄附加到WAL時,將發生WAL模式下的COMMIT,而不是依賴於將更改寫入磁碟的COMMIT。這樣的優點是不需要阻塞對資料庫檔案的讀取或寫入操作即可發出COMMIT,因此可以同時進行更多事務。
WAL模式引入了檢查點的概念,即在WAL檔案的所有事務都傳輸到資料庫檔案之前將其同步到永續性儲存。您可以選擇指定何時發生,但是SQLite提供了合理的預設值。檢查點是原子提交的WAL版本。
在WAL模式下,寫事務的執行速度比傳統的回滾日誌模式下要快。每個事務都涉及在COMMIT發出事務結束之前,僅將更改寫入WAL檔案一次,而不是兩次寫入-回滾日誌,然後寫入磁碟。
 
對於中等大小的大量讀取應用程式,SQLite可能是一個不錯的選擇。在WAL模式下使用SQLite可能會更好。在沒有配置IOPS的最小EC2例項上進行的基準測試,使這名小警官每秒可以進行400次寫入事務,並可以進行數千次讀取。在完全緊湊的封裝中,這是一些完全足夠的功能。
 

相關文章