暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

CurveFS 元数据备份探索

OpenCurve 2023-05-24
376

背景

Curve 是云原生计算基金会 (CNCF) Sandbox 项目,是网易主导自研和开源的高性能、易运维、云原生的分布式存储系统。

对于一个大型存储系统,不存在可靠的组件这一说,硬盘、服务器都是消耗品,都有出故障的时候。因此为了保障数据的可靠性,可用性,出现了各种各种冗余、副本的设计,对于核心数据进行备份也是一种常见的想法。我们将探索一下 CurveFS 元数据备份的思路和方案。


CurveFS 元数据及其特点

CurveFS 的管控面组件分为 2 种,一种是 mds,另一种是 metaserver,分别存储了各自负责的元数据。下面介绍一下各自的存储方式、数据内容以及数据量的大致估算。
mds的元数据
存储方式
mds 的元数据持久化存储在 etcd 中
元数据内容

1.topology 信息: fsid, pool, zone, server, copyset 信息,具体 proto 定义可以查看:

https://github.com/opencurve/curve/blob/master/curvefs/proto/topology.proto
2.fsinfo 信息: 包括 s3 和 block 存储后端的信息,具体 proto 定义可以查看:https://github.com/opencurve/curve/blob/master/curvefs/proto/mds.proto
3.ChunkId: 目前已经分配的最大的 chunk id, 单条 kv 记录;
数据量估算
可以比较容易地发现,存储的信息大多是服务器、FS、copyset 这类数量级一般在百/千级别的数据,并且单条记录的大小是固定的、较小的、所以数据量非常少,可能只有几兆几十兆。
metaserver的元数据
存储方式
metaserver 的元数据持久化存储在本地硬盘的 rocksdb 上,数据的可靠性可用性通过三副本 raft 协议(使用的实现是 braft)来保证,元数据请求->raft->rocksdb。
元数据内容
partition 信息, inode 信息, dentry 信息等其余的所有元数据,具体 proto 定义可以查看 https://github.com/opencurve/curve/blob/master/curvefs/proto/metaserver.proto
数据量估算
考虑到 FS 的 inode 和 dentry 信息往往会达到上亿的量级,并且 inode 信息中需要记录文件数据位置到 S3 对象或 BS 后端的映射,整个数据量会比较庞大。metaserver 元数据量达到上百 G 是非常正常的事情。


元数据备份
mds元数据备份
由于后端数据实际存储使用的是 etcd,所以可以用 etcd 可以用的所有备份手段。可以参考 https://etcd.io/docs/v3.5/op-guide/recovery/,这里不做过多的介绍。
metaserver元数据备份
存储目录结构

这里只用显示了一个 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。

    方案 1:human readable 的元数据备份

    元数据诗通过编码后存储在 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 会把所有的内容重新删除复制一遍,需要自己开发简单的同步工具去处理一下这部分数据;


    总结
    本文介绍了 CurveFS 中的元数据的存储方式,以及在此基础上的一些元数据备份的思考。现有的 metaserver 元数据备份方案只有 raw 元数据的定期和实时备份是可行的。后续可以考虑在以下几个方面进行跟进:
      • 实现 FS、inode 元数据的在线导出和导入功能,以便实现细粒度的元数据备份和查看需求;
      • 实现离线的 raw 元数据编解码功能,便于备份数据的查看和处理;
      • 实现全局的 snapshot 功能,目前只能主动触发每一个 raft node 的 snapshot 来简单模拟,可能会有坑;

    <作者:小马哥, Curve Maintainer>


    ------ END. ------

    🔥 火爆报名中:

    2023 Curve 开发者活动来了!

    2023 开源之夏 | Curve 邀你与中国存储软件共成长,赢万元奖金

    Curve丨Google 编程之夏 2023 招募中

    🔥 推荐用户案例:
    Curve 文件存储在 Elasticsearch 冷热数据存储中的应用实践
    扬州万方:基于申威平台的 Curve 块存储在高性能和超融合场景下的实践
    创云融达:基于 Curve 块存储的超融合场景实践 
    🔥 推荐硬核技术解析:
    ChunkServer 优化使用 bthread 的思考
    通过 Samba 来使用 CurveFS 
    Curve 块存储 IO 链路零拷贝



    关于 Curve 

    Curve 是一款高性能、易运维、云原生的开源分布式存储系统。可应用于主流的云原生基础设施平台:对接 OpenStack 平台为云主机提供高性能块存储服务;对接 Kubernetes 为其提供 RWO、RWX 等类型的持久化存储卷;对接 PolarFS 作为云原生数据库的高性能存储底座,完美支持云原生数据库的存算分离架构。

    Curve 亦可作为云存储中间件使用 S3 兼容的对象存储作为数据存储引擎,为公有云用户提供高性价比的共享文件存储。

    • GitHub:https://github.com/opencurve/curve
    • 官网https://opencurve.io/
    • 用户论坛:https://ask.opencurve.io/
      微信群:搜索群助手微信号 OpenCurve_bot

    文章转载自OpenCurve,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

    评论