资讯专栏INFORMATION COLUMN

使用快照启动 FIBOS、EOS 节点

tinylcy / 3227人阅读

摘要:快照实现的原理使用快照启动相应的源码地址,截取部分代码从源码中可以看出当启动添加参数时会以快照中的数据启动。

为什么使用快照 1. 快速同步节点

EOS 的日志文件已经达到了 160G,同步一个 EOS 全节点大约需要耗时 10-15 天的时间,时间成本非常高。作为一个普通 Dapp 开发者,我们并不需要之前的区块数据,所以完全不需要浪费大把时间去同步一个 EOS 全节点。通过快照同步的方式能够很好的满足我们的需求,使用最新快照启动的节点,能够在 3~4 分钟内完成节点同步达到主网高度,时间成本大大降低。

2. 节省服务器资源

  快照启动的节点,区块日志 block.log 内只会保存节点启动之后的区块数据,占用的磁盘空间更小。对比全节点和快照方式启动的节点两种方式同步 EOS 主网的结果来看,可以得出的结论是使用快照启动的节点在 CPU 和 RAM 的使用上都要远远小于全节点。这就意味着在一定程度上使用快照同步的节点能够很大程度上的降低我们的服务器成本。

3. 不停机数据备份

传统的区块数据备份步骤:

停止同步中的节点

使用压缩工具将区块数据压缩

重新启动节点

快照备份步骤:

访问对应的接口: /v1/producer/create_snapshot,节点开始数据备份,备份结束后继续同步,无需停掉正在运行的节点。

通过上面的对比可以看出,使用快照方式启动的节点,在数据备份上将更加简单便捷。

快照实现的原理 1. 使用快照启动

相应的源码地址: https://github.com/EOSIO/eos/...,截取部分代码:

auto infile = std::ifstream(my->snapshot_path->generic_string(), (std::ios::in | std::ios::binary));
auto reader = std::make_shared(infile);
reader->validate();
reader->read_section([this]( auto §ion ){
        section.read_row(my->chain_config->genesis);
        });
infile.close();

从源码中可以看出当启动添加参数:snapshot时,会以快照中的数据启动。

2. 实现快照备份

进行快照备份时,服务器资源使用情况稳定。但正在备份中的节点服务将暂时不可用,待数据备份结束后将恢复。所以推荐备份节点和业务节点独立开。
相应的源码如下: https://github.com/EOSIO/eos/...

producer_plugin::snapshot_information producer_plugin::create_snapshot() const {
   chain::controller& chain = my->chain_plug->chain();

   auto reschedule = fc::make_scoped_exit([this](){
      my->schedule_production_loop();
   });

   if (chain.pending_block_state()) {
      // abort the pending block
      chain.abort_block();
   } else {
      reschedule.cancel();
   }

   auto head_id = chain.head_block_id();
   std::string snapshot_path = (my->_snapshots_dir / fc::format_string("snapshot-${id}.bin", fc::mutable_variant_object()("id", head_id))).generic_string();

   EOS_ASSERT( !fc::is_regular_file(snapshot_path), snapshot_exists_exception,
               "snapshot named ${name} already exists", ("name", snapshot_path));


   auto snap_out = std::ofstream(snapshot_path, (std::ios::out | std::ios::binary));
   auto writer = std::make_shared(snap_out);
   chain.write_snapshot(writer);
   writer->finalize();
   snap_out.flush();
   snap_out.close();

   return {head_id, snapshot_path};
}

从源码中可以看出,当进行快照备份时,会将备份数据写到我们设置的路径下,快照的文件名为当前区块的hash。

下面我们将详细介绍在 FIBOS、EOS 上如何通过快照启动
启动 FIBOS 节点
注意: FIBOS 版本: v1.4.0+
创建快照 配置快照目录

快照生成位置 config.data_dir 为根目录,可以配置为:

config.data_dir = "./blockData/data"

fibos.load("producer", {
"snapshots-dir": "snapshots"
});

根据配置,快照生成的位置为:
./blockData/data/snapshots

载入插件
fibos.load("producer_api");
注意: 开启该插件后,请确保你的节点放置在内网安全。

完整配置文件可参考:

