使用快照啓動 FIBOS、EOS 節點

爲何使用快照

1. 快速同步節點

EOS 的日誌文件已經達到了 160G,同步一個 EOS 全節點大約須要耗時 10-15 天的時間,時間成本很是高。做爲一個普通 Dapp 開發者,咱們並不須要以前的區塊數據,因此徹底不須要浪費大把時間去同步一個 EOS 全節點。經過快照同步的方式可以很好的知足咱們的需求,使用最新快照啓動的節點,可以在 3~4 分鐘內完成節點同步達到主網高度,時間成本大大下降。node

2. 節省服務器資源

快照啓動的節點,區塊日誌 block.log 內只會保存節點啓動以後的區塊數據,佔用的磁盤空間更小。對比全節點和快照方式啓動的節點兩種方式同步 EOS 主網的結果來看,能夠得出的結論是使用快照啓動的節點在 CPU 和 RAM 的使用上都要遠遠小於全節點。這就意味着在必定程度上使用快照同步的節點可以很大程度上的下降咱們的服務器成本。ios

3. 不停機數據備份

傳統的區塊數據備份步驟:git

  1. 中止同步中的節點
  2. 使用壓縮工具將區塊數據壓縮
  3. 從新啓動節點

快照備份步驟:github

訪問對應的接口: /v1/producer/create_snapshot,節點開始數據備份,備份結束後繼續同步,無需停掉正在運行的節點。json

經過上面的對比能夠看出,使用快照方式啓動的節點,在數據備份上將更加簡單便捷。vim

快照實現的原理

1. 使用快照啓動

相應的源碼地址: github.com/EOSIO/eos/b…api

auto infile = std::ifstream(my->snapshot_path->generic_string(), (std::ios::in | std::ios::binary));
auto reader = std::make_shared<istream_snapshot_reader>(infile);
reader->validate();
reader->read_section<genesis_state>([this]( auto &section ){
        section.read_row(my->chain_config->genesis);
        });
infile.close();
複製代碼

從源碼中能夠看出當啓動添加參數:snapshot時,會以快照中的數據啓動。安全

2. 實現快照備份

進行快照備份時,服務器資源使用狀況穩定。但正在備份中的節點服務將暫時不可用,待數據備份結束後將恢復。因此推薦備份節點和業務節點獨立開。 相應的源碼以下: github.com/EOSIO/eos/b…bash

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<ostream_snapshot_writer>(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 節點地址信息能夠去 p2pcheck.fibospubg.top/v1/net/conn… 獲取。

生成快照

啓動節點後,經過調用接口:/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+

經過快照啓動

下載快照文件:

最新的快照文件地址: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 節點地址信息能夠去 github.com/CryptoLions… 獲取

快照方式啓動腳本:

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"
}
複製代碼

適用場景

  1. 搭建本身的 EOS、FIBOS API 節點
  2. 只關心當前最新的區塊數據、交易,無需溯源
相關文章
相關標籤/搜索