在生产环境中使用预写日志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次写入事务,并可以进行数千次读取。在完全紧凑的封装中,这是一些完全足够的功能。