背景
Curve 是云原生计算基金会 (CNCF) Sandbox 项目,是网易主导自研和开源的高性能、易运维、云原生的分布式存储系统。
CurveFS 元数据及其特点
这里只用显示了一个 copyset,一般 copysets 下会有多个 copyset,元数据会被拆分为多个 copyset。
root@curvefs-metaserver-689d7df09643:/curvefs/metaserver/data# tree -a.|-- copysets| `-- 4294967308| |-- raft_log| | `-- log_meta| |-- raft_meta| | `-- raft_meta| |-- raft_snapshot| | `-- snapshot_00000000000000003221| | |-- __raft_snapshot_meta| | |-- conf.epoch| | |-- metadata| | `-- rocksdb_checkpoint| | |-- 000029.blob| | |-- 000030.blob| | |-- 000031.sst| | |-- 000032.sst| | |-- 000033.sst| | |-- 000034.sst| | |-- 000035.blob| | |-- 000036.blob| | |-- CURRENT| | |-- MANIFEST-000018| | `-- OPTIONS-000025| `-- storage_data| |-- 000019.log| |-- 000029.blob| |-- 000030.blob| |-- 000035.blob| |-- 000036.blob| |-- 000037.sst| |-- 000038.sst| |-- CURRENT| |-- IDENTITY| |-- LOCK| |-- LOG| |-- MANIFEST-000018| |-- OPTIONS-000023| `-- OPTIONS-000025|-- metaserver.dat`-- storage
可以发现 raft_snapshot 下的 rocksb_checkpoint 和 storage_data 中的数据有一部分是一样的,那是 rocksdb 的 checkpoint 机制使用 hardlink 导致的。raft默认为半个小时触发一次 snapshot,从而触发生成一次 rocksdb 的 checkpoint。
元数据诗通过编码后存储在 rocksdb 中的,所以是难以直接阅读的。通过将某个时间点的元数据解码并导出为 human readable 的格式(比如 json)是非常容易想到的办法。目前 curveFS 并不支持这样的元数据导出、导入的接口,有待后续开发,但是可以设想到的优缺点如下。
优点:
导出内容容易阅读和确认
方便控制备份的范围,可以制定某个文件夹、文件的导出
可以做到备份以外的事情,比如单独调整某个文件的元数据,导出元数据后修改再导入
缺点:
占用集群资源较多,在线的编解码需要 metaserver 介入,开销大
不适合备份大规模的文件夹或文件系统,耗时会非常久
方案 2:raw 元数据备份
如果不导出 FS 的数据,而是直接备份编码后的 raw 数据,会有以下的优缺点。
优点:
不需要解码;
缺点:
难以阅读和确认,需要开发额外的离线解码工具(暂无); 无法控制备份粒度; 在线备份某个时间点的数据需要一个整体的 snapshot 动作,目前没有 目前后端为自己实现的 raft+rocksdb 的方案,数据可以分为两部分,raft snapshot 的数据和不断在更新的数据。简单介绍一下目前使用的 braft 的快照机制,每一个 copyset(raft node) 在创建的时候会初始化一个 snapshot timer,在 index 有变化的情况下,接受主动的 snapshot 请求或是定时(半小时)快照。
raw 元数据备份的策略可以分为两种:
定期备份:
通过主动触发所有 raft node 的 snapshot,然后备份所有的 snapshot 数据;
实时备份:
通过 lsyncd 这样的工具,去跟踪所有的文件变更,相当于一个热的 standby; 需要注意 lsyncd 无法很好的处理 metaserver 中 rocksdb checkpoint 硬链接的场景。实际只是新增减了几个文件,但是如果使用 lsyncd 会把所有的内容重新删除复制一遍,需要自己开发简单的同步工具去处理一下这部分数据;
实现 FS、inode 元数据的在线导出和导入功能,以便实现细粒度的元数据备份和查看需求; 实现离线的 raw 元数据编解码功能,便于备份数据的查看和处理; 实现全局的 snapshot 功能,目前只能主动触发每一个 raft node 的 snapshot 来简单模拟,可能会有坑;
🔥 火爆报名中:
2023 开源之夏 | Curve 邀你与中国存储软件共成长,赢万元奖金


关于 Curve
Curve 亦可作为云存储中间件使用 S3 兼容的对象存储作为数据存储引擎,为公有云用户提供高性价比的共享文件存储。
GitHub:https://github.com/opencurve/curve 官网:https://opencurve.io/ 用户论坛:https://ask.opencurve.io/ 微信群:搜索群助手微信号 OpenCurve_bot




