Releases: JIeJaitt/goDistributed-Object-storage
v1.2.0
可扩展的分布式系统
分布式系统的好处在于可扩展性,只需要加入新的节点就可以自由扩展集群的性能。
本章主要是实现了分布式,从整体上来看,就是接口服务节点和数据服务节点
- 接口服务结点主要的作用是:转发
PUT
和GET
请求到数据服务节点 - 数据服务节点才是真正处理
PUT
和GET
请求
另外为了验证系统,还加入了locate
接口服务,用来定位对象资源。具体实现如下:
首先接口服务收到"/locate/文件名
"的请求,会通过Locate方法获取数据服务的监听地址,先将文件名通过交换机 dataServers 发送到消息队列,数据节点收到之后(Consume)通过Send方法将自身的监听地址发送给自己的消息队列,然后接口服务通过Consume方法收到这个监听地址。
数据服务节点和接口服务节点主要通过消息队列RabbitMQ
进行通信,具体使用在于
-
object
包:接口服务节点转发对象- 首先是
GET
请求,先通过locate
方法获得对象保存的数据节点位置(监听地址),然后通过Http.Get(url)
获得响应即对象内容,此时的URL
的服务器是数据服务节点 - 其次是
PUT
请求,先随机选择一个数据服务节点(可以通过遍历哈希表找到随机的一个),然后通过Http.NewRequest("PUT", "URL", reader)
转发该请求,再通过Client.Do(request)
获取响应内容(状态码)
数据服务节点的
object
包和上一章的一样 - 首先是
-
heartbeat
包:数据服务节点每隔五秒发送心跳消息(该节点的监听地址),通过Publish
发送到apiServers
(交换机),交换机绑定(Bind
)一个消息队列,接口服务节点则通过该消息队列接收数据服务节点的心跳消息,并将监听地址保存到哈希表,每10秒清除没有发送心跳消息的数据服务节点(可能出问题了) -
locate
包:接口服务节点通过Publish
将定位消息(对象)发送到dataServers
(交换机),同样绑定一个消息队列,数据服务节点收到定位消息,会在服务器寻找该对象是否存在,发送反馈消息(Send
),存在就会发送该对象保存在哪一个数据节点(监听地址)。
另外是测试的环境
- 通过在一台虚拟机绑定多个
IP
地址实现多个节点。 - 安装
RabbitMQ-server
,创建两个交换机
v1.0.0
单机版的对象存储系统以及简单的 REST 风格接口
实现了单机分布式存储系统简单的 REST 风格接口基本实现,并且在一定程度上完善了项目文档,方便展望整体的分布式云存储项目框架的具体实现目标
对象存储是以对象的方式来管理数据的(对象数据+元数据+ID),通过REST网络服务来访问对象。提升了储存系统的扩展性
首先是处理路由,这一章主要是实现了两个REST网络接口:
- 一个是
PUT
请求,将数据保存到服务器中,通过io.Copy()
将想要储存的内容复制到文件即可 - 另一个是
GET
请求用来下载对象。在服务器中寻找对象,同样通过io.Copy()
将服务器该对象的数据写入到HTTP
响应体中