DAOS整体设计分析 (二)

数据一致性

DAOS 使用校验和提供端到端数据完整性,以更好地确保用户数据不会静默损坏。在写入或更新期间,DAOS 客户端库 (libdaos.so) 在通过网络传输之前计算校验和并将其附加到 RPC 消息。 根据配置,DAOS 服务器可能会或可能不会计算校验和来验证接收到的数据。

1、Requirements

DAOS 将支持两个关键要求。 1. 检测静默数据损坏 - 将在 DAOS 对象的dkey和akey和记录上检测损坏。 至少,当检测到损坏时,将报告错误。 2. 纠正数据损坏 - 当检测到数据损坏时,将尝试使用数据冗余机制恢复数据。

DAOS 支持:
1. 端到端数据完整性作为服务质量属性 - 容器属性用于启用/禁用数据完整性校验和的使用以及定义数据完整性功能的特定属性。
2. 最小化性能影响 - 当没有数据损坏时,端到端数据完整性功能应该对性能影响最小。如果检测到数据损坏,则可能会影响性能以更正数据。正在努力将性能影响降至最低。
3. 注入错误 - 破坏特定记录、密钥或校验和中数据的能力对于测试来说是必要的。故障注入用于模拟网络和磁盘上的损坏。
4. 日志记录 - 当检测到数据损坏时,会在客户端和服务器日志中捕获错误日志。

2、Keys and Value Objects

由于 DAOS 是键/值存储,因此键和值的数据都受到保护,但是,两者的方法略有不同。 对于两种不同的值类型,single 和 array,方法也略有不同。

key的数据保护:

在更新和获取时,客户端计算dkey和akey的数据的校验和,并将其发送到 RPC 中的服务器。 服务器使用校验和验证key。 在枚举key时,服务器将计算key的校验和并将其打包到客户端的 RPC 消息中。 客户端将验证收到的key。keys的校验和不存储在服务器上。 keys的散列被计算并用于在key的服务器树中索引key(请参阅VOS Key Array Stores)。 还期望key仅存储在具有可靠数据完整性保护的SCM中。

value的数据保护:

在更新时,客户端将为该值的数据计算校验和,并将其发送到 RPC 中的服务器。 如果启用了“服务器验证”,服务器将为该值计算一个新的校验和,并与从客户端收到的校验和进行比较以验证该值的完整性。 如果校验和不匹配,则发生数据损坏,并向客户端返回错误,指示客户端应再次尝试更新。 无论是否启用“服务器验证”,服务器都会存储校验和。  VOS 中校验和管理和存储的更多信息,请参阅 VOS。

在获取时,服务器会将存储的校验和连同获取的值返回给客户端,以便客户端可以验证接收到的值。 如果校验和不匹配,则客户端将从另一个副本(如果可用)获取以尝试获取未损坏的数据。

单个值是一个原子值,这意味着写入单个值将更新整个值并读取检索整个值。 其他 DAOS 功能(例如纠删码)可能会将单个值拆分为多个分片,以分布在多个存储节点之间。 整个 Single Value(如果转到单个节点)或每个分片(如果分布式)都将计算校验和,发送到服务器并存储在服务器上。

请注意,单个值或单个值的分片可能小于从中得出的校验和数据的大小。 建议如果应用程序需要许多小的单个值来使用数组类型。

与单值不同,数组值可以在数组的任何部分更新和获取。 此外,对数组的更新是受版本控制的,因此一次提取可以包含来自数组的多个版本的部分。 数组的这些版本化部分中的每一个都称为extents

数组类型的性质要求使用更复杂的方法来创建校验和。 DAOS 使用“chunking”方法,其中每个extent将被分成具有预定“chunk size”的“块”。 校验和将从这些块中派生。 块与绝对偏移量(从 0 开始)对齐,而不是 I/O 偏移量。 下图说明了配置为 4 的chunk大小(在此示例中单位是任意的)。 尽管并非所有块的完整大小都是 4,但仍保持绝对偏移对齐。 范围周围的灰色框代表块。

DAOS整体设计分析 (二)_第1张图片

 3、vos

确定需要在SCM中分配多少额外空间来计算校验和

4、Corrective Actions

当发现数据损坏时,有两种主要的纠正措施选项,数据修复和 SSD 驱逐。

如果启用数据修复,当检测到损坏时,值标识符(dkey、akey、recx)将被放入队列中。 当有可用周期时,值标识符将用于从副本请求数据(如果存在)并在本地重写数据。 这将一直持续到达到 SSD 驱逐阈值,在这种情况下,假定 SSD 已经足够糟糕,不值得在本地修复,并将被要求驱逐。

如果启用磁盘驱逐,当达到 SSD 驱逐阈值时,SSD 将被驱逐。 当前的驱逐方法是基于池和target的,因此需要有适当的映射和机制来驱逐 SSD。当SSD被驱逐时,将调用重建协议。 此外,一旦达到 SSD 驱逐阈值,扫描仪应停止扫描该 SSD 上的任何内容

其他校验和属性:
这些属性在创建容器或池时提供,但也应该能够更新它们。 更新后,它们应该立即处于活动状态。 - 扫描间隔 - 扫描所需的最少天数。 可能需要更长的时间,但如果只有几条记录会填充,那么需要更长的时间。 (池属性) - 禁用scrubbing - 在容器级别和池级别 - 何时驱逐 SSD 的阈值(损坏事件的数量) - 就地更正 - 如果校验和错误数低于驱逐阈值,DAOS 将尝试修复损坏的 数据使用副本(如果存在)。

你可能感兴趣的:(DAOS,存储,服务器,运维)