分布式对象存储学习笔记-单机版本

对象存储属于云存储的一部分,它提供云存储后端的存储服务。云存储是建立在对象存储之上的一个整体解决方案,除了后端存储,它还需要对不同OS和平台运行的客户端,身份验证,多元管理和监控管理的支持。

分布式存储的优点:

  • 成本更加低廉
  • 新节点拓展以及坏旧节点更替便利

与传统网络存储的区别

传统的网络存储主要是 NAS和SAN

  • NAS(Network Attached Storage)提供存储功能与文件系统的网络服务器。服务器与客户端之间交互的协议包括 SMB、NFS、AFS等。
  • SAN(Storage Area Network)只提供块存储,文件系统的抽象交由客户端管理。协议包括Fibre Channel、iSCSI、ATA over Ethernet和HyperSCSI

对象存储区别于传统网络存储是对数据的管理方式不同。

  • 网络文件系统:数据以文件的形式来管理
  • 块存储:数据以数据块形式管理,每个数据块有独立的地址,但不存在额外的背景信息
  • 对象存储:以对象的形式管理数据。(对象数据、对象元数据、全局唯一标识)
  • 对象存储数据:该对象中存储的数据本身
  • 对象存储元数据:元数据是对对象的描述信息
  • 对象存储唯一标识:用于引用该对象,并且具有全局唯一性

访问数据的方式, 对象存储通过REST网络服务访问对象。

DEMO:单机版本对象存储架构。

简介:在一台服务器上运行一个HTTP或 HTTPS服务提供的REST接口,该服务通过访问本地磁盘进行对象的存取。

在对象存储中,使用PUT方法将对象上传至服务器,GET方法从服务器上下载一个对象(后端接收到GET请求从磁盘上查找并读取该对象,如果该对象不存在则返回404)我们使用Go进行实现。

主函数代码实现部分:

package main

import (
	"github.com/cyber-prog0x/NLG/distribute-object-storage/objects"
	"log"
	"net/http"
)

func main() {
	http.HandleFunc("/objects/", objects.Handler)
	log.Fatal(http.ListenAndServe(":8080", nil))
}

objects包代码部分:

package objects

import (
	"io"
	"log"
	"net/http"
	"os"
	"strings"
)

func Handler(w http.ResponseWriter, r *http.Request) {
	m := r.Method
	if m == http.MethodPut {
		put(w, r)
		return
	}

	if m == http.MethodGet {
		get(w, r)
		return
	}

	w.WriteHeader(http.StatusMethodNotAllowed)

}

func put(w http.ResponseWriter, r *http.Request) {
	f, err := os.Create(os.Getenv("STORAGE_ROOT") + "/objects/" + strings.Split(r.URL.EscapedPath(), "/")[2])


	if err != nil {
		log.Println(err)
		w.WriteHeader(http.StatusInternalServerError)
		return
	}

	io.Copy(f, r.Body)
	log.Println("Save file %s successfully!", strings.Split(r.URL.EscapedPath(), "/")[2])
	defer f.Close()
}

func get(w http.ResponseWriter, r *http.Request) {
	f, err := os.Open(os.Getenv("STORAGE_ROOT") + "/objects/" + strings.Split(r.URL.EscapedPath(), "/")[2])

	if err != nil {
		log.Println(err)
		w.WriteHeader(http.StatusNotFound)
		return
	}

	io.Copy(w, f)


	defer f.Close()

}

代码测试:

put文件测试
get文件测试

单机版本的对象存储服务存在非常严重的缺陷,无法进行扩展,且系统架构存在接口与数据存储紧耦合,服务器智能访问本地磁盘。当单台服务器无法满足不断增长的HTTP客户端请求数量时,我们无法通过加入一台新的服务器进行扩展集群。所以我们需要将接口与数据存储解耦合,分离成专门的接口服务和数据服务。