EOS的Blockvault-逻辑节点

什么是Blockvault

EOS从v2.1.0开始加入了blockvault功能,下面是官网对blockvault功能的解释

[Developer Preview] Blockvault (#9705)

Nodeos now supports clustering for the block producer node, enabling blockchain administrators to implement industry standard disaster recovery architectures. Two or more nodes may be deployed as a single logical producer. If the primary node goes down, a system properly configured to leverage this solution can attain similar data recovery guarantees to that of industry leading database and cloud services, with minimal service disruption.

While this feature increases resiliency for block production on public networks, it also provides particular value for private chains running with a single logical producer. Single-producer chains can use it to provide immediate finality with tools to mitigate the risk of a single point of failure.

To use this feature, nodeos must be configured as a producer with the appropriate --block-vault-backend option specified. For example:

nodeos --plugin eosio::producer_plugin --producer-name myproducera --plugin eosio::blockvault_client_plugin --block-vault-backend postgresql://user:password@mycompany.com

For more information on using this feature please see the README.md file in directory ~/eos/plugins/blockvault_client_plugin/README.md.

This feature is being released as a "developer preview" and is not yet ready for production usage. We look forward to community feedback to further develop and harden this feature.

意思是几个节点可以部署在一起协同工作,就像一个逻辑节点,以增强系统的可靠性,健壮性。

在v2.1.0还是属于开发预览阶段,不要用于生产。

功能体验

启动一个postgresql数据库:

docker run  -d --net host --name postgresql -e POSTGRES_PASSWORD=postgres postgres

打开两个ssh终端,分别创建一个eos的容器

docker run -it --name node1 --rm --net host -e POSTGRES_PASSWORD=postgres zhopen/eosio.eos:v2.1.0 bash
docker run -it --name node2 --rm --net host -e POSTGRES_PASSWORD=postgres zhopen/eosio.eos:v2.1.0 bash

在两个容器内,创建genesis.json文件:

echo '
{
  "initial_timestamp": "2018-06-01T12:00:00.000",
  "initial_key": "EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV",
  "initial_configuration": {
    "max_block_net_usage": 1048576,
    "target_block_net_usage_pct": 1000,
    "max_transaction_net_usage": 524288,
    "base_per_transaction_net_usage": 12,
    "net_usage_leeway": 500,
    "context_free_discount_net_usage_num": 20,
    "context_free_discount_net_usage_den": 100,
    "max_block_cpu_usage": 200000,
    "target_block_cpu_usage_pct": 1000,
    "max_transaction_cpu_usage": 150000,
    "min_transaction_cpu_usage": 100,
    "max_transaction_lifetime": 3600,
    "deferred_trx_expiration_window": 600,
    "max_transaction_delay": 3888000,
    "max_inline_action_size": 524288,
    "max_inline_action_depth": 4,
    "max_authority_depth": 6
  }
}
' > /genesis.json

在两个容器内分别启动nodeos:

nodeos \
  --producer-name eosio \
  --signature-provider EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV=KEY:5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3 \
  --data-dir /data \
  --enable-stale-production \
  --plugin eosio::chain_api_plugin \
  --genesis-json /genesis.json \
  --plugin eosio::blockvault_client_plugin \
  --block-vault-backend "postgresql://postgres:postgres@127.0.0.1:5432" \
  --p2p-listen-endpoint 0.0.0.0:9876 \
  --http-server-address 0.0.0.0:8888 \
#  --p2p-peer-address 127.0.0.1:9877
nodeos \
  --producer-name eosio \
  --signature-provider EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV=KEY:5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3 \
  --data-dir /data \
  --enable-stale-production \
  --plugin eosio::chain_api_plugin \
  --genesis-json /genesis.json \
  --plugin eosio::blockvault_client_plugin \
  --block-vault-backend "postgresql://postgres:postgres@127.0.0.1::5432" \
  --p2p-listen-endpoint 0.0.0.0:9877 \
  --http-server-address 0.0.0.0:8889 \
#  --p2p-peer-address 127.0.0.1:9876

注意,并不需要--p2p-peer-address,虽然两个节点随机的轮换出块,但是两个节点中保存都是所有的块数据。

下面是两个节点的运行状态。可以看到,两个节点交替的生产区块,node1生产区块,则node2就不生产区块,而是从接收node1区块。

node1

warn  2021-10-15T07:13:16.404 nodeos    producer_plugin.cpp:2217      maybe_produce_block  ] Aborting block due to block vault rejected block, waiting on external block to continue
error 2021-10-15T07:13:16.404 nodeos    producer_plugin.cpp:1501      start_block          ] Not producing block because the block number has been rejected by block vault
error 2021-10-15T07:13:16.404 nodeos    producer_plugin.cpp:1501      start_block          ] Not producing block because the block number has been rejected by block vault
info  2021-10-15T07:13:16.406 nodeos    producer_plugin.cpp:421       on_incoming_block    ] Received block dd7a73016a4e3d2a... #7424 @ 2021-10-15T07:13:16.500 signed by eosio [trxs: 0, lib: 7423, conf: 0, latency: -93 ms]
info  2021-10-15T07:13:16.905 nodeos    producer_plugin.cpp:2333      produce_block        ] Produced block 2e4c5552717a8be3... #7425 @ 2021-10-15T07:13:17.000 signed by eosio [trxs: 0, lib: 7424, confirmed: 0]
warn  2021-10-15T07:13:17.306 nodeos    producer_plugin.cpp:2217      maybe_produce_block  ] Aborting block due to block vault rejected block, waiting on external block to continue
error 2021-10-15T07:13:17.306 nodeos    producer_plugin.cpp:1501      start_block          ] Not producing block because the block number has been rejected by block vault
error 2021-10-15T07:13:17.306 nodeos    producer_plugin.cpp:1501      start_block          ] Not producing block because the block number has been rejected by block vault
info  2021-10-15T07:13:17.307 nodeos    producer_plugin.cpp:421       on_incoming_block    ] Received block c574afebd0338882... #7426 @ 2021-10-15T07:13:17.500 signed by eosio [trxs: 0, lib: 7425, conf: 0, latency: -192 ms]
info  2021-10-15T07:13:17.905 nodeos    producer_plugin.cpp:2333      produce_block        ] Produced block 4e1910362243ad4b... #7427 @ 2021-10-15T07:13:18.000 signed by eosio [trxs: 0, lib: 7426, confirmed: 0]
info  2021-10-15T07:13:18.404 nodeos    producer_plugin.cpp:2333      produce_block        ] Produced block d3f409c3bab818df... #7428 @ 2021-10-15T07:13:18.500 signed by eosio [trxs: 0, lib: 7427, confirmed: 0]
info  2021-10-15T07:13:18.904 nodeos    producer_plugin.cpp:2333      produce_block        ] Produced block 573d3b71fcf392ec... #7429 @ 2021-10-15T07:13:19.000 signed by eosio [trxs: 0, lib: 7428, confirmed: 0]
info  2021-10-15T07:13:19.405 nodeos    producer_plugin.cpp:2333      produce_block        ] Produced block de10dc2d507f3a52... #7430 @ 2021-10-15T07:13:19.500 signed by eosio [trxs: 0, lib: 7429, confirmed: 0]
info  2021-10-15T07:13:19.905 nodeos    producer_plugin.cpp:2333      produce_block        ] Produced block 4785f4e9cf235630... #7431 @ 2021-10-15T07:13:20.000 signed by eosio [trxs: 0, lib: 7430, confirmed: 0]
info  2021-10-15T07:13:20.405 nodeos    producer_plugin.cpp:2333      produce_block        ] Produced block 5e107a3a480470f5... #7432 @ 2021-10-15T07:13:20.500 signed by eosio [trxs: 0, lib: 7431, confirmed: 0]
info  2021-10-15T07:13:20.906 nodeos    producer_plugin.cpp:2333      produce_block        ] Produced block 55ae3980592c1e0c... #7433 @ 2021-10-15T07:13:21.000 signed by eosio [trxs: 0, lib: 7432, confirmed: 0]
info  2021-10-15T07:13:21.404 nodeos    producer_plugin.cpp:2333      produce_block        ] Produced block 24f1614d28fe27c1... #7434 @ 2021-10-15T07:13:21.500 signed by eosio [trxs: 0, lib: 7433, confirmed: 0]
info  2021-10-15T07:13:21.905 nodeos    producer_plugin.cpp:2333      produce_block        ] Produced block e8a91c1a18028e9b... #7435 @ 2021-10-15T07:13:22.000 signed by eosio [trxs: 0, lib: 7434, confirmed: 0]
warn  2021-10-15T07:13:22.407 nodeos    producer_plugin.cpp:2217      maybe_produce_block  ] Aborting block due to block vault rejected block, waiting on external block to continue
error 2021-10-15T07:13:22.407 nodeos    producer_plugin.cpp:1501      start_block          ] Not producing block because the block number has been rejected by block vault
error 2021-10-15T07:13:22.407 nodeos    producer_plugin.cpp:1501      start_block          ] Not producing block because the block number has been rejected by block vault
info  2021-10-15T07:13:22.407 nodeos    producer_plugin.cpp:421       on_incoming_block    ] Received block a985db8d87f6dd32... #7436 @ 2021-10-15T07:13:22.500 signed by eosio [trxs: 0, lib: 7435, conf: 0, latency: -92 ms]
info  2021-10-15T07:13:22.905 nodeos    producer_plugin.cpp:2333      produce_block        ] Produced block 96984600b79c2823... #7437 @ 2021-10-15T07:13:23.000 signed by eosio [trxs: 0, lib: 7436, confirmed: 0]
warn  2021-10-15T07:13:23.306 nodeos    producer_plugin.cpp:2217      maybe_produce_block  ] Aborting block due to block vault rejected block, waiting on external block to continue
error 2021-10-15T07:13:23.306 nodeos    producer_plugin.cpp:1501      start_block          ] Not producing block because the block number has been rejected by block vault
error 2021-10-15T07:13:23.306 nodeos    producer_plugin.cpp:1501      start_block          ] Not producing block because the block number has been rejected by block vault
info  2021-10-15T07:13:23.307 nodeos    producer_plugin.cpp:421       on_incoming_block    ] Received block 923286784fca38e2... #7438 @ 2021-10-15T07:13:23.500 signed by eosio [trxs: 0, lib: 7437, conf: 0, latency: -192 ms]
info  2021-10-15T07:13:23.905 nodeos    producer_plugin.cpp:2333      produce_block        ] Produced block 87b483f68e617faf... #7439 @ 2021-10-15T07:13:24.000 signed by eosio [trxs: 0, lib: 7438, confirmed: 0]
info  2021-10-15T07:13:24.404 nodeos    producer_plugin.cpp:2333      produce_block        ] Produced block abccbca0ac47f955... #7440 @ 2021-10-15T07:13:24.500 signed by eosio [trxs: 0, lib: 7439, confirmed: 0]

