参考《分布式对象存储----原理、架构以及Go语言实现》(作者:胡世杰)
对象存储简介
数据的管理方式
以对象的方式管理数据,一个对象包括:对象的数据、对象的元数据、对象的全局唯一标识符
访问数据的方式
可扩展的分布式系统
接口和数据存储分离的架构
-
接口实现对象的存取
-
接口通过 RabbitMQ 消息队列进行通讯
-
向某个 exchange 进行一对多的消息群发
-
apiServices exchange 每一台接口服务节点都会接收到任意一台数据服务节点的心跳
-
dataServices exchange 所有数据服务节点绑定该 exchange 并接收来着接口服务的定位消息,拥有对象的数据服务节点会使用消息单发通知该接口服务节点
当发送一条信息给 dataServices exchange 时,定位成功后,将会创建一个反馈信息的临时队列,临时队列将在一定时间后关闭
-
-
向某个消息队列进行一对一的消息单发
-
REST接口
-
GET 提供一个 locate接口
客户端通过GET方法发送对象定位请求,接口服务节点收到请求后会向数据服务层群发一个定位信息,然后等待反馈。如果存在则返回该数据服务节点的地址
RabbitMQ 消息设计
数据服务心跳信息
接口服务的定位信息及反馈
对象PUT流程
对象GET流程
元数据服务
散列值与散列函数
计算散列值的算法推荐
书上的例子为 SHA-256 更高级别的有SHA-512
加入元数据服务的框架
书中建议是使用ElasticSearch
我们项目选择的是MySQL对元数据进行存储
REST接口
- GET新增一个参数version
表示对象数据的版本默认状态下是最新版本
- PUT需提供一个名为 Digest 的 HTTP 请求头,和一个名为 Content-Length 请求头
- DELETE只需要删除元数据而数据节点继续保存数据,知道所有元数据都被删除
- 查询指定对象的所有版本
ES接口(MySQL)
对象PUT流程
对象GET流程
数据校验与去重
需要数据校验的原因
给数据加入缓存功能
在数据服务层再加入一个缓存服务
数据服务的REST接口
- 以POST方法访问数据服务temp接口在URL中指定数据对象的散列值,并提供一个名为size的HTTP请求头,用于指定对象的大小。这会在数据服务中创建一个临时对象,该接口返回一个随机生成的uuid用于标记临时对象
- 将对象内容发到数据服务temp接口,并写入临时对象
- 根据对比散列值的结果进行操作