跳转到主要内容

备份和恢复 Databend Meta 集群

本专题介绍如何备份和还原 Meta 集群数据。

从 Meta 服务导出数据

Databend 支持从 databend-meta 数据目录或从运行 databend-meta 的服务器中导出。

从数据目录导出

关闭 databend-meta 服务。

然后从 your_meta_dir 导出 sled DB,databend-meta 以多行 JSON 格式将元数据存储到本地文件output_fn。 输出文件中的每一行都是导出的JSON格式的键值对。

# cargo build --bin databend-metactl

./target/debug/databend-metactl --export --raft-dir "<your_meta_dir>" --db <output_fn>

# tail "<output_fn>"
# ["state_machine/0",{"Nodes":{"key":2,"value":{"name":"","endpoint":{"addr":"localhost","port":28203}}}}]
# ["state_machine/0",{"Nodes":{"key":3,"value":{"name":"","endpoint":{"addr":"localhost","port":28303}}}}]
# ["state_machine/0",{"StateMachineMeta":{"key":"LastApplied","value":{"LogId":{"term":1,"index":378}}}}]
# ["state_machine/0",{"StateMachineMeta":{"key":"Initialized","value":{"Bool":true}}}]
# ...

注意:如果没有 --db 参数,数据将导出到 stdio。

从运行的服务器导出

命令与从数据目录导出类似,但需使用 --grpc-api-address <ip:port> 取代 --raft-dir,其中 <ip:port>databend-meta config.toml 中的 grpc_api_address,例如:

./target/debug/databend-metactl --export --grpc-api-address "127.0.0.1:9191" --db <output_fn>

# tail "<output_fn>"
# ["state_machine/0",{"Nodes":{"key":2,"value":{"name":"","endpoint":{"addr":"localhost","port":28203}}}}]
# ...

恢复 databend-meta

以下命令使用 <your_meta_dir> 中导出的元数据重建 Meta 服务:

./target/debug/databend-metactl --import --raft-dir "<your_meta_dir>" --db <output_fn>

databend-meta --raft-dir "<your_meta_dir>" ...

注意:如果没有 --db 参数,则使用来自 stdio 的数据。

cat "<output_fn>" | ./target/debug/databend-metactl --import --raft-dir "<your_meta_dir>"

警告: <your_meta_dir> 中的数据将被清除。

利用导入数据创建新的 databend-meta 集群

通过 --initial-cluster 参数, databend-metactl 可以利用导入数据创建一个新的 Meta 集群。 --initial-cluster 格式是: node_id=raft_advertise_host:raft_api_port,grpc_api_addr,每个节点的配置用空格分隔。raft_advertise_hostraft_api_portgrpc_api_addr 的作用与其配置文件中相同。

例如:

/target/debug/databend-metactl --import --raft-dir ./.databend/new_meta1 --id=1 --db meta.db --initial-cluster 1=localhost:29103,0.0.0.0:19191 2=localhost:29203,0.0.0.0:29191 3=localhost:29303,0.0.0.0:39191
/target/debug/databend-metactl --import --raft-dir ./.databend/new_meta2 --id=2 --db meta.db --initial-cluster 1=localhost:29103,0.0.0.0:19191 2=localhost:29203,0.0.0.0:29191 3=localhost:29303,0.0.0.0:39191
/target/debug/databend-metactl --import --raft-dir ./.databend/new_meta3 --id=3 --db meta.db --initial-cluster 1=localhost:29103,0.0.0.0:19191 2=localhost:29203,0.0.0.0:29191 3=localhost:29303,0.0.0.0:39191

以上脚本从 meta.db 导入数据并且初始化集群的三个节点。id 1的 Raft 目录是 ./.databend/new_meta1,其他两个节点的命令类似,但 Raft 目录不同。 注意这三个命令行中的 --initial-cluster 参数是相同的。

此后,可以使用新的配置和导入数据启动一个新的三个节点 databend-meta 集群。