![](https://img.haomeiwen.com/i8560396/a911862dc192dce9.png)
为了更加充分利用机器资源,Meta 对 RocksDB 基于 Tectonic 分布式文件系统实现了存算分离改造。Tectonic 分布式文件系统提供了类似 HDFS 的文件系统 API。
本文主要记述了 Meta 在实现存算分离过程中遇到的挑战和响应的解决方案。
挑战
- 性能问题。网络延迟带来的性能下降
- 支持低成本冗余。分布式文件系统的数据冗余带来了额外存储开销
- 多写入者的完整性。多个节点同时读取数据,一个节点修改数据。在运行过程中,需要保证任意时刻都只能有一个节点可以修改数据
- 处理远程 IO。相对于本地文件系统,分布式文件系统 IO 错误类型更多,处理方式也不相同
解决方案
性能优化
IO 长尾延迟优化
长尾延迟可能由慢节点造成。怀疑节点变慢时,通过其他节点处理负载。
- 动态提前重建 (Dynamic Eager Reconstructions)。在第一个读请求发起后一段时间,发起第二个读请求,使用最早返回的请求结果。
- 动态追加超时 (Dynamic Append Timeouts)。成功写入大多数节点后响应用户写入请求。写入超时时,记录当前成功的写入长度。重新发起写入操作。
- 隔离的配额完全块写入 (Hedged Quorum Full Block Writes)。对于大写入,创建完整的 block,并写入数据。写入分为两个阶段,permit acquisition 和 payload transfer。第一个阶段,客户端从资源池获取存储节点的写入权限。第二个阶段,客户端从第一阶段中获取的存储节点中,选择最早响应实际写入的存储节点。
Metadata Cache
由于部分元数据读取的相关操作对延迟要求加高,如获取目录列表、判断文件是否存在、查询文件大小等。针对使用频率非常高的 metadata 设计了对应的 Metadata Cache 进行元数据缓存。
Local Flash Cache
对于重度读的应用场景,使用 Cachelib在 NVM 设备中实现了 block cache,作为现有基于 DRAM 的 block cache 扩展。这个特性的官方名称是 SecondaryCache。
IO Handling
- 调大 compaction 缓存,充分利用 Tectonic 的大批量写入友好的特性
- 改进预读机制,通过历史统计信息设置预读大小。避免过大的预读导致大量的网络开销,也避免过小的预读导致性能下降
Parallel IO
对于需要读取多个 key 的 MultiGet() 操作,同时并行发起多个 block read,降低读取延迟,可能会导致更多的 CPU 消耗
- Compaction Tuning
Tectonic 支持的读写 IOPS 都更低,更大的 SST 文件可能会带来更好的性能
Redundancy with low overhead
SST 文件
SST 文件消耗了绝大部分的存储空间和写入贷款,需要高可靠低成本的编码方式。最终使用了 [12,8] 编码方案,每个数据块12个编码单元,8个是数据块,4个是校验块。1.5倍的空间和写入带宽开销,带来更好的 SLA 保障
WAL 文件
WAL 文件需要实现低延迟的持久化存储。采用了 5-Way Replica 编码,每个数据块有5个副本。对于大更新量的场景,使用 Striped Encoding,多个节点并行处理 stripe
Data Integrity With Multiple Writers
IO Fencing 分布式锁机制。每个进程拥有一个 token,在后续的目录和文件操作中都使用该 token。字典序更大的 token更新,持有旧 token 的进程将无法对文件和目录进行修改
Preparing RocksDB for remote calls
Differential IO Timeout
- flush、compaction 的超时时间为秒级
- Get、iterator 的超时时间为亚秒级
- 新增 request deadline 支持
Failure Handling in RocksDB
分布式存储场景下,IO 错误发生更频繁,种类更丰富。通过对错误是否是短暂且可恢复进行分类,对错误返回状态进行了增强。在错误码的基础上,增加了是否可重试、影响范围和是否有永久数据丢失等错误元信息。
IO Instrumentation
开发 IO Trace 工具
Utilities
现有 cmd 工具的移植
性能测试
![](https://img.haomeiwen.com/i8560396/32906a8ff2fa4c31.png)
![](https://img.haomeiwen.com/i8560396/7b3a088bbd80d76e.png)
测试用例使用 20 字节长的 key 和 400 字节长的 value,共 10 亿个 key,总数据量大小 200 GB。
写入带宽维度,Tectonic 在顺序写上可以与本地存储基本一致,在随机写上比本地存储慢 25%。
读性能维度,Tectonic 的 Get 延迟大致是本地存储的 5 倍;在不开启 Parallel IO 的场景下,Tectonic 的 MultiGet 和 iterator 延迟是本地存储的 5 倍;在开启 Parallel IO 的场景下,Tectonic 的 MultiGet 和 iterator 延迟是本地存储的 3 倍。
网友评论