網站存儲的平滑遷移方案
背景?
網(wang)站(zhan)的圖片資源訪(fang)問速度慢?網(wang)站(zhan)存(cun)(cun)儲(chu)服(fu)務(wu)需(xu)要擴容(rong)?網(wang)站(zhan)的后端(duan)存(cun)(cun)儲(chu)運維成(cheng)本(ben)(ben)高?網(wang)站(zhan)數據丟失?是時候把網(wang)站(zhan)的存(cun)(cun)儲(chu)遷移(yi)到(dao)云(yun)上了(le)! 本(ben)(ben)文提供了(le)一套最(zui)靠譜的網(wang)站(zhan)存(cun)(cun)儲(chu)上云(yun)方案,你可以(yi)不費吹灰(hui)之力、不停一秒服(fu)務(wu)地將(jiang)網(wang)站(zhan)的后端(duan)存(cun)(cun)儲(chu)平滑遷移(yi)到(dao)對象存(cun)(cun)儲(chu)之上,進而(er)享受諸如彈性(xing)擴容(rong)、CDN加速、富(fu)媒體處(chu)理(li)、防盜鏈等一系列優質(zhi)服(fu)務(wu)。 現在就遷移(yi)吧!
概念介紹?
為(wei)了(le)理解如何實現平滑(hua)遷移(yi),首先需要學(xue)習幾(ji)個基本概(gai)念(nian):
- 對象存儲—— 提供高可用、高可靠、高可擴展的對象存儲服務。你可以將任何非結構化數據,如圖片、文檔、音視頻等存儲到屬于你創建的桶中
- 鏡像存儲 —— 網站平滑遷移的基礎。將COS的一個桶的鏡像存儲源站設置為你的后端存儲服務器后,當用戶訪問該桶的數據時,如果數據不存在,都將去鏡像存儲源站(即你的后端存儲服務器)上抓取內容并返回用戶,同時存儲到COS的桶中。下一次再訪問到該對象時,將不再需要去源站抓取,這樣即實現了網站數據的平滑遷移。
- 域名綁定 —— 將一個特定的域名和對象存儲的一個桶進行關聯,通過將特定域名CNAME到COS的特定桶的域名,可以實現當訪問該特定域名時,等價于訪問COS的一個桶
這幾個基(ji)本概念可能一時不好理解(jie),不過接下來在我們介紹(shao)網站存儲遷移的過程中,會再(zai)進(jin)一步(bu)說(shuo)明(ming)這些概念。
遷移步驟?
遷移背景?
一個簡化的網(wang)站架構如(ru)下(xia)圖所示(shi):
說明:
- 一個網站內部依賴包括存儲服務器,其他服務器(如邏輯處理服務、數據庫服務等)。在圖1所示場景下,我們只討論圖片服務器(image servers)的平滑遷移方案;
- 假設由于存儲容量、訪問速度、運維成本等的考慮,網站管理員想要將圖片服務遷移到第三方云存儲服務上,期望可以帶來更高的可靠性、更好的擴展性和更快的訪問速度;
- 因此,一個基本的遷移方法是,將網站的數據遷移到第三方云存儲服務,并將網站的讀寫操作也切到新的存儲服務上,如圖2所示:
然而這樣簡(jian)單的遷移方法存在(zai)問題:
- 當讀寫操作從mysite后端的存儲服務器(源站:image servers)遷移到第三方云存儲服務器(新站:cloud storage service)時,為了保證服務的可用性,至少需要保證所有的數據都已經從源站遷移到了新站,而對于一個持續寫入的系統來說,這點是很難做到的,即在讀寫操作切到新存儲的瞬間(可能持續幾十秒到幾分鐘),需要暫停源站的寫服務并等待所有數據遷移完成,這對網站的可用性會帶來一定的影響;
- 讀寫遷移到新存儲的操作不容易回滾,如果發現問題再回滾,新站和源站可能都存在用戶已經寫入的數據,這種一致性問題并不容易解決;
- 如果網站的圖片文件的鏈接對用戶暴露,例如,用戶的手機客戶端需要訪問image.mysite.com/image1.jpg這張圖片,則即使完成了數據遷移,同樣的URL也無法訪問到對應的圖片;
- 需要網站維護人員實現數據遷移工具,而對于數據不斷更新與變化的場景,這種遷移工具并不容易實現;
- ……
為了解決以上(shang)種(zhong)種(zhong)問(wen)題(ti)對象存(cun)儲(chu)(chu)推(tui)出了鏡像存(cun)儲(chu)(chu)與域名綁定功能,可以實(shi)現網站靜(jing)態數(shu)據平滑(hua)遷移到(dao)COS中
開始使用對象存儲?
進行數據(ju)遷移的第一步,即(ji)申請(qing)使用對(dui)象(xiang)存(cun)儲(chu)系統:
- 注冊并登錄
- 在“對象存儲”服務創建Bucket
概念說明
- 對象(Object)—— 對象是存儲在COS中的基本數據單位,用戶的每個文件都是一個Object,單塊上傳接口每個文件最大500M。大于500M的文件使用大對象分塊上傳接口,最多可達10000個分塊。Object包含Key、Data和MetaData。其中,Key是Object的名稱,在桶內唯一標識一個對象;Data是Object的數據;MetaData是對該Object的描述信息。
- 桶(Bucket)—— 桶是對象的容器,桶名全局唯一,通過桶名和對象名可以唯一定位到具體資源。COS允許每個用戶最多創建10個桶,而桶里面的對象個數無限制。
設置鏡像存儲?
舉例,假設用戶創建了名為(wei)bucket1的(de)桶(tong)(tong),在Bucket管(guan)理的(de)桶(tong)(tong)設置頁面,可以(yi)設置桶(tong)(tong)的(de)鏡像回源(yuan)地址為(wei)image.mysite.com,則此(ci)時的(de)系統狀(zhuang)態如(ru)下圖所示:
注意:此時(shi)mysite的(de)讀(du)寫(xie)操(cao)作并(bing)沒(mei)有(you)遷移到(dao)COS上,因此對(dui)于mysite來說,到(dao)目前為(wei)止(zhi)的(de)所有(you)操(cao)作對(dui)其(qi)服務沒(mei)有(you)任何(he)影響。
在完成桶的鏡像存儲源站設置后:
- 若用戶訪問image.mysite.com/image1,則直接去源站圖片服務器讀取數據
- 若用戶訪問bucket1.cos-cn-guangzhou.cn-henji.com/image1,則請求發送到COS對應的桶中。此時COS的邏輯是:
- 檢查COS的桶中是否有image1的對象
- 若對象存在,則直接返回給用戶,否則繼續執行
- 根據桶bucket1源站配置,去其對應的源站image.mysite.com/image1讀取數據并返回給用戶,同時將該對象異步遷移到COS對應的桶中(這樣用戶下次再訪問到該數據時,即不需要去源站抓取)
因(yin)此對于用(yong)戶來說,image.mysite.com/image1 和(he) bucket1.cos-cn-guangzhou.cn-henji.com/image1 這兩個URL是等價的,可以訪問到一樣的數據。這既是鏡(jing)像存(cun)儲的概(gai)念。
然而(er)現在還有一(yi)個(ge)問(wen)題并(bing)沒(mei)有解決,即用(yong)戶期(qi)望的(de)(de)最終結果通常是,可以直接通過(guo)訪問(wen)image.mysite.com/image1這個(ge)域名,將(jiang)請求直接發送給COS對應的(de)(de)桶,并(bing)實(shi)(shi)現數據的(de)(de)平滑遷移(yi)。為(wei)了實(shi)(shi)現這種用(yong)戶完全無感知(zhi)的(de)(de)遷移(yi)方案(an),需要依賴COS的(de)(de)域名綁定功能。
設置域名綁定?
在Bucket管(guan)理的桶設(she)置(zhi)頁(ye)面(mian),設(she)置(zhi)桶的域名綁定為 。
注意:如(ru)果你有設(she)置域(yu)名綁(bang)定的需(xu)求(qiu),則必須為(wei)存儲(chu)源(yuan)站再(zai)申(shen)請一個遷移域(yu)名(如(ru)圖5中的image2.mysite.com),并設(she)置桶的鏡像回(hui)源(yuan)地(di)址為(wei)遷移域(yu)名(如(ru)圖5中Bucket1的回(hui)源(yuan)地(di)址設(she)置為(wei)image2.mysite.com)
在完(wan)成桶的域名綁定(ding)設(she)置后:
- 對于COS來說,當看到Host: 的請求后,會默認把它定向到bucket1.cos-cn-guangzhou.cn-henji.com;
- 若在客戶端配置Host文件,即設置 直接訪問到COS的前端服務器(114.67.58.99),即可馬上驗證域名綁定的效果。此時若用戶訪問 ,請求將直接發送到COS前端,并根據域名綁定的映射規則,定向到bucket1.cos-cn-guangzhou.cn-henji.com進行處理;再根據鏡像回源的設置,在桶中對象不存在時進行對象的遷移。
到(dao)此刻為止,整個系(xi)統(tong)的(de)設置對源(yuan)站(zhan)依然沒有任何影響,而(er)如果要(yao)驗證整個遷移系(xi)統(tong)的(de)有效(xiao)性,只需要(yao)簡單(dan)的(de)設置Host文件(jian)即可。
CNAME?
在完成了遷移(yi)邏輯的驗(yan)證后,管理員只需要像域名管理服務器(qi)中添加新的CNAME記錄,例如: CNAME image.mysite.com bucket1.cos-cn-guangzhou.cn-henji.com
這樣,等域名全網生效后,所有的(de)用(yong)戶再(zai)訪問image.mysite.com時,請(qing)求(qiu)會直(zhi)接發送到(dao)bucket1.cos-cn-guangzhou.cn-henji.com,并(bing)按照對應(ying)的(de)邏輯遷移數據。
其他說明?
1. 什么時候可以將寫操作遷移到COS??
只要(yao)完成了域名(ming)(ming)綁定的CNAME過程并在(zai)域名(ming)(ming)全網(wang)生效后,即可將寫操作遷移到COS上,這個過程也不會對用戶產(chan)生任何影響。
2. 什么時候可以下線源站存儲服務器??
由于鏡像遷(qian)(qian)移是被動遷(qian)(qian)移,即當用戶訪問時才做(zuo)遷(qian)(qian)移,為了保證(zheng)所(suo)有數據均可以訪問,需要對源站數據做(zuo)一次主動的完整遷(qian)(qian)移之后才能下線(xian)源站存儲(chu)服務器,不(bu)(bu)過(guo)該(gai)過(guo)程(cheng)也(ye)不(bu)(bu)會對用戶的訪問產生影響。