数据仓库组件Data-Stash:助力区块链节点“轻装上阵”

2023-10-13 14:59

本文主要是介绍数据仓库组件Data-Stash:助力区块链节点“轻装上阵”,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

当下,数据在全球经济运转中的价值日益凸显,与传统的土地、劳动力、资本、技术等并列,成为重要生产要素。

数据最终的价值来源于治理。只有经过采集、清洗、分析和处理后的数据,才能在流通中更顺畅地使用,其价值才能得到更充分地挖掘。同时,随着区块链技术的蓬勃发展,区块链渐趋规模化应用,链上数据总量呈指数级增长,其中蕴藏的巨大价值,也需要通过高效、规范的数据治理,才能得到充分彰显。

在区块链数据治理方面,微众银行区块链基于多年技术研究和应用实践经验,研发了一套数据治理通用组件(WeBankBlockchain-Data),多维提升开发、运营、运维效率,实现数据从要素到资源的转化。

目前,该套组件由数据仓库组件(Data-Stash)数据导出组件(Data-Export)数据对账组件(Data-Reconcile)三个相互独立、可插拔、可灵活组装的子组件构成,所有代码和文档均于2020年12月正式对外开源。详情可参考开源公告。

三个子组件面向不同角色解决相应的数据治理需求,业务、运营、开发、运维等不同角色,如何快速上手使用?我们将通过系列文章,抽丝剥茧解析每一个子组件的关键特性和使用方式。本文介绍数据仓库组件Data-Stash,欢迎大家积极体验并将使用诉求或优化建议反馈给我们。

  认识Data-Stash

随着区块链业务不断运行,累积的海量链上数据会对区块链节点乃至网络的运维带来挑战。

从磁盘容量来看,由于节点容量有限,持续膨胀的数据要求磁盘不断扩容。

从交易性能来看,过多的数据会带来交易执行性能的衰减。

从节点同步来看,大量的数据同步会引出网络带宽被侵占、同步速度缓慢等问题。

数据仓库组件Data-Stash为上述难题提供解决方案,通过为节点在外部生成全量数据备份,实现海量数据高效治理。

具体而言,节点通过数据裁剪实现冷热数据分离,链上仅保留热数据,冷数据则通过全量备份获取,以此节省节点空间。冷热数据分离后,交易的验证、执行仅依赖于链上热数据,从而提升交易执行性能。

对于新节点加入网络后数据的同步,只需要从全量备份拉取数据,实现数据高效同步,其间不占用区块链网络带宽,免去冗长的同步过程,减少节点数据同步的等待时间,使得节点可以快速加入区块链网络并正常工作。

目前该组件支持区块链底层平台FISCO BCOS v2.7.1及以上版本。

  Data-Stash关键特性一览

作为一个数据治理工具,Data-Stash可为区块链底层平台提供节点数据扩容、备份、裁剪和高效同步的能力,具有断点续传、可信验证、易于使用等优点。用户可基于Binlog协议同步区块链底层节点全量数据,进而实现全量数据备份、冷热数据分离、节点快速同步,适合节点有海量数据等运维场景。

1)节点账本全量备份

Data-Stash通过解析节点生成的Binlog,可以在节点外生成链上数据的全量备份。随后,节点运维人员可对链上数据进行裁剪,达到节省空间、提升性能的效果。对于裁剪后缺失的冷数据,节点会通过amdb从全量备份读取。节点还可以通过fisco-sync工具,将数据重新导回到节点,恢复完整的节点,而不必从区块链网络拉取数据。

2)多维度账本校验

数据仓库组件在读取某节点日志后,会进行多重校验,以防出现节点账本信息被损害、被篡改、共识系统异常等情况。

校验是多维度的,整体可分为对比校验和区块链校验。对比校验是指Data-Stash会拉取多个节点的账本进行对比,确认账本内容一致后才可以入库;区块链校验是指验证区块链本身,包括哈希检查、签名检查、状态根检查等。

3)备份数据可信存储

Data-Stash每处理完一个区块,都会为此时的全量备份生成一个哈希值作为检查点。该检查点会为存储增信,适用于全量备份库之间的校验等场景。

例如,不同机构生成了各自的全量备份,现在想比对各自备份数据是否一致,各机构只需要提取出最新区块高度的检查点进行比对,如一致,则表示备份内容完全相同。

4)断点续传

在实际运行中,FISCO BCOS会生成许多Binlog,这些Binlog无论是体积、数目,都具有相当规模,如果每一次运行都重复下载、解析,会造成性能浪费。为此,我们设计了断点续传机制,组件会持续记录解析的进度,每次运行时都会从上一次断点处运行,而不会重新开始。

5)易于使用

Data-Stash以jar包的形式提供服务,用户可通过jar包或bash脚本运行。开发者只需要做最少化配置,默认情况下,只需要配置nginx地址、全量数据库地址,程序即可运行。

此外,Data-Stash还允许用户进行更高级的配置设置,例如修改批插入次数、轮询间隔等。

  Data-Stash如何进行数据治理?

