I/O指令
I/O指令
入口逻辑卷
入口逻辑卷
入口卷guid
入口卷guid
SimpleVolume
SimpleVolume
LogicVolume
LogicVolume
LogicVolume
LogicVolume
卷分配表获取guid
卷分配表获取guid
文件
文件
LogicVolume
LogicVolume
卷关系树(主数据库表)
卷关系树(主数据库表)
target_guid
target_guid
parent_guid
parent_guid
other infos
other infos
LogicVolume
LogicVolume
卷文件分配表
(SQLite表)
卷文件分配表 (SQLite表)
target_guid
target_guid
file_guid
file_guid
file_storage_source_path
file_storage_source_path
物理卷
物理卷
卷分配表
(元数据)
卷分配表 (元数据)
条带块或文件块
条带块或文件块
文件
文件
物理卷
物理卷
卷分配表
(元数据)
卷分配表 (元数据)
条带块或文件块
条带块或文件块
Text is not SVG - cannot display
物理卷
物理卷
卷分配表
(元数据)
卷分配表 (元数据)
条带块或文件块
条带块或文件块
元数据容积规划
元数据容积规划
5 MB
5 MB
5 MB
5 MB
10 MB
10 MB
物理卷
物理卷
卷分配表
(元数据)
卷分配表 (元数据)
条带块或文件块
条带块或文件块
5 MB
5 MB
元数据容积规划
元数据容积规划
5 MB
5 MB
5 MB
5 MB
10 MB
10 MB
下一个状态
下一个状态
15 MB
15 MB
Text is not SVG - cannot display
dp_min[i] = min( dp_min[ i - 1 ] + new,  dp_min[ i - 1 ] )
dp_reserve[i] = max( dp_reserve[ i - 1 ], dp_min[ i - 1 ] + new )

方案1 线段树法(考古)

RAID卷 FAT
RAID卷 FAT
id_min,id_max,volume_guid
id_min,id_max,volume_guid
0-100
0-100
150-200
150-200
300-400
300-400
450-500
450-500
线段树(表法)
线段树(表法)
底层卷 FAT
底层卷 FAT
1,file_name
1,file_name
2,file_name_2
2,file_name_2
3,file_name_3
3,file_name_3
72,file_name_4
72,file_name_4
底层卷 FAT
底层卷 FAT
151,file_name
151,file_name
152,file_name_2
152,file_name_2
153,file_name_3
153,file_name_3
172,file_name_4
172,file_name_4
底层卷文件索引
(分治策略)
[多个SQLite 文件]
底层卷文件索引(分治策略)[多个SQLite 文件]...
guid => 404
file_name
guid => 404...
下一个动作:
欲插入404文件
下一个动作: 欲插入404文件
插入新节点
插入新节点
RAID卷 FAT
RAID卷 FAT
id_min,id_max,volume_guid
id_min,id_max,volume_guid
0-100
0-100
150-200
150-200
300-400
300-400
404-404
404-404
450-500
450-500
guid => 405
file_name
guid => 405...
合并新节点
合并新节点
RAID卷 FAT
RAID卷 FAT
id_min,id_max,volume_guid
id_min,id_max,volume_guid
0-100
0-100
150-200
150-200
300-400
300-400
404-405
404-405
450-500
450-500
guid => 310
file_name
guid => 310...
删除
删除
删除动作
分裂
删除动作 分裂
RAID卷 FAT
RAID卷 FAT
id_min,id_max,volume_guid
id_min,id_max,volume_guid
0-100
0-100
150-200
150-200
300-309
300-309
311-400
311-400
404-405
404-405
450-500
450-500
guid => 310
file_name
guid => 310...
重新插入
重新插入
RAID卷 FAT
RAID卷 FAT
id_min,id_max,volume_guid
id_min,id_max,volume_guid
0-100
0-100
150-200
150-200
300-400
300-400
404-405
404-405
450-500
450-500
多节点合并
多节点合并
懒汉式设计,节点仅在操作时合并和分裂
查询复杂度:log(n)
合并和分裂确保幂等性
(无后期垃圾回收和碎片整理)
懒汉式设计,节点仅在操作时合并和分裂查询复杂度:log(n)...
算法:
det_hi = 310 + 1 => 311
det_lo = 310 - 1 => 309

命中碎片段,且连续

309,310,311
因此执行区间合并

如果命中多个,执行多个碎片合并
算法:det_hi = 310 + 1 => 311...
Text is not SVG - cannot display

方案2 分布式HASH法

跨区卷
跨区卷
简单卷 V1
简单卷 V1
简单卷索引 S1
简单卷索引 S1
跨区卷索引 SIM1
跨区卷索引 SIM1
简单卷 V2
简单卷 V2
简单卷索引 S2
简单卷索引 S2
SIM 1 HASH冲突表
SIM 1 HASH冲突表
hash_key               key_guid                        target_volume_guid
目标HASH              实际KEY                       真实所在的位置
hash_key               key_guid                        target_...
0                             FEA01                           V2
0                             FEA01...
1                             FCC02                           V1
1                             FCC02...
SIM 1  直接索引表 (类编号表)
SIM 1  直接索引表 (类编号表)
hash_key               target_volume_guid
hash_key               target_volume_g...
0                             V1
0                             V1
1                             V2
1                             V2
由于Hash可能冲突
该表只存实际卷 GUID 冲突的情况。
例如:0原则上应该存 V1,实践中因为
Hash冲突(实际存在V2),因此记录
后面去V2找
由于Hash可能冲突该表只存实际卷 GUID 冲突的情况。...
因为冲突
因为冲突
欲查询的 

FBA01
欲查询的...
H(key) = Hash32( key ) ^ prime % N
H(key) = Hash32( key ) ^ prime % N
Key: FBA01
Hash: 0
RealVol: V1
Key: FBA01...
该表中 `目标卷GUID` 指的是无冲突下对应
Hash值应该存储的卷位置
该表中 `目标卷GUID` 指的是无冲突下对应...
无冲突
无冲突
直接去V1找
直接去V1找
欲查询的 

FCE01
欲查询的...
H(key) = Hash32( key ) ^ prime % N
H(key) = Hash32( key ) ^ prime % N
Key: FCE01
Hash: 0
RealVol: V2
Key: FCE01...
有冲突
有冲突
重定向去V2找
重定向去V2找
Text is not SVG - cannot display
Author:undefined  Create time:2024-10-30 22:25
Last editor:undefined  Update time:2025-01-07 22:14