總有人說阿里雲主機帶寬小,那只是因為你還停留在單機架構上。
阿里的架構設計,雲主機主要用來跑程序的,附件的存儲和訪問主要靠OSS。
有人又會說了,OSS按存儲費+流量雙重計費傷不起,只是你不知道OSS有免費額度,另外可以通過CDN來大幅節約流量,甚至可以反代回雲主機實現內網免流量。長遠來講能節省一大筆費用。
“無圖無真相,有視頻更好”。一般來說,網絡用戶都喜歡圖片和視頻,而不喜歡讀干巴巴的文字。這看似單純的意願,卻讓網站的開發者和維護人員叫苦不 迭——圖片、視頻等內容占用了一個網站的很多存儲、帶寬資源。是時候把圖片、視頻遷移到雲存儲,來釋放被壓得喘不過氣的服務器和帶寬了!
下面以一個網站的圖片存儲為例,來逐步了解如何使用開放存儲服務(Open Storage Service,簡稱OSS)。
開放存儲服務
要使用OSS,需要先在http://oss.aliyun.com網站上注冊,注冊成功后,即可在網站上的OSS管理中心創建bucket,上傳、下載自己的object。
bucket是用戶數據的命名空間,例如圖片可以放到一個bucket中,視頻放到另外一個bucket中。一個bucket存儲的總數據量和文件 個數都是無限制的。存儲在bucket中的每個文件,稱之為object。存儲在object中的數據可以是任意內容,OSS不會去處理object中的 數據。
對於每個bucket,OSS容許設置三種訪問權限,即私有讀寫(private)、公開讀私有寫(public-read)、公開讀寫 (public-read-write)。對於私有讀寫和私有寫的權限,OSS使用API密鑰對(AccessID/AccessKey)來保證你的數據 只能被你自己安全訪問,所以千萬不要向任何人泄露你的安全加密對。API密鑰對可以從OSS的管理中心獲取到,如圖1所示。
如圖1所示
初階:使用命令行工具
對於開發人員來說,使用命令行工具可以更容易地操作OSS。命令行工具隨Python SDK包一起發布,從開放存儲主頁http://oss.aliyun.com可以下載到。
安裝好Python SDK包后(安裝指南參考主頁的SDK使用向導),首先用osscmd來配置你的安全加密對(以下以Linux環境為例,Windows用戶需要用python path_to_osscmd來指定osscmd的路徑):
$ osscmd config –id=AccessID –key=AccessKey
配置完即可開始創建一個bucket,使用命令行工具鍵入如下命令創建一個叫做myimage的bucket,創建完調用osscmd的ls命令來列出已經有的bucket:
$ osscmd createbucket myimage
$ osscmd ls
由於bucket名字是全局唯一的,因此你創建的bucket可能和已存在的bucket沖突。建議使用公司的網址作為前綴來創建bucket,如 com-abc-img。默認情況下,osscmd創建的bucket權限是private。對於Web圖片訪問,可以設置bucket的權限為 public-read以將存儲在OSS中的圖片直接嵌入網頁。可以使用osscmd的setacl命令來設置bucket權限為public- read:
$ osscmd setacl myimage –acl=public-read
接下來,上傳一個圖片到myimage中。為了使瀏覽器正確解析圖片,設置它的類型為圖片(image/jpg):
$ osscmd put –content-type=image/jpg /path/to/top.jpg oss://myimage/
這樣就成功地將圖片文件top.jpg存入到了myimage中。這個文件的URL地址是http://storage.aliyun.com /myimage/top.jpg。對這個URL:域名地址是OSS的服務地址htpp://storage.aliyun.com,myimage是 bucket的名字,接下來就是剛剛上傳的圖片名。可以將這個URL直接嵌入到HTML頁面中的img元素中:
<img src=”http://storage.aliyun.com/myimage/top.jpg” alt=”top image”>
這里需要提示的是:在使用osscmd的put命令時加入-p參數,在上傳完文件后,會打印出URL。
直接鍵入osscmd,不加參數即可輸出全部支持的命令。
進階:使用SDK通過程序來操作OSS
OSS提供了Python、PHP、Java、C、C#五種語言的SDK包,如果覺得直接調用OSS的REST API麻煩的話,可以使用官方提供的可靠SDK。
我們選擇用時下流行的Python語言來操作OSS。上一節安裝完Python SDK后,我們已經不需要更多的配置了。打開文本編輯器或者vim,你用EMACS?佩服你,是個牛人!
下面代碼的作用是打印出自己的所有bucket列表:
接下來,用SDK向剛剛創建的myimages中寫入網頁的導航圖片nav.jpg。代碼如下:
如果沒有報錯的話,文件已經上傳成功了。可以使用osscmd的ls命令來查看這個文件是否已經存在:
$ osscmd ls oss://myimages/
看到nav.jpg了嗎?還可以用osscmd的meta命令來查看nav.jpg的屬性:
$ osscmd meta oss://myimages/nav.jpg
輸出中的第二列是nav.jpg的etag(即md5值)。回到SDK,接着再用這些代碼繼續傳一些文件,然后用SDK來查看有哪些文件存在。
繼續寫下面的代碼就可以列出myimages中的所有文件:
網站大量的圖片,需要使用文件夾的方式來組織。在OSS里如何建立文件夾呢?非常簡單,只需要在文件名之前加上文件夾名,OSS會自動為你創建出文件夾。使用osscmd來上傳文件到myimages中的2012這個目錄,並且用ls命令列出:
$ osscmd put /path/to/sidebar.jpg oss://myimages/2012/
$ osscmd ls oss://myimages/2012/
而使用SDK的代碼如下:
用代碼列出2012目錄下的文件:
高階:安全簽名的URL和自定義header
對於有些設置為private的bucket,有時需要容許其中的某個文件能夠被公開訪問,但又不希望把bucket的權限設置為public-read而導致其他數據有泄露的危險。對URL進行簽名能夠有效地解決這個問題。使用osscmd對一個文件進行簽名:
$ osscmd signurl oss://myimages/2012/sidebar.jpg –timeout=600
命令最后的timeout參數的含義是生成的鏈接在600秒內有效,超過600秒就不可訪問。使用SDK來生成URL:
對於某些網站,如果要防止盜鏈(或防止搜索引擎爬蟲導致的網站流量飆升),可以使用生成的URL嵌入頁面,生成URL的過程不需要和OSS進行交換。
如果想在讀取文件時,OSS支持返回一些自定義的響應頭(response header),需要在上傳這個文件時就設置好。目前,除了前面介紹的Content-Type以外,OSS還支持設置如下幾種常用的HTTP響應 頭:Expires、Cache-Control、Content-Disposition和Content-Encoding。這些Header的具體 含義,可以參考RFC 2616標准。使用API來設置這些響應頭的方法如下:
經濟、無需運維的雲存儲
以上介紹了OSS的基本功能,與傳統的存儲如NAS等解決方案相比,OSS更經濟,並且為用戶徹底解決了繁雜的系統日常運維、備份等工作。
傳統存儲系統隨着業務規模的增長,必須不斷地預先擴容,同時還要對存儲系統中的數據不斷備份,以面對可能突然發生的硬件故障。而使用OSS,用戶上 傳的數據自動會有多份拷貝冗余,數據安全性達到99.99999999%。OSS在維護用戶數據高可靠性的同時,也保障了服務的高可用性,承諾最低 99.9%的可用性,所有繁雜的存儲備份和硬件故障不再是用戶的問題。
在網絡方面,OSS的網絡響應速度非常具有優勢,保證了全國絕大多數地區的良好訪問體驗。
但當用戶網站的訪問量非常大,需要服務全國各地用戶,特別是部分靜態圖片成為訪問熱點時,使用CDN服務,能夠更快地將數據傳遞到終端用戶,並且網絡流量的開銷也更為經濟。接下來,讓我們了解一下阿里雲CDN的情況。
使用CDN加速內容加載的速度
阿里雲CDN服務是一個遍布全國的分布式緩存系統,能夠將網站文件(如圖片或JavaScript代碼文件)緩存到全國多個城市機房中的服務器上,當一個用戶訪問你的網站時,會就近到靠近TA的城市的服務器上獲取數據,這樣最終用戶訪問你的服務速度會非常快。
阿里雲CDN服務在全國部署超過100個節點,能提供給用戶優良的網絡加速效果。當網站業務突然爆發增長時,無需手忙腳亂地擴容網絡帶寬,使用 CDN服務即可輕松應對。和OSS服務一樣,使用CDN,需要先在aliyun.com網站上開通CDN服務。開通后,需要在網站上的管理中心創建你的 distribution(即分發頻道),每個distribution由兩個必須的部分組成:distribution ID和源站地址。
舉例來說,需要對剛剛存儲在OSS中的myimages這個bucket中的數據進行加速,那么源站地址即為 http://storage.aliyun.com,CDN服務會自動為用戶創建一個distribution ID,服務創建完成后,即可使用http://distributionID.aliyuncdn.com/myimages /someimage.jpg來訪問原來存儲在myimage這個bucket中的someimage.jpg文件。如果不想使用阿里雲CDN生成的域 名,那么可以將自己網站的二級域名,如cdn.abc.com,加入一個CNAME記錄到distributionID.aliyuncdn.com。
創建distribution需要在阿里雲網站的CDN管理頁面操作。而當 distribution創建好之后,即可使用SDK來對distribution進行操作,代碼非常類似OSS的使用方法,接下來的代碼列出了用戶的 distribution列表,並且將其中一個ID為myID的distribution中的一張圖片從CDN緩存中刪除。
由此可見,使用阿里雲OSS和CDN,可以簡單、經濟地解決服務的存儲和網絡問題,畢竟,大多數網站或應用的存儲和網絡帶寬多半是被圖片或視頻消耗掉的。
從整個業界來看,最近這樣的面向個人用戶的雲存儲如國外的DropBox和Box.net非常受歡迎。非常期待大家能在阿里雲服務如OSS平台上開發出這么棒的應用!