与直接写入磁盘相比,WAL(预写日志)如何具有更好的性能?

WAL(预写日志)技术已在许多系统中使用。

WAL的机制是,当客户端写入数据时,系统将执行以下两项操作:

  1. 在磁盘上写入日志并返回到客户端
  2. 数据异步写入磁盘,缓存或内存

有两个好处:

  1. 如果发生某些异常情况(例如断电),我们可以从日志中恢复数据。
  2. 性能很好,因为我们异步写入数据并且可以批量操作

为什么不直接将数据写入磁盘?您直接将每个写入磁盘。成功后,您告诉客户端成功,如果写入失败,则返回失败的响应或超时。

通过这种方式,您仍然可以获得这两个好处。

  1. 在电源关闭的情况下,您无需恢复任何东西。因为返回给客户端的每个成功响应都意味着数据确实在磁盘上。
  2. 性能应相同。尽管我们经常接触磁盘,但是WAL也一样(每次成功写入WAL都意味着它在磁盘上是成功的)

那么使用WAL有什么好处?

digitalsum 回答:与直接写入磁盘相比,WAL(预写日志)如何具有更好的性能?

性能。

  • 列表中的第二步是可选的。对于繁忙的记录,该值可能不会使其再次从高速缓存中移出并移到磁盘上。无需执行这些写操作,只需执行日志写操作即可恢复。

  • 日志写入可以分为更大的顺序写入。对于繁忙的工作负载,延迟日志写入然后执行一次写入可以显着提高吞吐量。

当旋转磁盘是标准技术时,这尤为重要,因为查找时间和旋转延迟是一个问题。这是将磁盘的正确部分放在读/写磁头下的物理过程。使用SSD时,这些注意事项并不是那么重要,但是避免进行一些写操作,而较大的顺序写操作仍然有帮助。

更新:

由于各种原因,SSD在进行较大的顺序写入时也具有更好的性能。这并不像说“没有寻找时间或轮换等待时间,因此只是随机写入”那样简单。例如,将较大的块写入SSD知道为“空闲”的空间(例如,通过对驱动器的TRIM命令)要优于读取-修改-写入,在这种情况下,驱动器还需要管理损耗平衡并可能将更新映射到不同内部块大小。

,

我有些猜想。

直接对磁盘进行每次写入都不需要关闭电源即可恢复。但是性能问题需要用两种方式来讨论。

情况1:

所有存储设备都在旋转磁盘。 WAL方式将具有更好的性能。因为在编写WAL时是顺序写入。将数据写入磁盘操作是随机写入。随机写入的性能比旋转磁盘的顺序写入要差得多。

情况2: 您所有的设备都是SSD。则性能可能不会有太大差异。因为顺序写入和随机写入的SSD性能几乎相同。

,

正如您所注意到的,WAL的关键作用是耐用性。将突变提交给WAL之后,您可以返回到调用方,因为即使系统崩溃,该突变也永远不会丢失。

如果将更新直接写入磁盘,则有两个选项:

  1. 将所有记录写到某个文件的末尾
  2. 文件具有某种结构

如果您选择1),那么不必说读取成本为O(变异),因此几乎每个系统都使用2)。 RocksDB使用LSM,该LSM使用在内部按键排序的文件。因此,“直接写入磁盘”意味着您可能必须重写当前键之后的所有记录。那太贵了,所以你代替

  1. 写入WAL以保持持久性
  2. 更新内存表(在RAM中)

由于内存表和磁盘上的文件已排序,因此读取访问仍然相当快。更新内存中的排序结构很容易,因为那只是一棵平衡的树。当您将内存表刷新到磁盘和/或运行压缩时,由于多次写入操作,您会将文件结构重写为更新状态,这使每次写入的成本大大降低。

本文链接:https://www.f2er.com/3166534.html

大家都在问