本文档介绍了 Base Node 数据持久化存储的管理方式,包括存储卷的配置、默认数据位置以及管理区块链数据的最佳实践。有关 Docker 基础设施和容器配置的信息,请参阅Docker 基础设施和Docker Compose 配置。
Base Node 需要持久化存储来在容器重启后维护区块链数据。这包括执行客户端的链数据、节点密钥和其他持久化状态信息。如果没有正确配置持久化存储,在容器被重新创建时,您将丢失所有已同步的数据。
来源: README.md89-94 docker-compose.yml14
默认情况下,Base Node 将执行客户端数据存储在项目根目录下的一个目录中
${PROJECT_ROOT}/geth-data/${PROJECT_ROOT}/reth-data/${PROJECT_ROOT}/nethermind-data/这些目录被挂载到执行客户端容器的 /data 路径,从而在容器重启之间建立持久化存储。
来源: README.md91-92 docker-compose.yml14 .dockerignore1-3
数据目录挂载由环境变量控制
HOST_DATA_DIR - 定义将要挂载到执行客户端容器中的主机目录GETH_HOST_DATA_DIR - 可用于覆盖 .env 文件中的默认数据目录映射在 Docker Compose 文件中定义,该文件将主机目录挂载到执行客户端容器内的 /data
来源: docker-compose.yml13-14 README.md91-92
每个执行客户端存储数据的结构略有不同
| 执行客户端 | 数据结构 | 关键组件 |
|---|---|---|
| Geth | geth-data/ | chaindata/, lightchaindata/, keystore/, nodekey |
| Reth | reth-data/ | db/, network/, keystore/ |
| Nethermind | nethermind-data/ | chainspec/, keystore/, nethermind_db/ |
无论选择哪个客户端,所有区块链数据都存储在配置的主机数据目录中,并在容器重启时保持不变。
来源: .dockerignore1-3 README.md91-92
Base Node 系统支持三种执行客户端,数据目录根据正在使用的客户端确定
来源: README.md71-78 docker-compose.yml3-16
为了加速节点同步,Base Node 系统支持从快照加载。此功能依赖于卷管理系统
$GETH_HOST_DATA_DIR 或等效目录)来源: README.md93-94 README.md108-110
为了有效地运行 Base 节点,请遵循以下存储建议
存储容量: 确保有足够的存储空间用于快照恢复和持续的链数据
(当前链大小 * 2) + 快照大小 + 20% 缓冲存储性能: 使用高性能存储
io2 block express卷持久性: 删除容器时要小心
docker compose down 而不是 docker compose down -v 以保留卷来源: README.md36-37 README.md39
考虑为不同网络(主网与测试网)维护独立的数据目录,以避免混淆和潜在的数据损坏
project-root/
├── geth-data-mainnet/
├── geth-data-sepolia/
├── reth-data-mainnet/
├── reth-data-sepolia/
└── ...
您可以在环境配置中或启动容器时指定相应目录。
来源: README.md50-53 README.md58-64
与数据卷相关的常见问题包括
如果您遇到持久性卷相关的问题,请参阅项目 README 中的故障排除部分,或通过 GitHub Issues 或 Discord 联系我们。
来源: README.md42-46
下图说明了 Docker 容器系统如何与主机文件系统交互以实现数据持久化
来源: docker-compose.yml1-32 README.md89-94
这种架构确保了所有区块链数据在容器生命周期结束后仍然存在,从而支持节点重启而不会丢失数据,并支持诸如快照恢复之类的进阶操作。