Data-Stash是助力海量数据治理的第一环,通过生成节点全量备份,以满足冷热分离、高效同步、监管审计等需求。

1)实现冷热数据分离

随着时间推移,节点会积累越来越多的账本数据,如果节点体积不受控制的增长,最终会将节点服务器侵蚀殆尽,造成不良影响。对此,开发者可以使用数据仓库服务来实现冷热数据分离。

  • 确保节点已经开启Binlog,如果节点未开启Binlog并已在运行,可先停止节点,删除群组数据、开启Binlog后再重启节点,节点即可重新同步并生成Binlog。

  • 准备好一个第三方数据库,启动Data-Stash服务,将节点Binlog持续导入到该数据库中,实现全量备份。

  • 开发者可对链上数据做一定划分,可将节点上不常用数据删除,特别是对于存证这样关联性较弱的业务,保留近期数据即可。

  • 为了让节点运行不受影响,用户需要保证启用amdb,这样缺失的冷数据会自动从数据仓库读取,完成节点瘦身。

    启用amdb请参考:

    https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/manual/data_governance.html#amdb-proxy

2)实现节点高效同步

在区块链业务运行时,经常有节点同步或升级的需求。例如,服务器因为某些故障需要被下线回收,或者需要更换磁盘,此时需要对服务器或磁盘数据进行同步,重新运行节点需要从区块链网络里同步数据,若待同步数据很大,例如几十G、几百G,就会使得数据恢复时间冗长,而且还会占满区块链的网络带宽,使得整个系统长时间停滞。

开发者可通过Data-Stash实现节点同步:

  • 开发者需要通过Data-Stash生成全量数据备份。

  • 当需要节点同步时,开发者可以通过FISCO BCOS项目下的fisco sync数据同步工具,将数据仓库导回到节点。这一过程不依赖于任何其他节点,所以同步不会占用区块链的网络资源。

    fisco sync数据同步工具参考链接:

    https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/manual/data_governance.html#fisco-sync

3)监管、审计、追溯

对于监管方而言,要求账本数据完整、可查询,但区块链自身的账本数据库不一定满足该需求。例如出于节点瘦身、数据分片等需求,节点上可能仅存储部分账本数据;出于写性能的需要,区块链会选择rocksdb等数据库,但这类数据库在读性能上不具备优势。

此时,监管方可以对某个节点运行数据仓库服务导出完整的全量备份,由于关系型数据库的采用,查询也十分便捷。同时,在全量备份过程中,我们采用的多维度校验机制具有易于验证的优势,可防止节点运维恶意修改账本信息欺骗监管方,更好地满足监管需求。

  Data-Stash整体架构

FISCO BCOS节点在共识过程中持续获取新的区块,并更新自己的账本状态,此外还会生成Binlog日志,以记录该区块对应的状态变动,外界可以通过nginx访问到这些Binlog日志。

与此同时,Data-Stash会不断轮询nginx以下载最新的Binlog日志到本地,并进行解析,解析出区块变动信息后会进行校验,防止错误的Binlog被导入。校验通过后,区块变动数据会存储到指定的持久化系统中,这样该系统就成为了节点账本的全量备份。

Data-Stash还会为每一个区块生成对应的检查点,为全量备份增信。本地被处理完的Binlog也会被清理掉。

Data-Stash的整体运行模式如下:

其中,节点服务器需要用户手动配置,配置好后即可调用Data-Stash进行解析。

节点服务器

节点服务器相关的组件包括:

1)FISCO BCOS节点

FISCO BCOS节点的账本按照mysql存储,每新增加一个区块,都会为mysql里添加一些数据,mysql表的变化会被记录到Binlog中,Binlog目录被放在data/groupX/BinaryLogs目录下,x表示群组号:

2)Nginx

FISCO BCOS节点本身并不会暴露Binlog,如果希望外界读取到Binlog,需要借助nginx。通过在nginx中配置端口和Binlog目录的映射,外界就可以通过该端口访问到Binlogs。

认识Binlog:

Binlog记录账本的变化。在FISCO BCOS中,每得到一个新的区块后,该区块都会被存储到账本中,同时Binlog会记录账本的变动,并按区块来进行组织。每个Binlog日志会包含多个区块对应的变化,Binlog会以记录的第一个区块高度作为文件名,例如3.binlog表示该文件中的区块以3作为起始。

下图是Binlog的结构:

数据仓库组件

数据仓库组件由如下几个部分构成:

1)下载服务Fetcher Server

下载服务会持续轮询nginx端口,下载最新Binlog日志到本地目录中。

2)解析服务Binlog Parser

解析服务持续读取Binlog日志,并对Binlog中的区块信息进行解析。

3)校验服务Binlog verifier

校验服务用于保证数据的可信性。校验服务会从其他节点拉取Binlog进行对比,保证内容的一致性,并对数据本身进行校验,例如对于区块哈希校验、区块签名校验、交易根校验等。

4)存储服务Data Storage

