EOS 区块链数据实时异构到 MongoDB

文章目录

[隐藏]

  • 0x00 背景
  • 0x01 部署
  • 0x02 测试
  • 0x03 小结
  • 0x04 参考

从 EOSIO 1.1.0 开始,已经默认支持 MongoDB,所以本文提供的方法仅做参考。

0x00 背景

执行 eosio_build.sh 脚本编译 nodeos 会默认安装 mongodb,但是从 Dawn 4.0 开始,mongo_db_plugin 插件不再生效,详情请参考(https://github.com/EOSIO/eos/issues/3030)。(https://github.com/EOSIO/eos/pull/4304)PR 重新支持 MongoDB,本文讲解如何将链上数据实时同步到 MongoDB。

0x01 部署

部署的思路如下:

  • 编译支持 mongo_db_plugin 的 nodeos
  • 配置 MongoDB
  • 启动 MongoDB
  • 创建数据库
  • 启动 nodeos,同步主网数据
  • 查看 MongoDB,确认数据

接下来我们逐步讲解。

由于 EOSIO 代码库有 gh#3030-enable-mongodb 分支,所以可以使用 git 自动将支持 mongo_db_plugin 插件的代码合并,详细命令如下:

$ mkdir -p /data/mongodb && cd /data/mongodb  $ git clone -b release/1.1 https://github.com/EOSIO/eos.git --recursive  $ cd eos  $ git fetch --all --tags --prune  $ git merge --m "merge" --commit origin/gh#3030-enable-mongodb  $ git submodule update --init --recursive  $ ./eosio_build.sh  

如果 nodeos 编译成功,MongoDB 自动安装,路径在 $USER/opt/mongodb。执行 /data/mongodb/eos/build/programs/nodeos/nodeos –help | grep mongo,如果有如下的输出,表示 MongoDB 插件编译成功。

Config Options for eosio::mongo_db_plugin:    -q [ --mongodb-queue-size ] arg (=256)    --mongodb-wipe                        Required with --replay-blockchain,                                          --delete-all-blocks to wipe mongo                                          accidental wipe of mongo db.    --mongodb-block-start arg (=0)        If specified then only abi data pushed                                          to mongodb until specified block is    -m [ --mongodb-uri ] arg              MongoDB URI connection string, see:                                          https://docs.mongodb.com/master/referen                                          in URI. Example: mongodb://127.0.0.1:27  

接下来我们配置 MongoDB。

$ mkdir -p /data/mongodb/db /data/mongodb/logs  $ touch /data/mongodb/mongodb.conf  

mongodb.conf 配置文件内容如下:

systemLog:    destination: file    path: /data/mongodb/logs/mongo.log    logAppend: true  storage:    dbPath: /data/mongodb/db    journal:     enabled: true  net:    bindIp: 127.0.0.1    port: 27017  

接着启动 MongoDB,并且创建 eos 数据库。

$ /$USER/opt/mongodb/bin/mongod -f /data/mongodb/mongodb.conf --fork  $ /$USER/opt/mongodb/bin/mongo --port 27017  $ use eos  

然后配置 EOS 主网 fullnode。

$ mkdir /data/mainnet  $ cd /data/mainnet  $ git clone https://github.com/superoneio/eos-mainnet  $ mkdir -p data logs config  $ cp eos-mainnet/config.ini mainnet/config  $ cp eos-mainnet/genesis.json mainnet  $ cp eos-mainnet/*.sh mainnet  $ chmod +x mainnet  

修改 config.ini 相关配置,添加如下参数:

plugin = eosio::mongo_db_plugin  mongodb-uri = mongodb://127.0.0.1:27017/eos  

最后执行 start.sh,同步主网数据。

0x02 测试

我们执行 $ /$USER/opt/mongodb/bin/mongo –port 27017 登录到 MongoDB,可以对同步的数据进行校验。

> use eos  > show dbs  admin   0.000GB  config  0.000GB  eos     0.031GB  local   0.000GB  > use eos  switched to db eos  > show tables;  accounts  actions  block_states  blocks  transaction_traces  transactions  > db.accounts.find({name:{$eq:'eosio.ram'}})  { "_id" : ObjectId("5b4163f2992ecd51b4277f77"), "name" : "eosio.ram", "createdAt" : ISODate("2018-07-08T01:08:02.071Z") }  
0x03 小结

之前介绍了将 EOS 主网数据同步到 MySQL,本文讲解了另一种同步到文档型数据库的方法。MySQL 和 MongoDB 最大的区别在于,MySQL 是传统的关系型数据库,支持 SQL 标准,而 MongoDB 是文档型数据库。MySQL 天生适用于结构化数据以及需要使用事务的场景,天生支持 SQL 标准,对开发者比较友好。

MongoDB 适合如下场景:[1]

  • 表结构不明确且数据不断变大,MongoDB 是非结构化文档数据库,扩展字段很容易且不会影响原有数据
  • 更高的写入负载,MongoDB 侧重高数据写入的性能,而非事务安全
  • 数据量很大或者将来会变得很大,MongoDB 内建了 Sharding、数据分片的特性,容易水平扩展
  • 高可用性,MongoDB 自带高可用,自动主从切换(副本集)

而 MongoDB 不支持事务、不支持 JOIN,所以涉及事务和复杂查询的场景不适合 MySQL。

关于 MongoDB 和 MySQL 的对比,可以点击 https://ruby-china.org/topics/27659 查看。

0x04 参考
  • [1] 张家江 (2017–09–07). SOCI Installation. Retrieved from http://tech.lede.com/2017/09/07/rd/server/MongoDBvsMysql

原文出处:medium -> https://medium.com/@robinwan/eos-%E5%8C%BA%E5%9D%97%E9%93%BE%E6%95%B0%E6%8D%AE%E5%AE%9E%E6%97%B6%E5%BC%82%E6%9E%84%E5%88%B0-mongodb-149f8e3c639

本站所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如果侵犯你的利益,请发送邮箱到 [email protected],我们会很快的为您处理。