什么是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中。