const fibos = require("fibos");
fibos.config_dir = "./blockData/data"
fibos.data_dir = "./blockData/data";

fibos.load("http", {
    "http-server-address": "0.0.0.0:8870",
    "access-control-allow-origin": "*",
    "http-validate-host": false,
    "verbose-http-errors": true
});

fibos.load("net", {
    "p2p-peer-address": [],
    "max-clients": 100,
    "p2p-listen-endpoint": "0.0.0.0:9876"
});

fibos.load("producer", {
    "snapshots-dir": "snapshots"
});

fibos.load("producer_api");

fibos.load("chain", {
    "contracts-console": true,
    "genesis-json": "genesis.json"
});

fibos.load("chain_api");

fibos.start();

相关 p2p 节点地址信息可以去 http://p2pcheck.fibospubg.top... 获取。

生成快照

启动节点后,通过调用接口:/v1/producer/create_snapshot 生成快照,命令如下:

curl http://127.0.0.1:8870/v1/producer/create_snapshot

节点生成完快照后,返回结果如下:

{
"head_block_id":"00003070049e51276829f6d1020fa638e5428fc9f8b0532fc60f680d72359dbe",
"snapshot_name":"./blockData/data/snapshots/snapshot-00003070049e51276829f6d1020fa638e5428fc9f8b0532fc60f680d72359dbe.bin"
}
通过快照启动 配置快照文件路径
fibos.load("chain", {
"snapshot": "./blockData/data/snapshots/snapshot-00003070049e51276829f6d1020fa638e5428fc9f8b0532fc60f680d72359dbe.bin"
});
启动服务
fibos.start();
启动 EOS 节点
注意: nodeos 版本: v1.4.0+
通过快照启动 下载快照文件:

最新的快照文件地址:https://eosnode.tools/snapshots

wget $(wget --quiet "https://eosnode.tools/api/snapshots?limit=1" -O- | jq -r ".data[0].s3") -O snapshot.tar.gz

解压快照文件

tar -xvzf snapshot.tar.gz
目录结构:

├── node-data
│   ├── snapshots
└── config.ini

注意:使用快照备份的方式启动时,需要保证 node-data 文件夹下无日志和状态数据文件。
配置文件:

vim config.ini

agent-name = EOSNODEOS

chain-state-db-size-mb = 10240
reversible-blocks-db-size-mb = 1024

http-server-address = 0.0.0.0:8870

http-validate-host = false
verbose-http-errors = true
abi-serializer-max-time-ms = 2000

access-control-allow-origin = *
allowed-connection = any

max-clients = 2
sync-fetch-span = 3000
connection-cleanup-period = 30
enable-stale-production = false

plugin = eosio::chain_api_plugin
plugin = eosio::chain_plugin

p2p-peer-address = ip:prot

相关 p2p 节点地址信息可以去 https://github.com/CryptoLion... 获取

快照方式启动脚本:
nodeos --config-dir ./ --data-dir ./node-data --snapshot ./node-data/snapshots/snapshot-023e5e8813f687c6c5ffcf6eae853eb24f78d90b475dac4fb94face8c8308e4f.bin

节点启动后目录结构:
├── node-data
│   ├── snapshots
│ ├── blocks
│ ├── state
└── config.ini

验证:
curl  http://127.0.0.1:8870/v1/chain/get_block -X POST -d "{"block_num_or_id":38006282}"

返回结果为高度38006282的区块数据,返回的结果大致如下:

{
    "timestamp": "2019-01-18T02:43:16.500", 
    "producer": "atticlabeosb", 
    "confirmed": 0, 
    "previous": "0243ee09128b14b56f90b3a0288b4b6f34526f53d71f8dc4e56bb89a42b4a93d", 
    "transaction_mroot": "179c0382cf457b63356f733dc93bd3c582419f2b3a64e0d270e9d9238149bae4", 
    "action_mroot": "e83174a2fae3c44777616993e7ba65393805a382bf423b744010873f76beaae8", 
    "schedule_version": 667, 
    "new_producers": null, 
    "header_extensions": [ ], 
    "producer_signature": "SIG_K1_KhkTgB5PHXGmYtiZMGgHVcQKxKFh8uUFVA8Mwic8bpjA6bCFSYnNkbGqYZW23A5zBXWKvb3PnMJGEiS3MHwvPGpZzf95wd", 
    "transactions": [.....]
}
生成快照 添加插件