存储服务按照Binlog的变动,会将其内容应用到数据库中,该数据库会包含系统表、合约表等,结构上与节点保持一致,数据量上则包含节点运行至今的所有区块链数据。表结构可分为如下几类:

类型

表前缀

说明

系统表

_sys_

包含区块链信息,例如区块数据(_sys_hash_2_block_)、共识状态(_sys_consensus_)、cns(_sys_cns_)等

合约表

c_或cp_

记录合约信息,包括nonce值、合约代码、代码哈希等

用户表

_u_

调用CRUD合约创建的表

5)检查点服务Checkpoint Handler

每一个区块数据的入库存储,都会生成一个检查点数据,该检查点包含了前置所有区块数据的哈希,用于额外对存储进行增信。

  即刻使用

上述功能所涉及的最新代码和技术文档已同步更新,欢迎体验和 star 支持。如需咨询技术问题,欢迎关注本公众号,对话框回复【小助手】进技术交流群。

Data-Stash github代码库地址码仓库:

https://github.com/WeBankBlockchain/Data-Stash

Data-Stash gitee代码库地址:

https://gitee.com/WeBankBlockchain/Data-Stash

Data-Stash 技术文档:

https://data-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-Data-Stash/index.html

首次体验Data-Stash,可参考快速部署文档:

https://data-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-Data-Stash/quickstart.html

向我们报告问题,欢迎提交issue:

https://github.com/WeBankBlockchain/Data-Stash/issues

这篇关于数据仓库组件Data-Stash:助力区块链节点“轻装上阵”的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/204016

相关文章

Vue中组件之间传值的六种方式(完整版)

《Vue中组件之间传值的六种方式(完整版)》组件是vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用,针对不同的使用场景,如何选择行之有效的通信方式... 目录前言方法一、props/$emit1.父组件向子组件传值2.子组件向父组件传值(通过事件形式)方

Spring组件初始化扩展点BeanPostProcessor的作用详解

《Spring组件初始化扩展点BeanPostProcessor的作用详解》本文通过实战案例和常见应用场景详细介绍了BeanPostProcessor的使用,并强调了其在Spring扩展中的重要性,感... 目录一、概述二、BeanPostProcessor的作用三、核心方法解析1、postProcessB

kotlin中的行为组件及高级用法

《kotlin中的行为组件及高级用法》Jetpack中的四大行为组件:WorkManager、DataBinding、Coroutines和Lifecycle,分别解决了后台任务调度、数据驱动UI、异... 目录WorkManager工作原理最佳实践Data Binding工作原理进阶技巧Coroutine

HTML5 data-*自定义数据属性的示例代码

《HTML5data-*自定义数据属性的示例代码》HTML5的自定义数据属性(data-*)提供了一种标准化的方法在HTML元素上存储额外信息,可以通过JavaScript访问、修改和在CSS中使用... 目录引言基本概念使用自定义数据属性1. 在 html 中定义2. 通过 JavaScript 访问3.

Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)

《Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)》文章介绍了如何使用dhtmlx-gantt组件来实现公司的甘特图需求,并提供了一个简单的Vue组件示例,文章还分享了一... 目录一、首先 npm 安装插件二、创建一个vue组件三、业务页面内 引用自定义组件:四、dhtmlx

Vue ElementUI中Upload组件批量上传的实现代码

《VueElementUI中Upload组件批量上传的实现代码》ElementUI中Upload组件批量上传通过获取upload组件的DOM、文件、上传地址和数据,封装uploadFiles方法,使... ElementUI中Upload组件如何批量上传首先就是upload组件 <el-upl

Vue3中的动态组件详解

《Vue3中的动态组件详解》本文介绍了Vue3中的动态组件,通过`component:is=动态组件名或组件对象/component`来实现根据条件动态渲染不同的组件,此外,还提到了使用`markRa... 目录vue3动态组件动态组件的基本使用第一种写法第二种写法性能优化解决方法总结Vue3动态组件动态

四种Flutter子页面向父组件传递数据的方法介绍

《四种Flutter子页面向父组件传递数据的方法介绍》在Flutter中,如果父组件需要调用子组件的方法,可以通过常用的四种方式实现,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录方法 1:使用 GlobalKey 和 State 调用子组件方法方法 2:通过回调函数(Callb

Vue项目中Element UI组件未注册的问题原因及解决方法

《Vue项目中ElementUI组件未注册的问题原因及解决方法》在Vue项目中使用ElementUI组件库时,开发者可能会遇到一些常见问题,例如组件未正确注册导致的警告或错误,本文将详细探讨这些问题... 目录引言一、问题背景1.1 错误信息分析1.2 问题原因二、解决方法2.1 全局引入 Element

vue解决子组件样式覆盖问题scoped deep

《vue解决子组件样式覆盖问题scopeddeep》文章主要介绍了在Vue项目中处理全局样式和局部样式的方法,包括使用scoped属性和深度选择器(/deep/)来覆盖子组件的样式,作者建议所有组件... 目录前言scoped分析deep分析使用总结所有组件必须加scoped父组件覆盖子组件使用deep前言