备份和恢复 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_host
,raft_api_port
和grpc_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 集群。