config.ini 中添加:

plugin = eosio::producer_api_plugin
注意: 开启该插件后,请确保你的节点放置在内网安全。
设置备份目录

启动时完整参数:

nodeos --config-dir ./ --data-dir ./node-data --snapshots-dir ../snapshots-backups
创建快照
curl http://curl http://127.0.0.1:8870/v1/producer/create_snapshot

按照目前 EOS 的大小,这一步大约需要耗时10~15分钟。快照创建结束后,在 snapshots-backups 目录下,生成相应的快照文件。请求返回结果如下:

{
    "head_block_id":"000006a4529a21b72b58c70c262fd3a754930d68b30b0b166f72fc1dbbc376e8",
    "snapshot_name":"./snapshots-backups/snapshot-000006a4529a21b72b58c70c262fd3a754930d68b30b0b166f72fc1dbbc376e8.bin"
}
适用场景

搭建自己的 EOS、FIBOS API 节点

只关心当前最新的区块数据、交易,无需溯源

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/101328.html

相关文章

  • 使用快照启动 FIBOSEOS 节点

    摘要:快照实现的原理使用快照启动相应的源码地址,截取部分代码从源码中可以看出当启动添加参数时会以快照中的数据启动。 为什么使用快照 1. 快速同步节点 EOS 的日志文件已经达到了 160G,同步一个 EOS 全节点大约需要耗时 10-15 天的时间,时间成本非常高。作为一个普通 Dapp 开发者,我们并不需要之前的区块数据,所以完全不需要浪费大把时间去同步一个 EOS 全节点。通过快照同步...

    notebin 评论0 收藏0
  • FIBOS入坑指南——本地开发环境搭建

    摘要:如果出错,需要查看一下本地节点是否正在运行,在浏览器输入后记完至此,本地的开发环境基本搭建完成,如果你想试试在本地环境编写部署调用智能合约,可以参考官方开发文档,当然,后续有时间,我也会把在智能合约开发过程中踩到的坑写写。 FIBOS是什么? FIBOS 是一个结合 FIBJS 以及 EOS 的 JavaScript 的运行平台,它使得 EOS 提供可编程性,并允许使用 JavaSc...

    goji 评论0 收藏0
  • 如何在 fibos 上创建快照使用快照启动节点

    摘要:本文介绍下如何通过快照启动节点。快照创建无需停止节点打包数据比备份数据更方便快捷。 本文介绍下如何通过快照启动 FIBOS 节点。 快照创建无需停止节点打包数据比备份数据更方便快捷。如果还不清楚如何启动一个 fibos 节点请参考 启动 fibo节点 fibos 版本 v1.4.1+ 如何创建快照 1.配置快照目录 快照生成位置 config.data_dir 为根目录,可以配置 例1...

    Barry_Ng 评论0 收藏0
  • FIBOS 周报

    摘要:稳定币的上线年月日,发布了稳定币,并且成功通过了社区多签。年月日,的稳定币正式上线。年月日,六大个税抵扣社会保险费由税务部门统一征收等一批新规正式实施。本次的攻击为针对项目方的重放攻击。 FIBOS 稳定币的上线 2018年12月21日,FIBOS 发布了稳定币—— FOD,并且成功通过了社区多签。 2018年12月28日, FIBOS 的稳定币 FOD 正式上线。 早在2018年9月...

    explorer_ddf 评论0 收藏0
  • FIBOS 周报

    摘要:稳定币的上线年月日,发布了稳定币,并且成功通过了社区多签。年月日,的稳定币正式上线。年月日,六大个税抵扣社会保险费由税务部门统一征收等一批新规正式实施。本次的攻击为针对项目方的重放攻击。 FIBOS 稳定币的上线 2018年12月21日,FIBOS 发布了稳定币—— FOD,并且成功通过了社区多签。 2018年12月28日, FIBOS 的稳定币 FOD 正式上线。 早在2018年9月...

    dabai 评论0 收藏0

发表评论

0条评论

tinylcy

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<