1. 背景
oec提供了多种快照,有最小快照,普通快照,归档节点快照。不同快照的特点与差异详见此处。
oec在运行时,也有多种裁剪pruning配置参数,让用户根据实际情况保存区块数据。pruning配置参数详情参考。
每个配置对磁盘的消耗都不一样。其中归档节点占用消耗最大,最小快照消耗最小。
目前,根据快照size分为s0, s1, s2, s3四个级别:
- s0.
size最小
,只含最后一个区块和该高度的状态。
最小数据快照是裁剪到最后一个区块的数据,删除cs.wal,tx_index.db,watch.db数据。
优势是:数据量少,下载数据快速,能快速部署节点;
缺点是:无法查询历史数据,包括历史区块数据、交易数据、状态数据、event数据等。该区块高度之前的数据不能查询, 但进行同步区块操作后,可以查询该区块高度之后的数据。
- s1.
--pruning everything
:比s0 size大点
普通数据快照数据量中等,只保留最新高度的状态数据,之前的状态数据都已被裁剪,block,states数据没有做任何裁剪。block和state数据包含了2322601高度(主网)至当前块高的数据。可以查询当前区块数据、交易数据、状态数据,可以用于部署后的继续出块。
- s2.
--pruning default
:比s1 size大点
该数据是系统默认配置,可以根据自己需要进行更改。
- s3.
--pruning nothing
:size最大
归档数据快照数据量最大,不做任何裁剪。block、state、application数据包含2322601高度(主网)到当前块高的全部数据,可以查询历史区块数据、交易数据、状态数据、event数据等。
缺点是:数据量非常大,下载数据需要耗费一定的时间。
2. 问题
如何在满足自己需求的同时,尽量减少磁盘占用。
比如:
想让data占用磁盘空间最小,又不需要查询历史数据,那么s0最合适,该如何制作
想让data占用磁盘空间较小,但同时保留历史区块数据,那么s1最合适,该如何制作
想保留全部历史数据和状态,磁盘空间占用大一点也可以,那么s3最合适,该如何制作
另外,如果裁剪的过程中数据量很大,执行失败怎么办
如何不裁剪只压缩app数据,如何不裁剪只压缩block数据等等
3. 解决方案
准备初始数据
cd /data/pruning_node/${HOME}
cp -R ${ORIGIN_HOME}/exchaind/data .
cp -R ${ORIGIN_HOME}/exchaind/config . # 仅第一次执行
使用最新dev编译出exchaind
git clone -b dev https://github.com/okex/exchain.git
cd exchain
git pull # 确保在dev分支
make mainnet # 编译主网,默认是leveldb
make mainnet WITH_ROCKSDB=true # 编译主网,如果想启动leveldb
make testnet # 编译测试网,默认是leveldb
make testnet WITH_ROCKSDB=true # 编译主网,如果想启动leveldb
注意:
make mainnet # 编译主网时,务必使用
make testnet # 编译测试网时,务必使用
1. 如何制作 s0
cd /data/pruning_node
exchaind data prune-compact all --home ${HOME}
- all:同时裁剪并压缩block和app数据,处理
application.db
blockstore.db
state.db
。
裁剪完成后,删除无用数据,进一步减少磁盘空间占用
rm -r ${HOME}/data/tx_index.db
rm -r ${HOME}/data/watch.db
rm -r ${HOME}/data/cs.wal
rm -r ${HOME}/data/bloom.db
rm -r ${HOME}/data/evidence.db
2. 如何制作 s1
cd /data/pruning_node
exchaind data prune-compact state --home ${HOME}
exchaind data prune-compact block -p=false --home ${HOME}
- state:裁剪并压缩app数据,处理
application.db
。
-p
:是否执行pruning操作,如果false,则只执行compact操作。
- block:裁剪并压缩block数据,处理
blockstore.db
state.db
。
注意:block -p=false 表示不裁剪只压缩block数据。
3. 如何制作 s3
由于s3包含数据最完整,不能通过命令行制作,而是通过在启动节点时配置 --pruning nothing
完成。
注意:归档数据产生仅对配置 --pruning nothing 后新产生的区块起作用,对历史数据不起作用。如果需要完整的历史数据可以下载归档节点 快照
4. 如果数据量过大,怎么操作避免OOM(内存溢出)
比如,可以将区块数据200w以前,200w-300w,300w-400w,400w-500w四次逐段裁剪为s0:
exchaind data prune-compact all -r 2000000 --home ${HOME}
exchaind data prune-compact all -r 3000000 --home ${HOME}
exchaind data prune-compact all -r 4000000 --home ${HOME}
exchaind data prune-compact all -r 5000000 --home ${HOME}
-r
:指定裁剪高度,此高度(不含)之前的数据将被裁剪掉。如果不指定,则默认保留最后两个高度数据。
5. 怎么不裁剪只压缩app数据
exchaind data prune-compact state -p=false --home ${HOME}
- state:裁剪只压缩app数据,处理
application.db
。
-p
:是否执行pruning操作,如果false,则只执行compact操作。
注意:state -p=false 表示不裁剪只压缩app数据。
6. 怎么不裁剪只压缩block数据
exchaind data prune-compact block -p=false --home ${HOME}
- block:裁剪只压缩block数据,处理
blockstore.db
state.db
。
-p
:是否执行pruning操作,如果false,则只执行compact操作。
注意:block -p=false 表示不裁剪只压缩block数据。
如何配置启动参数pruning
建议以下两种配置:
rpc节点,配置为裁剪所有快照 --pruning everything
所有保存的状态将被删除,仅存储当前状态,每10个区块执行一次裁剪操作。
优点:磁盘占用最小,仅保留最新状态。
归档节点,保留全部快照 --pruning nothing
将保存所有历史状态,不删除任何内容,即归档节点。