基本概念算法
主流存储类型分为三种:块存储、文件存储以及对象存储数据库
对象存储系统(Object-Based Storage System)是综合了NAS和SAN的优势,同时具备SAN的高速直接访问和NAS的数据共享等优点,提供了高可靠性、跨平台性以及安全的数据共享的存储体系结构。数组
为了更好的说明三者的差别,我打个比方,假设有三我的想从A地到B地,如今有三种交通方式。甲选择轿车、乙选择公共汽车、丙选择地铁。块存储相似于轿车,速度快,可是容量小(轿车只能乘坐几我的);文件存储相似于公共汽车,速度慢(公共汽车有站点和红绿灯须要考虑),可是容量较大(能多坐很多人);对象存储相似于地铁,速度快,容量大。安全
不一样的数据管理方式服务器
对象的数据一般是无结构的数据,好比:图片、视频或文档等;对象的元数据则指的是对象的相关描述,好比:图片的大小、文档的拥有者等;对象id则是一个全局的惟一标识符,用来区分对象的。
不一样的访问数据方式网络
对象存储,访问对象的方式很方便,是经过REST接口对对象进行操做,用HTTP动词(GET、POST、PUT、DELETE等)描述操做。除此以外,还有一种访问方式,就是使用各大云商提供的客户端去操做对象。
好比:Amazon的s3cmd、阿里云的osscmd/ossutil、腾讯云的coscmd等。
对象存储优缺点架构
先说优势,以前大概也提了下:分布式
再提缺点:函数
单体对象存储架构性能
go语言实现
package main import ( "io" "net/http" "os" "log" "strings" ) func main() { http.HandleFunc("/objects/",Handler) println("server...") log.Fatal(http.ListenAndServe("127.0.0.1:8006", nil)) } func Handler(w http.ResponseWriter, r *http.Request){ println(r) 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){ //C:\Users\Administrator\go\src\awesomeProject\test_file f,e := os.Create(("C:/Users/Administrator/go/src/awesomeProject/test_file"+"/objects/"+strings.Split(r.URL.EscapedPath(),"/")[2])) if e != nil { log.Println(e) w.WriteHeader(http.StatusInternalServerError) return } defer f.Close() io.Copy(f,r.Body) } func Get(w http.ResponseWriter,r *http.Request){ f,e := os.Open(("C:/Users/Administrator/go/src/awesomeProject/test_file"+"/objects/"+strings.Split(r.URL.EscapedPath(),"/")[2])) if e != nil { log.Println(e) w.WriteHeader(http.StatusNotFound) return } defer f.Close() io.Copy(w,f) }
详解
main函数,注册一个HTTP处理函数并开始监听端口。
http.HandleFunc的做用是注册HTTP处理函数Handler,若是由客户端访问本机的HTTP服务且以“/objects/”开头,那么请求将由Handler负责处理。
http.ListenAndServer正式监听端口,正常状况下会一直监听,非正常状况下,log.Fatal会对于错误并退出程序。
http.HandleFunc("/objects/",Handler) println("server...") log.Fatal(http.ListenAndServe("127.0.0.1:8006", nil))
Handler函数,HTTP中最重要的请求和响应Response,Request为参数,根据客户端不一样的请求方式,执行不一样的处理函数:Put函数与Get函数。
func Handler(w http.ResponseWriter, r *http.Request){ println(r) m := r.Method if m == http.MethodPut{ Put(w,r) return } if m == http.MethodGet{ Get(w,r) return } w.WriteHeader(http.StatusMethodNotAllowed) }
Put函数,r.URL变量记录HTTP请求的URL,EscapedPath方法用于获取结果转义之后的路径部分,该路径形式是:/objects/<object_name>,而后strings.Split函数功能是分割/objects/<object_name>,分割为"“、”objects"、<object_name>,去数组的第三个元素就是<object_name>,os.Create在本地文件系统的根存储目录建立同名文件f,建立成功将r.Body用io.Copy写入文件f。
func Put(w http.ResponseWriter,r *http.Request){ //C:\Users\Administrator\go\src\awesomeProject\test_file f,e := os.Create(("C:/Users/Administrator/go/src/awesomeProject/test_file"+"/objects/"+strings.Split(r.URL.EscapedPath(),"/")[2])) if e != nil { log.Println(e) w.WriteHeader(http.StatusInternalServerError) return } defer f.Close() io.Copy(f,r.Body) }
Get函数同Put函数相似。此文为分布式对象存储-原理、架构及Go语言实现第一章总结