如何为Kadena devnet创建数据库快照实现快速启动
Kadena devnet 持久化数据库跳过初始化等待配置方案
你可以通过自定义Compose覆盖配置实现数据库持久化,首次初始化后后续所有启动都不需要再等待1小时区块同步,具体操作步骤如下:
1. 编写devnet.yaml覆盖配置
在devnet项目根目录新建devnet.yaml文件,以下是可直接使用的配置示例,通过Docker命名卷持久化节点数据:
version: "3.8" services: node0: extends: file: docker-compose.yaml service: node0 volumes: - kadena-devnet-db:/root/.kadena # 如果你测试时需要启动多节点,按相同格式给每个节点追加独立的存储卷即可 # node1: # extends: # file: docker-compose.yaml # service: node1 # volumes: # - kadena-devnet-db-node1:/root/.kadena volumes: kadena-devnet-db:
如果需要把数据库文件直接存在宿主机方便拷贝快照,可以把node0下的volumes配置替换为本地路径挂载形式:
volumes: - ./devnet-snapshot:/root/.kadena
配置生效后节点所有区块数据会直接存在当前目录的devnet-snapshot文件夹下。
2. 首次启动完成初始化
启动时需要同时加载默认Compose配置和你自定义的devnet.yaml覆盖配置:
docker compose -f docker-compose.yaml -f devnet.yaml up -d
首次启动仍需等待区块高度达到165的分叉高度,可通过以下命令查询0号链高度确认进度:
curl http://localhost:8080/chainweb/0.0/devnet01/chain/0/height
当返回的高度值≥165时,初始化完成,所有数据已经写入持久化存储。
3. 后续使用与快照制作
- 日常停止服务时不要加
-v参数,直接执行docker compose -f docker-compose.yaml -f devnet.yaml down即可,停止容器不会删除持久化的数据库,下次用相同的up命令启动,会直接从上次停止的高度继续运行,无需重新等待初始化。 - 制作可复用快照时,先执行down命令停止节点,避免拷贝过程中数据库文件损坏:
- 用本地路径挂载的场景,直接把
devnet-snapshot文件夹打包压缩即可,新环境使用时直接解压到对应路径,启动devnet就能直接用。 - 用Docker命名卷的场景,执行以下命令可以把卷内数据导出为压缩包:
新环境使用时先创建同名卷,再把压缩包内容解压到卷内即可直接启动,跳过初始化等待。docker run --rm -v kadena-devnet-db:/data -v $(pwd):/backup alpine tar zcf /backup/devnet-initialized-snapshot.tar.gz -C /data .
- 用本地路径挂载的场景,直接把
注意事项
- 不要在节点运行过程中直接拷贝数据库文件做快照,大概率会出现数据损坏导致节点无法启动。
- 如果后续升级devnet版本存在新的分叉高度,只需要在升级后首次启动时等待一次高度达标,之后持久化的数据可以继续复用。
内容的提问来源于stack exchange,提问作者trh
相关产品推荐
相关产品推荐