node2

eon_incoming_block    ] Received block 55ae3980592c1e0c... #7433 @ 2021-10-15T07:13:21.000 signed by eosio [trxs: 0, lib: 7432, conf: 0, latency: -93 ms]
warn  2021-10-15T07:13:21.404 nodeos    producer_plugin.cpp:2217      maybe_produce_block  ] Aborting block due to block vault rejected block, waiting on external block to continue
error 2021-10-15T07:13:21.404 nodeos    producer_plugin.cpp:1501      start_block          ] Not producing block because the block number has been rejected by block vault
error 2021-10-15T07:13:21.404 nodeos    producer_plugin.cpp:1501      start_block          ] Not producing block because the block number has been rejected by block vault
info  2021-10-15T07:13:21.405 nodeos    producer_plugin.cpp:421       on_incoming_block    ] Received block 24f1614d28fe27c1... #7434 @ 2021-10-15T07:13:21.500 signed by eosio [trxs: 0, lib: 7433, conf: 0, latency: -94 ms]
warn  2021-10-15T07:13:21.904 nodeos    producer_plugin.cpp:2217      maybe_produce_block  ] Aborting block due to block vault rejected block, waiting on external block to continue
error 2021-10-15T07:13:21.905 nodeos    producer_plugin.cpp:1501      start_block          ] Not producing block because the block number has been rejected by block vault
error 2021-10-15T07:13:21.905 nodeos    producer_plugin.cpp:1501      start_block          ] Not producing block because the block number has been rejected by block vault
info  2021-10-15T07:13:21.906 nodeos    producer_plugin.cpp:421       on_incoming_block    ] Received block e8a91c1a18028e9b... #7435 @ 2021-10-15T07:13:22.000 signed by eosio [trxs: 0, lib: 7434, conf: 0, latency: -93 ms]
info  2021-10-15T07:13:22.406 nodeos    producer_plugin.cpp:2333      produce_block        ] Produced block a985db8d87f6dd32... #7436 @ 2021-10-15T07:13:22.500 signed by eosio [trxs: 0, lib: 7435, confirmed: 0]
warn  2021-10-15T07:13:22.904 nodeos    producer_plugin.cpp:2217      maybe_produce_block  ] Aborting block due to block vault rejected block, waiting on external block to continue
error 2021-10-15T07:13:22.904 nodeos    producer_plugin.cpp:1501      start_block          ] Not producing block because the block number has been rejected by block vault
error 2021-10-15T07:13:22.905 nodeos    producer_plugin.cpp:1501      start_block          ] Not producing block because the block number has been rejected by block vault
info  2021-10-15T07:13:22.906 nodeos    producer_plugin.cpp:421       on_incoming_block    ] Received block 96984600b79c2823... #7437 @ 2021-10-15T07:13:23.000 signed by eosio [trxs: 0, lib: 7436, conf: 0, latency: -93 ms]
info  2021-10-15T07:13:23.306 nodeos    producer_plugin.cpp:2333      produce_block        ] Produced block 923286784fca38e2... #7438 @ 2021-10-15T07:13:23.500 signed by eosio [trxs: 0, lib: 7437, confirmed: 0]
warn  2021-10-15T07:13:23.905 nodeos    producer_plugin.cpp:2217      maybe_produce_block  ] Aborting block due to block vault rejected block, waiting on external block to continue
error 2021-10-15T07:13:23.905 nodeos    producer_plugin.cpp:1501      start_block          ] Not producing block because the block number has been rejected by block vault
error 2021-10-15T07:13:23.905 nodeos    producer_plugin.cpp:1501      start_block          ] Not producing block because the block number has been rejected by block vault
info  2021-10-15T07:13:23.906 nodeos    producer_plugin.cpp:421       on_incoming_block    ] Received block 87b483f68e617faf... #7439 @ 2021-10-15T07:13:24.000 signed by eosio [trxs: 0, lib: 7438, conf: 0, latency: -93 ms]
warn  2021-10-15T07:13:24.404 nodeos    producer_plugin.cpp:2217      maybe_produce_block  ] Aborting block due to block vault rejected block, waiting on external block to continue
error 2021-10-15T07:13:24.404 nodeos    producer_plugin.cpp:1501      start_block          ] Not producing block because the block number has been rejected by block vault
error 2021-10-15T07:13:24.404 nodeos    producer_plugin.cpp:1501      start_block          ] Not producing block because the block number has been rejected by block vault
info  2021-10-15T07:13:24.405 nodeos    producer_plugin.cpp:421       on_incoming_block    ] Received block abccbca0ac47f955... #7440 @ 2021-10-15T07:13:24.500 signed by eosio [trxs: 0, lib: 7439, conf: 0, latency: -94 ms]
warn  2021-10-15T07:13:24.905 nodeos    producer_plugin.cpp:2217      maybe_produce_block  ] Aborting block due to block vault rejected block, waiting on external block to continue
error 2021-10-15T07:13:24.905 nodeos    producer_plugin.cpp:1501      start_block          ] Not producing block because the block number has been rejected by block vault
error 2021-10-15T07:13:24.905 nodeos    producer_plugin.cpp:1501      start_block          ] Not producing block because the block number has been rejected by block vault
info  2021-10-15T07:13:24.906 nodeos    producer_plugin.cpp:421       on_incoming_block    ] Received block bb7eadc9a891017d... #7441 @ 2021-10-15T07:13:25.000 signed by eosio [trxs: 0, lib: 7440, conf: 0, latency: -93 ms]
warn  2021-10-15T07:13:25.405 nodeos    producer_plugin.cpp:2217      maybe_produce_block  ] Aborting block due to block vault rejected block, waiting on external block to continue
error 2021-10-15T07:13:25.405 nodeos    producer_plugin.cpp:1501      start_block          ] Not producing block because the block number has been rejected by block vault
error 2021-10-15T07:13:25.405 nodeos    producer_plugin.cpp:1501      start_block          ] Not producing block because the block number has been rejected by block vault
info  2021-10-15T07:13:25.406 nodeos    producer_plugin.cpp:421       on_incoming_block    ] Received block a4fe3ac0b86de83d... #7442 @ 2021-10-15T07:13:25.500 signed by eosio [trxs: 0, lib: 7441, conf: 0, latency: -93 ms]
info  2021-10-15T07:13:25.480 net-0     net_plugin.cpp:2585           operator()           ] Peer closed connection

