10. 泓(store-huge)

store-huge背景:

  • 随着区块账本中的交易量不断增加,单个文件系统磁盘空间不够需要扩容。

  • store-huge支持配置多个文件系统(磁盘)来保证横向扩展能力。

  • 同时可以将旧区块,以冷热分离的方式,将旧区块移动到低成本的文件系统中。来减少存储成本。

Storage_store_huge.png

10.1. 注意

目前store-huge 还处于alpha版本,可以小范围测试,欢迎大家做测试,并提出宝贵建议。注意在生产环境中要谨慎使用。后续我们会不断改进。

10.2. 存储引擎选择

10.2.1. 配置

在chainmaker.yml中storage作用域下,选择使用 engine_provider: store-huge 存储引擎。如果不配置engine_provider 字段,则默认使用旧存储引擎。

  # engine provider
  engine_provider: store-huge

10.3. 多文件系统使用

10.3.1. 配置

假设规划使用2个文件系统(2个盘)存储热数据 hot1, hot2 使用2个文件系统(2个盘)存储冷数据 cold1, cold2 以chainmaker.yml中storage,配置的多文件系统为例

  # engine provider
  engine_provider: store-huge
  #block file system
  block_file_config:
    online_file_system: "/home/hot1,/home/hot2"
    archive_file_system: "/home/cold1,/home/cold2"
  #store engine version
  storage_config_version:
    major_version: 1
    minor_version: 2

以上,热数据写到 online_file_system 里。如果做冷热分离,冷数据写到 archive_file_system里面。

10.3.2. online_file_system 配置禁忌

####只增原则 online_file_system中配置的文件系统,只能 增加,不能删除。 比如 一个 节点 配置 online_file_system:”/hot1,/hot2” 如果要增加硬盘,比如 增加 “/hot3”,变成 online_file_system:”/hot1,/hot2,/hot3” 是正确的。增加文件系统/硬盘 ,需要重启进程。

不能 把 现有的 /hot2 删除。删除 /hot2 视为 丢弃了 /hot2 及里面的数据。是严重的运维配置事故。

online_file_system: "/hot1,/hot2"  //变成 "/hot1"  不允许

online_file_system中配置的文件系统,只能 增加,不能修改。 把 /hot2 rename 成 /hot4 并把 online_file_system中配置的 /hot2 改成 /hot4。 是不允许的。 ####按照字典序增加 如果要新增 一个文件系统,新增的文件系统的字符串 必须 大于 目前现有的文件系统 比如 现在是

online_file_system:"/hot5"   新增 "/hot2" ,不允许

因为 “/hot2” 比 “/hot5” 小。

10.3.3. 模拟多个文件系统

如果在测试环境中,没有这么多现成的文件系统。可以用losetup来创建几个测试用。(注意这是测试用的)

dd if=/dev/zero of=hot1.img bs=1G count=1
mkfs.ext4 hot1.img
根据提示输入y
mkdir /hot1
mount -o loop hot1.img /hot1
df -h
/dev/loop0      976M  103M  807M  12% /hot1

测试完,可以 umount /hot1 ,如果不需要 hot1.img ,可以直接删了

10.3.4. 增加文件系统

假设当前online_file_system配置了两个文件系统。/home/hot1,/home/hot2

online_file_system: "/home/hot1,/home/hot2"

如果要增加一个文件系统。那么新增的文件系统的名字,必须按照字典序的排序大小,大于已有的文件系统。 举例,如果新增文件系统 是 /home/a1 则,新增的文件系统不能被使用到。因为字符串 “/home/a1” 要小于 “/home/hot1”、”/home/hot2”

online_file_system: "/home/hot1,/home/hot2,/home/a1" 这样新增的/home/a1 无法被使用

可以新增文件系统,为”/home/hot3”

online_file_system: "/home/hot1,/home/hot2,/home/hot3" 

这样,存储会依次使用,在第一个文件系统(”/home/hot1”)磁盘快写满时,写第二个,依次类推。

