在生產環境中使用預寫日誌WAL的SQLite - victoria
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次寫入事務,並可以進行數千次讀取。在完全緊湊的封裝中,這是一些完全足夠的功能。
相關文章
- 【PG】PostgreSQL 預寫日誌(WAL)、checkpoint、LSNSQL
- Java列舉類在生產環境中的使用方式Java
- 在生產環境使用Docker部署應用Docker
- 非易失性WAL BUFFER解析:WAL日誌讀寫改造
- ForkJoinPool在生產環境中使用遇到的一個問題
- SQLite3原始碼學習(32) WAL日誌詳細分析SQLite原始碼
- 【Swagger】2.不在生產環境暴露,可以修改預設地址Swagger
- 如何建立 Angular library 並在生產環境中消費Angular
- JeecgBoot 如何在生產環境關閉 Swagger 文件bootSwagger
- 單例模式在生產環境jedis叢集中的應用單例模式
- 直播預約 | 在生產環境中,阿里雲如何構建高效能雲原生容器網路?阿里
- SpringBoot多環境日誌配置Spring Boot
- LightDB不記錄WAL日誌的表
- PG wal 日誌的物理儲存分析
- Laravel記錄執行的SQL到日誌(開發環境和生產環境都用得上)LaravelSQL開發環境
- Filebeat 收集K8S 日誌,生產環境實踐K8S
- PostgreSQL的xlog/Wal歸檔及日誌清理SQL
- Webpack中的sourcemap以及如何在生產和開發環境中合理的設定sourcemap的型別Web開發環境型別
- 雲端設計平臺Coohom在生產環境中使用istio的經驗與實踐
- Postgres使用pg_resetwal命令修改wal日誌檔案大小的方法
- 在生產環境中除錯 Angular 應用程式而不顯示源對映除錯Angular
- PG wal日誌LSN相關函式函式
- 如何在生產環境中通過Restful API的方式請求重啟Spring Boot應用?RESTAPISpring Boot
- Telescope 在生產環境配置的許可權,還是彈出 403 頁面
- 【機器學習】在生產環境使用Kafka構建和部署大規模機器學習機器學習Kafka
- 如何一步步在生產環境上部署django和vueDjangoVue
- 一種分散式預寫日誌系統分散式
- springboot logback配置mybatis 日誌以及多環境配置Spring BootMyBatis
- 如何在生產環境排查 Rust 記憶體佔用過高問題Rust記憶體
- 使用 TensorFlow Extended (TFX) 在生產環境中部署機器學習 丨 Google 開發者大會 2018機器學習Go
- SAP雲平臺CloudFoundry環境hdb build成功的日誌分析CloudUI
- 在生產環境中,阿里雲如何構建高效能雲原生容器網路?(含 PPT 下載)阿里
- 在生產中執行kubernetes上的Istio
- 零基礎寫框架(3): Serilog.NET 中的日誌使用技巧框架
- 雲原生環境下的日誌採集、儲存、分析實踐
- 在生產中執行Elasticsearch的深入指南 – TechNotesElasticsearch
- zaq寫入日誌
- 新硬體環境下日誌模組的設計與演進