分布式图数据库 Nebula Graph 中的集群快照实践

ywz888
发布于 2022-10-12 11:25
浏览
0收藏

摘要

图数据库 Nebula Graph 在生产环境中将拥有庞大的数据量和高频率的业务处理,在实际的运行中将不可避免的发生人为的、硬件或业务处理错误的问题,某些严重错误将导致集群无法正常运行或集群中的数据失效。当集群处于无法启动或数据失效的状态时,重新搭建集群并重新导入数据都将是一个繁琐并耗时的工程。针对此问题,Nebula Graph 提供了集群 snapshot 的创建功能。

Snapshot 功能需要预先提供集群在某个时间点 snapshot 的创建功能,以备发生灾难性问题时用历史 snapshot 便捷地将集群恢复到一个可用状态。


概述

1.1 术语

本文主要会用到以下术语:

  • StorageEngine:Nebula Graph 的最小物理存储单元,目前支持 RocksDB 和 HBase,在本文中只针对 RocksDB。
  • Partition:Nebula Graph 的最小逻辑存储单元,一个 StorageEngine 可包含多个 Partition。Partition 分为 leader 和 follower 的角色,Raftex 保证了 leader 和 follower 之间的数据一致性。
  • GraphSpace:每个 GraphSpace 是一个独立的业务 Graph  单元,每个GraphSpace有其独立的 tag 和 edge 集合。一个 Nebula Graph 集群中可包含多个 GraphShpace。
  • checkpoint:针对 StorageEngine 的一个时间点上的快照,checkpoint 可以作为全量备份的一个 backup 使用。checkpoint files是 sst files 的一个硬连接。
  • snapshot:本文中的 snapshot 是指 Nebula Graph 集群的某个时间点的快照,即集群中所有StorageEngine的 checkpoint 的集合。通过 snapshot 可以将集群恢复到某个 snapshot 创建时的状态。
  • wal:Write-Ahead Logging ,用 raftex 保证 leader 和 follower 的一致性。


系统构架

2.1 系统整体架构

分布式图数据库 Nebula Graph 中的集群快照实践-鸿蒙开发者社区

2.2 存储系统结构关系

分布式图数据库 Nebula Graph 中的集群快照实践-鸿蒙开发者社区

2.3 存储系统物理文件结构

分布式图数据库 Nebula Graph 中的集群快照实践-鸿蒙开发者社区


处理逻辑分析

3.1 逻辑分析

分布式图数据库 Nebula Graph 中的集群快照实践-鸿蒙开发者社区

Create snapshot client api console graph server create snapshot AST 进行解析,然后通过 meta client meta server 。meta server active host adminClient request adminClient StorageEngine ,StorageEngine  收到 create 请求后,会遍历指定 space 的全部 StorageEngine,并创建 checkpoint ,随后对 StorageEngine  中的全部 partition wal 做 hardlink。在创建 checkpoint 和 wal hardlink 时,因为已经提前向所有 leader partition 发送了 write blocking 请求,所以此时数据库是只读状态的


因为 snapshot 的名称是由系统的 timestamp 自动生成,所以不必担心 snapshot 的重名问题。如果创建了不必要的 snapshot,可以通过 drop snapshot 命令删除已创建的 snapshot。

3.2 Create Snapshot

分布式图数据库 Nebula Graph 中的集群快照实践-鸿蒙开发者社区

3.3 create checkpoint

分布式图数据库 Nebula Graph 中的集群快照实践-鸿蒙开发者社区


关键代码实现

4.1 Create Snapshot

分布式图数据库 Nebula Graph 中的集群快照实践-鸿蒙开发者社区

4.2 Create Checkpoint

分布式图数据库 Nebula Graph 中的集群快照实践-鸿蒙开发者社区


用户使用帮助

5.1 CREATE SNAPSHOT

CREATE SNAPSHOT  即对整个集群创建当前时间点的快照snapshot 名称由 meta server 的 timestamp 组成


在创建过程中可能会创建失败,当前版本不支持创建失败的垃圾回收的自动功能,后续将计划在 metaServer 中开发 cluster checker 的功能,将通过异步线程检查集群状态,并自动回收 snapshot 创建失败的垃圾文件。


当前版本如果 snapshot 创建失败,必须通过 DROP SNAPSHOT 命令清除无效的 snapshot。


当前版本不支持对指定的 space 做 snapshot,当执行 CREATE SNAPSHOT 后,将对集群中的所有 space 创建快照。


CREATE SNAPSHOT 语法:

分布式图数据库 Nebula Graph 中的集群快照实践-鸿蒙开发者社区

以下为笔者创建 3 个 snapshot 的例子:

分布式图数据库 Nebula Graph 中的集群快照实践-鸿蒙开发者社区

我们用 5.3 提及的 SHOW SNAPSHOTS 命令看下现在有的快照

分布式图数据库 Nebula Graph 中的集群快照实践-鸿蒙开发者社区

从上 SNAPSHOT_2019_12_04_10_54_36  可见 snapshot 名同 timestamp 有关。

5.2 DROP SNAPSHOT

DROP SNAPSHOT 即删除指定名称的 snapshot,可以通过 SHOW SNAPSHOTS 命令获取 snapshot 的名称,DROP SNAPSHOT 既可以删除有效的 snapshot,也可以删除创建失败的 snapshot。


语法:

分布式图数据库 Nebula Graph 中的集群快照实践-鸿蒙开发者社区

笔者删除了 5.1 成功创建的 snapshot SNAPSHOT_2019_12_04_10_54_36 SHOW SNAPSHOTS 命令查看现有的 snapshot。

分布式图数据库 Nebula Graph 中的集群快照实践-鸿蒙开发者社区

5.3 SHOW SNAPSHOTS

SHOW SNAPSHOTS 可查看集群中所有的 snapshot,可以通过 SHOW SNAPSHOTS 命令查看其状态(VALID 或 INVALID)、名称、和创建 snapshot 时所有 storage Server 的 ip 地址。


语法:

分布式图数据库 Nebula Graph 中的集群快照实践-鸿蒙开发者社区

以下为一个小示例:

分布式图数据库 Nebula Graph 中的集群快照实践-鸿蒙开发者社区


注意事项

  • 当系统结构发生变化后,最好立刻 create snapshot,例如 add host、drop host、create space、drop space、balance 等。
  • 当前版本暂未提供用户指定 snapshot 路径的功能,snapshot 将默认创建在 data_path/nebula 目录下
  • 当前版本暂未提供 snapshot 的恢复功能,需要用户根据实际的生产环境编写 shell 脚本实现。实现逻辑也比较简单,拷贝各 engineServer 的 snapshot 到指定的文件夹下,并将此文件夹设置为 data_path,启动集群即可。




文章转载自公众号:Nebula Graph Community

分类
标签
已于2022-10-12 11:26:19修改
收藏
回复
举报
回复
    相关推荐