CLFS 稳定存储

将记录写入公共日志文件系统 (CLFS) 流时,记录将放置在日志 I/O 块中, (封送区) 易失性内存中。 CLFS 定期将日志 I/O 块从封送区域刷新到稳定的存储(如磁盘)。 在稳定的存储设备上,日志由一组容器组成,每个容器都是物理介质上的连续范围。 构成流稳定存储的容器集合称为 日志物理日志

下图演示了一个容器。

说明容器、块和记录的示意图。

上图演示了保存三个日志 I/O 块的容器。 第一个日志 I/O 块包含三条记录,第二个块包含五条记录,第三个块包含两条记录。 如图所示,每个日志 I/O 块的开头始终与稳定存储介质上扇区的开头对齐。 请注意,稳定存储上的日志 I/O 块大小各不相同。

CLFS 使用一组三个数字来查找日志中的记录。

  • 容器标识符标识保存记录的容器。

  • 块偏移量提供容器内保存记录的日志 I/O 块开头的字节偏移量。

  • 记录序列号标识日志 I/O 块中的记录。

CLFS 日志记录 (LSN) 的日志序列号实际上包含这三条信息:容器标识符、块偏移量和记录序列号。 但是,提供给日志客户端的 LSN 包含 逻辑容器标识符 ,CLFS 在访问稳定存储上的记录之前必须映射到物理容器标识符。

CLFS 使用逻辑容器标识符为客户端提供一个视图,即日志记录正在写入正在进行的容器序列,而实际上正在回收物理容器。

假设一个日志有三个容器,并且单个客户端正在将 CLFS 记录写入日志。 以下方案演示如何回收容器。

  1. 客户端写入足够的日志记录来填充所有三个容器。

  2. 客户端通过将 ClfsAdvanceLogBaseClfsWriteRestartArea.) 调用到容器 2 中的记录之一来设置日志基 (。 通过执行此操作,客户端表示它不再需要容器 1 中的记录。

  3. 客户端将另一条记录写入日志,并取回新写入的记录的 LSN。 该 LSN 中的逻辑容器标识符为 4。 当记录刷新到稳定存储时,客户端在逻辑容器 4 中看到的记录将转到物理容器 1。

下图演示了此方案:它显示了如何将逻辑容器的客户端序列映射到稳定存储上的物理容器。

说明逻辑容器和物理容器的示意图。

逻辑容器标识符、块偏移量和记录序列号存储在 LSN 中,以便特定流的 LSN 始终形成严格递增的序列。 也就是说,具有逻辑容器标识符) 写入流的日志记录的 LSN (始终大于以前写入同一流的日志记录的 LSN。 LSN 具有双重用途:1) 它们为流的客户端提供有序的记录标识符序列,2) 它们为 CLFS 提供稳定存储上的记录位置。

给定记录的 LSN,可以通过调用以下函数提取逻辑容器标识符、块偏移量和记录序列号。

ClfsLsnContainer

ClfsLsnBlockOffset

ClfsLsnRecordSequence

逻辑容器标识符是一个 32 位数字,因此有 2^32 个可能的逻辑容器标识符,并且它们位于0x0到0xFFFFFFFF的范围内。 一个流最多可以有 2^32 个逻辑容器。

块偏移量存储在 LSN 的 23 位中,但 ClfsLsnBlockOffset 返回一个与稳定存储介质的扇区大小一致的 32 位数字。 块偏移量始终是 512 的倍数。 此外,块偏移量与稳定存储介质的扇区大小保持一致。 例如,如果扇区大小为 1024 字节,则块偏移量将是 1024 的倍数。

记录序列号是一个 9 位数字,因此有 2^9 (512) 可能的记录序列号,并且它们位于0x1FF 0x0范围内。 日志 I/O 块最多可以有 512 条记录。