异常测试

异常1: OK

删除一个节点的数据,或者使用--delete-all-blocks/--hard-replay-blockchain重启节点,也可以正常重建起完整的历史区块数据。

异常2

删除两个节点数据,也可以正常重建起完整的历史区块数据。

在这两种异常情况下还可以重建完整数据的,能恢复正常工作状态的原因还有待进一步分析。

异常3:OK

停止postgresql数据库,然后重启两个node。

出现错误 Database dirty flag set (likely due to unclean shutdown): replay required

使用--hard-replay-blockchain,都恢复正常。

异常4:KO

停止并清除posgresql的blockdata,snapshotdata表数据。

使用--hard-replay-block chain重启两个节点。

两个节点只有一个启动的能正常出块,另一个未能出块。

blockdata恢复了从第一个启动的节点终止时的块位置之后的记录,没有之前的记录。

postgres=# select * from blockdata;
 watermark_bn | watermark_ts |  lib  | block_num |                              block_id                              |                         previous_block_id                          | block | block_size 
--------------+--------------+-------+-----------+--------------------------------------------------------------------+--------------------------------------------------------------------+-------+------------
        22308 |   1380056460 | 22307 |     22308 | \x00005724d2ccab7911c244a28cff7f7509201049e69499e41b51fe2888f7111a | \x00005723c7312a4d6609c7b8e7a1a17135286e1dd710f2abed7df91469650942 | 16395 |        185
        22309 |   1380056461 | 22308 |     22309 | \x000057255ef8a23e145a2043307c1c847eedd332b15f62e88d8d8c2fbec596b2 | \x00005724d2ccab7911c244a28cff7f7509201049e69499e41b51fe2888f7111a | 16396 |        185
 

