Dats-Stash节点数据清理和冷数据查询
基本概念
冷热数据
区块链的链上数据分为账本数据和状态数据。其中,账本数据存储的是每一个区块本身的二进制数据,以及每一条交易所在的区块块高,账本数据占用区块链系统的大部分存储空间,除在区块同步、查询交易所在块高和区块原始数据的情况下使用,核心业务几乎不使用账本数据,属于“冷数据”;状态数据存储的是区块链系统当前的世界状态,是区块链的核心数据,属于“热数据”。
节点数据清理规则
数据备份完成后,可对账本数据和binlog日志数据进行删除以减小节点占用空间。在正常运行的区块链系统中,推荐的数据清理方法是:
- 停止节点
- 清除数据
- 启动节点
在操作数据清理时,由于停止节点,所有通过该节点发送的交易都不会发送成功。若节点不能停止,那么数据清理有如下规则:
- 未被数据仓库下载的binlog日志不能清除
- 对于清理的binlog日志应该使用打包转移的方式而不是直接删除
- 对于节点下的账本数据,可以随时清理
冷数据查询原理
在查询前,判断表类型为账本表或状态表。 若为状态表则直接调用数据库驱动,从底层数据库查询相关数据并返回。若为账本表则优先通过amdb-proxy代理查询数据仓库中的账本数据,若未配置数据仓库/amdb代理,则会转向查询本地账本数据库,若查询失败,节点会停止运行。数据仓库组件在v1.2.1版本后集成了amdb-proxy代理功能,提供冷数据查询。
节点在查询账本数据即冷数据时,通过链上信使协议(amop)向连接节点并且监听同一Topic的SDK发送查询信息,数据仓库在接收信息后,将信息解析成sql语句查询sys_block_2_nonces_或者sys_hash_2_block_中数据响应给节点。如 :
节点发送信息:
(blockHash=0, num=0, table=sys_hash_2_block, key=c33a5ba7eb0b385d1e076da32e9c5926c140b20920ac7cc2288d310f1dea3f77, condition=[[hash, 0, c33a5ba7eb0b385d1e076da32e9c5926c140b20920ac7cc2288d310f1dea3f77]])
数据仓库解析后sql语句:
select * from _sys_hash_2_block_
where 1=1 and hash
= 'e20fc6c40d5f2c01436ef0917f4bb129fb98b728ffc8722dd9c2229c04bbb3d6'
节点发送信息:
(blockHash=0, num=1, table=sys_block_2_nonces, key=1, condition=[[number, 0, 1]])
数据仓库解析后sql语句:
select * from _sys_block_2_nonces_
where 1=1 and number
= '1'
Data-Stash组装sql查询语句:
select * from ${table} where 1=1 ${query_condition}
其中${table} 对应 节点发送查询条件信息中的table,query_condition 是由节点发送查询条件信息中的condition构建成,condition中的第一个元素,表示查询表数据的某个字段进行条件查询,第二个元素表示条件运算符 0 表示 = 、1 表示 != 、2表示 >、3表示 >=、4表示 <、5 表示 <=,第三个元素表示查询条件值
操作流程
- 清理节点数据
- 清理账户数据
- binlog日志清理
注:
- 除非重新建了链,否则不要删除 binlog 的本地目录,也不要修改此目录下的 binlog 文件,否则会导致程序运行异常。
- binlog 目录下的 binlog 文件,建议在人工归档备份后再删除,以便于后续的维护和审计等工作。
- 删除 binlog 的工作建议在服务停止的时候执行,以避免影响服务的正常运行。
- 程序在运行失败后会自动退出,运维人员需要详细查看日志报错的原因,并人工介入。
- 冷数据查询
- 数据仓库配置
在数据仓库配置文件applicaiton.properties中配置 节点连接和amop监听topic:
###数据裁剪查询相关配置
data.query.enable=true #是否开启查询
data.query.certPath=./config #连接节点证书ca.crt sdk.crt sdk.key存放位置
data.query.groupId=1 #群组
data.query.nodeStr=127.0.0.1:20200 #连接节点ip:端口
data.query.topic=DB #与节点通过amop通信topic 默认是DB
- 启动数据仓库
在数据仓库目录下执行 bash start.sh - 清除节点数据(见上面视频)
- 通过前置服务查询区块信息
注:
- 删除节点冷数据后,必须先启动数据仓库,再启动节点,这样节点才能正常启动。
- 如果数据仓库在冷数据查询过程中,突然挂掉,节点没有查询到数据将重试接近60次来获取区块数据,如果还是没有获取导数据,节点将停止运行