EOS 的日誌文件已經達到了 160G,同步一個 EOS 全節點大約須要耗時 10-15 天的時間,時間成本很是高。做爲一個普通 Dapp 開發者,咱們並不須要以前的區塊數據,因此徹底不須要浪費大把時間去同步一個 EOS 全節點。經過快照同步的方式可以很好的知足咱們的需求,使用最新快照啓動的節點,可以在 3~4 分鐘內完成節點同步達到主網高度,時間成本大大下降。node
快照啓動的節點,區塊日誌 block.log 內只會保存節點啓動以後的區塊數據,佔用的磁盤空間更小。對比全節點和快照方式啓動的節點兩種方式同步 EOS 主網的結果來看,能夠得出的結論是使用快照啓動的節點在 CPU 和 RAM 的使用上都要遠遠小於全節點。這就意味着在必定程度上使用快照同步的節點可以很大程度上的下降咱們的服務器成本。ios
傳統的區塊數據備份步驟:git
快照備份步驟:github
訪問對應的接口: /v1/producer/create_snapshot
,節點開始數據備份,備份結束後繼續同步,無需停掉正在運行的節點。json
經過上面的對比能夠看出,使用快照方式啓動的節點,在數據備份上將更加簡單便捷。vim
相應的源碼地址: https://github.com/EOSIO/eos/...,截取部分代碼: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 §ion ){ section.read_row(my->chain_config->genesis); }); infile.close();
從源碼中能夠看出當啓動添加參數:snapshot
時,會以快照中的數據啓動。安全
進行快照備份時,服務器資源使用狀況穩定。但正在備份中的節點服務將暫時不可用,待數據備份結束後將恢復。因此推薦備份節點和業務節點獨立開。
相應的源碼以下: 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<ostream_snapshot_writer>(snap_out); chain.write_snapshot(writer); writer->finalize(); snap_out.flush(); snap_out.close(); return {head_id, snapshot_path}; }
從源碼中能夠看出,當進行快照備份時,會將備份數據寫到咱們設置的路徑下,快照的文件名爲當前區塊的hash。app
下面咱們將詳細介紹在 FIBOS、EOS 上如何經過快照啓動
注意: 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();
注意: 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" }