postgresql的表

数据库scheme
vault插件将创建两个表BlockData和SnapshotData,如果它还没有在数据库中。在下面的SQL语句中创建表。

CREATE TABLE IF NOT EXISTS BlockData (watermark_bn bigint, watermark_ts bigint, lib bigint, block_num bigint, block_id bytea UNIQUE, previous_block_id bytea, block oid, block_size bigint);
CREATE TABLE IF NOT EXISTS SnapshotData (watermark_bn bigint, watermark_ts bigint, snapshot oid);

 

postgres=# \dt
            List of relations
 Schema |     Name     | Type  |  Owner   
--------+--------------+-------+----------
 public | blockdata    | table | postgres
 public | snapshotdata | table | postgres
(2 rows)

postgres=# select * from snapshotdata;
 watermark_bn | watermark_ts | snapshot 
--------------+--------------+----------
(0 rows)

postgres=# select * from blockdata;
 watermark_bn | watermark_ts | lib  | block_num |                              block_id                              |                         previous_block_id                          | block | block_size 
--------------+--------------+------+-----------+--------------------------------------------------------------------+--------------------------------------------------------------------+-------+------------
            2 |   1380032438 |    0 |         2 | \x00000002692ec64b7809b7bc17b7a9217e729f620769e181028eddcaa896267b | \x000000017c8ae6fcc236a1254b032f9b375971d88025e717fcba43aeee9aa41a | 16395 |        185
            3 |   1380032439 |    2 |         3 | \x00000003350254e322ef21f5be489353ac0ef78b0d3095e1f0401c3fcd82628b | \x00000002692ec64b7809b7bc17b7a9217e729f620769e181028eddcaa896267b | 16396 |        185
            4 |   1380032440 |    3 |         4 | \x000000042538503613e15955fe879ff62495376d3f6ea5a8447b05142cccca04 | \x00000003350254e322ef21f5be489353ac0ef78b0d3095e1f0401c3fcd82628b | 16397 |        185
            5 |   1380032441 |    4 |         5 | \x00000005223cc32423675d30c6832763ea71c5778ae4931333d865a75fb67431 | \x000000042538503613e15955fe879ff62495376d3f6ea5a8447b05142cccca04 | 16398 |        185

对于生产环境,我们建议使用PGPASSW。例如:

export PGPASSWORD=password
nodeos --plugin eosio::producer_plugin --producer-name myproducera --plugin eosio::blockvault_client_plugin --block-vault-backend postgresql://user@mycompany.com

ORD环境变量来配置密码,而不是将密码嵌入到URI中。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值