参考书籍:《分布式对象存储原理架构及Go语言实现》
书籍包括以下内容: 对象存储简介;数据冗余和即时修复;分布式系统原理;断点续传;元数据以及元数据服务;数据压缩;数据校验和去重;数据维护。
中间件:rabbitMQ(集群心跳)和ElasticSearch(全文索引)
- 文件上传
- 文件下载
- 文件删除
- 减少数据冗余
- 即时修复
- 元数据服务(对象的名字、版本、大小和散列值)
- 数据校验和去重
- 集群心跳
- 全文索引
- 分布式实现
- 多级文件夹增删改
- 断点续传
- 数据压缩
- 数据维护
- 大小文件上传
. ├── conf │ ├── conf.json │ └── config.go ├── es elasticsearch GetMetadata和PuttMetadata http接口封装 │ └── es.go ├── heartbeat │ └── heartbeat.go 数据集群服务心跳,5s监测一次 ├── locate 用于实际定位文件对象 │ └── locate.go ├── main.go ├── objects 增查删对象路由处理 │ └── objects.go ├── objectstream 临时对象流和对象流http接口封装,调用dataServer的实现 │ ├── objectstream.go │ └── tempstream.go ├── rabbitmq 数据集群服务调用 │ └── rabbitmq.go ├── rs Reed Solomon算法编码解码封装 │ ├── common.go │ ├── decoder.go │ ├── decoder_test.go │ ├── encoder.go │ ├── get.go │ ├── put.go │ ├── resumable_get.go │ └── resumable_put.go ├── start.sh 启动脚本 ├── types │ └── types.go ├── utils │ └── utils.go └── versions 文件版本 └── version.go
. ├── common.sh ├── conf │ ├── 1.json │ ├── 2.json │ ├── 3.json │ ├── 4.json │ ├── 5.json │ ├── 6.json │ ├── conf.json │ └── config.go ├── delObjects.sh ├── heartbeat 当前数据服务节点注册到数据服务集群 │ └── heartbeat.go ├── kill.sh ├── locate 先扫描一下当前数据服务器所有对象objects存到内存中 │ └── locate.go ├── logs │ ├── 1.log │ ├── 2.log │ ├── 3.log │ ├── 4.log │ ├── 5.log │ ├── 6.log │ └── conf.log ├── main.go ├── objects 对象获取路由和具体实现 │ └── objects.go ├── rabbitmq │ └── rabbitmq.go ├── start.sh ├── temp 对象上传路由和具体实现 │ └── temp.go ├── types │ └── types.go └── utils └── utils.go
. ├── 1 │ ├── objects │ └── temp ├── 2 │ ├── objects │ └── temp ├── 3 │ ├── objects │ └── temp ├── 4 │ ├── objects │ └── temp ├── 5 │ ├── objects │ └── temp └── 6 ├── objects └── temp
1.对象上传 从http Header获取的hash值与对象流hash值作对比(hash值先sha256后bash64) 对象分片,先调用dataServer http post路由再调用patch和put路由 post路由:数据服务节点创建临时对象,写入tempInfo信息 patch路由:访问数据服务节点上的临时数据,http请求的正文会被写入该临时对象 put路由:接口服务数据校验一致,将该临时对象转正 2.对象获取 从es中获取对象元数据信息,根据元数据信息请求dataServer http get路由获取文件流返回 3.对象删除 获取对象最新版本的元数据信息,在es中创建一条新的元数据信息记录(name不变,version+1,size=0,uuid="")
1.文件上传先调用http的post patch del路由,调用put路由 接口服务数据校验一致,将该临时对象转正 临时对象temp文件夹存储 uuid和uuid.data两个文件文件, uuid存储结构体信息 type tempInfo struct { Uuid string Name string Size int64 } uuid.data存储对象分片数据 put路由 接口服务数据校验一致,将该临时对象转正 读取uuid文件结构体信息校验一致,uuid.data移动到objects文件夹, 文件重命名uuid.1.uuid D4lNxkL5lsqhLH+llEIrzRN%2Ft5qBjXeUHP1TSf%2FDbeY=.0.a%2FQAT3VLYdnPZLTxYXClze%2Fx6Vuk0hhR6pK78dlV4Xg= 删除temp文件夹里的uuid和uuid.data两个文件 2.对象下载 根据文件名在对象存储节点查找,查找到通过http响应