10. 泓(store-huge)
store-huge背景:
随着区块账本中的交易量不断增加,单个文件系统磁盘空间不够需要扩容。
store-huge支持配置多个文件系统(磁盘)来保证横向扩展能力。
同时可以将旧区块,以冷热分离的方式,将旧区块移动到低成本的文件系统中。来减少存储成本。
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 文件,已经从 热盘 移动到了 冷盘,说明 冷热分离是成功的。