10.3.5. online_file_system 文件系统切换原则

online_file_system会按照字典序从小到大的顺序,按照顺序使用。第一个写满写第二个。依此类推。已写完的文件系统,即使数据清空,也不会再被使用。 比如online_file_system:”/hot3,/hot1,/hot2” 按照字典序,排序,变为 online_file_system:”/hot1,/hot2,/hot3” 那么写入顺序是 先写 /hot1, 写满后 写 /hot2 ,再写满后,写 /hot3。 如果当前写入的是/hot3,然后把/hot1清空,再/hot3写满后,也不会再写/hot1。 生产环境 切忌删除数据,切忌更改文件夹名字。

10.4. 冷热分离

10.4.1. 使用 cmc 冷热分离 相关功能 权限要求

必须用admin权限,在 sdk_config.yml 配置,参考以下内容,必须是 admin 。

  客户端用户私钥路径
  user_key_file_path: "../config/wx-org1.chainmaker.org/certs/user/admin1/admin1.tls.key"
  客户端用户证书路径
  user_crt_file_path: "../config/wx-org1.chainmaker.org/certs/user/admin1/admin1.tls.crt"
  客户端用户交易签名私钥路径(若未设置,将使用user_key_file_path)
  user_sign_key_file_path: "../config/wx-org1.chainmaker.org/certs/user/admin1/admin1.sign.key"
  客户端用户交易签名证书路径(若未设置,将使用user_crt_file_path)
  user_sign_crt_file_path: "../config/wx-org1.chainmaker.org/certs/user/admin1/admin1.sign.crt"

10.4.2. 使用 cmc 查询可以冷热分离的最大块高

./cmc  get_hot_cold_separate_max_height  --chain-id=chain1 --secret-key=mysecret --sdk-conf-path=./testdata/sdk_config.yml

返回最大可冷热分离的块高

get getHotColdSeparateMaxHeight:[{"max_height":386}] 

10.4.3. 使用 cmc 对指定区间的区块(0-99高度的区块),做冷热分离

./cmc hot_cold_separate --chain-id=chain1  
--secret-key=mysecret 
--sdk-conf-path=../config/sdk_config.yml  
--start-height=0 
--end-height=99

会返回一个 冷热分离的任务id

b47c36d3-72c9-4865-9ccb-25b3d0a2a76c2022-12-07 17:58:31.867332472 +0800 CST m=+4733.069198339

10.4.4. 使用 cmc 查询做冷热分离的任务状态

./cmc get_hot_cold_separate_jobInfo 
--chain-id=chain1 
--secret-key=mysecret 
--sdk-conf-path=../config/sdk_config.yml 
--job-id='b47c36d3-72c9-4865-9ccb-25b3d0a2a76c2022-12-07 17:58:31.867332472 +0800 CST m=+4733.069198339'

返回任务信息(注意冷热分离是异步的,所以返回的任务状态信息也是变化的,包括 status, affect_files 字段)

get jobInfo:[{"start_time":1678083481,"end_time":1678083651,"status":4,"start_height":0,"end_height":99,
"scan_files":["00000000000000000001","00000000000000000026","00000000000000000065"],
"affect_files":["00000000000000000001","00000000000000000026","00000000000000000065"]}]

其中 scan_files :表示 startHeight,endHeight 区间包含的文件。 affect_files :表示 实际要移动的文件。(有的文件已经被冷热分离移动过,所以不需要再移动) status :表示任务状态,为 4 表示成功。

10.4.5. 验证 0-99号区块,对应的bf文件,是否发生移动

实际使用场景不需要验证。这里是为了 测试时,演示的需要。如果看到区块文件已移动,说明正常

cd /home/hot1
tree
cd /home/hot2
tree
cd /home/cold1
tree
cd /home/cold2
tree

如果对应的bf 文件,已经从 热盘 移动到了 冷盘,说明 冷热分离是成功的。