企業級靜態數據遷移OSS實戰記錄

1、產品考察

根據上一次存儲塊環境建設的三個月時間後,接到了阿里雲產品線的通知,共享存儲塊開始商業化,以每GB/月的單位計費,價格不菲,但數據昂貴,要趕在商業化以前將數據挪走,咱們想到了阿里雲的成熟產品,OSS對象存儲(ObjectStorge Service)。

使用oss有出色優點讓企業級管理數據獲得了安心。css

可靠性,受限於硬件可靠性,易出問題,一旦出現磁盤壞道,容易出現不可逆轉的數據丟失。 人工數據恢復困難、耗時、耗力。
安全,須要另外購買清洗和黑洞設備,須要單獨實現安全機制。
成本,存儲受硬盤容量限制,需人工擴容,單線或雙線接入速度慢,有帶寬限制,峯值時期需人工擴容。需專人運維,成本高。數據處理能力,須要額外採購,單獨部署。html

而且oss有強大的可擴展,與靈活性,咱們可使用ossfs這樣成熟的oss輔助工具,直接將bucket掛載在ECS主機上提供服務,省去了bucket外網域名與CDN回源的設置環節,固然也看各業務的不一樣,若是遷移oss後的改動量大的話,推薦使用這種方法,這一次遷移咱們選擇掛載oss的方法。node

2、現有環境

咱們產品以音頻書籍爲主,因此在靜態節點的資源量上很是龐大。咱們將數據分紅十份,分散在十個node上,每一個node掛載有十分之一的資源。其中每兩臺node節點經過NFS共享一塊32T存儲塊,以單數node爲NFS的mount master node,雙數node爲NFS的mount slave node。nginx

clipboard.png

用戶經過靜態資源負載均衡器接口統一調用mp3文件,設置CDN回源地址爲靜態資源接口,SLB作七層轉發至/res/upload/cdn/node*各節點拼接url。此url爲線上音頻返回用戶的明文weburl,存儲在數據庫。例如url:web

https://hmf-res-cdn.kting.cn/res/upload/cdn/node1/kting_huawei_fm/amp/user_11632/audio_original/20181128/3ttskmcjd.mp3

3、遷移前夜

首先須要考慮的幾點因素:數據庫

  1. 時間問題,抽取什麼時間段進行遷移數據能夠不影響到線上服務。
  2. 仍是時間問題,什麼樣的方式遷移能夠以最快速度的完成,趕在共享存儲塊商業化以前。
  3. 費用問題,所有的遷移過程會有費用產生嗎。
  4. 增量數據問題,怎麼能夠保證數據量的同步。
  5. 發佈問題,數據遷移以後,要準備上線工做,怎麼能作到平滑的上線工做,將灰度降到最低。

帶着這些問題,準備開始遷移工做。vim

4、開始遷移

1.1使用單機模式ossimport

https://help.aliyun.com/docum...
下載ossimport.zipapi

分發zip文件
$ cat /data/salt/init.sls七牛雲存儲

ossfs-file:
  file.managed:
    - source: salt://ossfs/ossimport-2.3.2.zip
    - name: /opt/ossimport-2.3.2.zip
    - user: root
    - group: root

$ salt -N 'hmf_res' sate.sls init安全

1.2配置job.cfg

$ cat conf/local_job.cfg

#是否打開增量模式,若是設爲true,會每間隔incrementalModeInterval(單位秒)從新掃描一次增量數據,並將增量數據同步到oss上,incrementalModeInterval不建議配置成小於3600秒的值,會浪費不少請求次數,形成額外的開銷(目前可配置的最小間隔爲900秒)
isIncremental=true
incrementalModeInterval=21600

##############################################################同步源端設置##############################################################
#同步源類型,目前支持:
#1.local(本地文件,此選項只須要填寫srcPrefix,不須要填寫srcAccessKey,srcSecretKey,srcDomain,srcBucket)
#2.oss(從oss的一個bucket遷移到另外一個bucket)
#3.qiniu(七牛)
#4.bos(百度的雲存儲)
#5.ks3(金山的雲存儲)
#6.s3(亞馬遜s3)
#7.youpai(又拍雲,又拍雲獲取文件列表的接口比較特殊,在同步時list不支持斷點,所以在list沒有完成時殺掉同步進程會致使下次會從新所有list文件列表)
#8.http (經過提供的http連接列表同步數據,此選項不須要填寫srcAccessKey,srcSecretKey,srcDomain,srcBucket,srcPrefix)
#9.cos(騰訊雲)
#10.azure(微軟blob)
srcType=local

#源access key,同步本地文件以及經過http地址同步的不須要填,大部分雲平臺填寫控制檯獲取的acceess key/accss key id,又拍雲填寫操做員帳號
srcAccessKey=

#源secrect key,同步本地文件以及經過http地址同步的不須要填,大部分雲平臺填寫控制檯獲取的secret key/access key secret,又拍雲填寫操做員密碼
srcSecretKey=

#源endpoint,同步本地文件以及經過http地址同步的不須要填
#1.oss: 從控制檯獲取域名(非帶bucket前綴的二級域名),域名列表參考https://help.aliyun.com/document_detail/31834.html; 例:"srcDomain=http://oss-cn-hangzhou-internal.aliyuncs.com"; 若是用阿里雲ecs虛擬機作遷移的,請使用internal域名,不計費且不受虛擬機帶寬限制(非虛擬機沒法使用);例:http://oss-cn-hangzhou-internal.aliyuncs.com
#2.七牛: 從七牛控制檯獲取對應bucket的域名
#3.百度bos: http://bj.bcebos.com或者http://gz.bcebos.com
#4.金山ks3: http://kss.ksyun.com或者http://ks3-cn-beijing.ksyun.com或者http://ks3-us-west-1.ksyun.com
#5.亞馬遜s3: 各個region的地址請參考http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region
#6.又拍雲:  http://v0.api.upyun.com(自動判斷最優線路)或者http://v1.api.upyun.com(電信線路)或者http://v2.api.upyun.com(聯通網通線路)或者http://v3.api.upyun.com(移動鐵通線路)
#7.騰訊雲: cos v3版本不須要填寫;cos v4版本須要填上bucket所在的區域,好比華南園區填寫:gz,華北園區:tj,華東園區:sh
#8.微軟blob: 鏈接字符串中的EndpointSuffix,如core.chinacloudapi.cn
srcDomain=

#源bucket名字,同步本地文件以及經過http地址同步的不須要填,不須要加上"/";微軟blob填container名稱
srcBucket=

#源前綴,默認爲空,若是srcType=local,則此目錄是本地目錄,若是是其餘類型,則是源Bucket裏須要同步的Object的前綴,注意若是是本地目錄,須要完整目錄路徑(以'/'進行分割而且以'/'結尾,例: c:/example/)
srcPrefix=/resource_nginx/res/upload/cdn/node1/

##############################################################同步目的端設置################################################################
#目的 access key
destAccessKey=xxxxxxxxx

#目的 secret key
destSecretKey=xxxxxxxxxxxxxxxxxxxxxxx

#目的endpoint,請根據您的實際oss區域填寫,默認爲杭州的域名,若是用阿里雲ecs虛擬機作遷移的,請使用internal域名,不計費且不受虛擬機帶寬限制(非虛擬機沒法使用);例:http://oss-cn-hangzhou-internal.aliyuncs.com
#注意:域名裏不要帶上bucket前綴,oss域名幫助頁面:https://help.aliyun.com/document_detail/31837.html
destDomain=http://oss-cn-shanghai-internal.aliyuncs.com

#目的bucket,不須要加上"/"
destBucket=hmf-res-node1

#目標前綴,默認爲空,直接放在bucket下(若是要將數據同步到oss的某個目錄下,請以'/'結尾),注意:oss不支持以 '/' 做爲文件的開頭,因此destPrefix請不要配置以'/'作爲開頭
#一個本地文件路徑爲 srcPrefix + relativePath的文件,遷移到oss的路徑爲destDomain/destBucket/destPrefix + relativePath
#一個雲端文件路徑爲 srcDomain/srcBucket/srcPrefix + relativePath的文件,遷移到oss的路徑爲destDomain/destBucket/destPrefix + relativePath
destPrefix=res/upload/cdn/node1/

##############################################################srcType=cos時的配置項###########################################################
#騰訊雲的appId
appId=0

##############################################################srcType=youpai時的配置項########################################################
#又拍雲存儲數據遷移文件是否從CDN下載。又拍云云存儲下載操做默認限速,影響數據遷移速度;若是配置了CDN,能夠從雲存儲上獲取遷移文件的列表,數據從CDN上下載。cdnHost+key即爲下載地址。
isDownloadFromCdn=false
cdnDomain=

##############################################################srcType=http時的配置選項########################################################
#srcType="http"時,須要提供http列表文件的絕對路徑,此文件中的http連接須要劃分紅兩列,分別表明前綴以及上傳到oss後的相對路徑
#例,有一個完整的http連接是127.0.0.1/aa/bb.jpg,不一樣的切分方法最後會致使上傳到oss的路徑會不同:
#c:/example/http.list文件內容:
#127.0.0.1/aa/              bb.jpg
#127.0.0.1/                   aa/bb.jpg
# 第一行的文件導入到oss後的路徑爲 "destDomain/destBucket/destPrefix" + "bb.jpg"
# 第二行的文件導入到oss後的路徑爲 "destDomain/destBucket/destPrefix" + "aa/bb.jpg"

httpListFilePath=c:/example/http.list
httpPrefixColumn=1
relativePathColumn=2

##############################################################任務配置,沒有特殊需求不須要修改#################################################
#job名字,每一個任務惟一,單機模式下請不要修改此項
jobName=local_test

#job類型(import/audit),import爲同步數據到oss,audit爲校驗源端數據和oss數據是否一致
jobType=import

#只導入源文件最後修改時間大於該時間的數據,默認爲0,這個時間爲unix時間戳(秒數)
importSince=0

#在校驗時,若是文件的最後修改時間大於該值,則跳過此文件的校驗,默認值0爲關閉該功能,全部文件都須要校驗,這個時間爲unix時間戳(秒數),jobType爲audit時此項不生效
lastModify=0

#數據遷移時,是否跳過已經存在的文件。當設置爲true時,根據文件的size和LastModifedTime判斷是否跳過;爲false時,老是覆蓋OSS上已有文件。jobType爲audit時此項不生效。
isSkipExistFile=true

# 每一個子任務最大的文件個數限制,這個會影響到任務執行的並行度,通常配置爲總的文件數/120
taskObjectCountLimit=10000

#每一個子任務下載的最大文件大小限制(bytes)
taskObjectSizeLimit=1000000000

#並行掃描文件列表的線程數,隻影響掃描文件的效率,沒有特殊需求不要修改
scanThreadCount=1

#最大容許並行掃描目錄的深度,默認爲1就是隻能在頂級目錄間並行掃描,沒有特殊需求不要修改,隨意配置的過大會致使任務沒法正常運行
maxMultiThreadScanDepth=1

#單個大文件分片上傳併發數,默認超過150MB爲大文件,分片爲50MB,srcType=local時有效,其它狀況該配置項無效
uploadThreadNumPerLargeFile=3

#大於該值的文件使用分片上傳,不然使用普通上傳,請配置大於1MB以上;有效配置值如:50m/1024m/5g
multipartUploadThreshold=150m

#分配上傳時分片大小,請配置大於100k的數據,不然無效,採用默認值50MB;有效配置值如:500k/50m/2g
multipartUploadPartSize=50m

#存儲在OSS上的數據否加密,默認不加密
isServerSideEncryption=false

#local模式時,連接文件是否上傳,默認不上傳
isAllowSymbolicLink=false

# 七牛雲存儲獲取Meta的方式,有效值head和stat,默認使用stat;head經過HTTP HEAD請求獲取,stat經過BucketManager.stat
getObjectMetaMode=stat

#數據遷移後是否進行數據的正確性校驗,默認校驗
isAuditAfterImport=true 

#數據校驗方式,有效值爲simple/general/detailed,默認值general;simple只校驗文件的size,general校驗文件的size/lastModify/header,detailed檢驗文件的CRC或MD5,開發中
auditMode=general

更改內容部分以下:

isIncremental=true
incrementalModeInterval=21600
srcPrefix=/resource_nginx/res/upload/cdn/node1/
destAccessKey=xxxxxxxxx
destSecretKey=xxxxxxxxxxxxxxxxx
destDomain=http://oss-cn-shanghai-internal.aliyuncs.com
destBucket=hmf-res-node1
destPrefix=res/upload/cdn/node1/
isSkipExistFile=ture

開啓了增量模式,以6個小時的循環時間,在時間段的選擇上以及配合sys文件中的workerMaxThroughput選項不會對線上服務產生影響。而且也打開了判斷已存在文件的選項爲true。

數據目錄以node\*目錄爲明顯分界,劃分bucket設置源目錄到node*,oss目標目錄要以源目錄經過七層轉發後的數據目錄結構一致

accesskey與secretkey是阿里雲帳號的惟一訪問祕鑰,在控制檯面板帳戶頭像下有accesskey按鈕能夠得到。它是權衡oss是否公開或私有提供服務的通道。

1.3配置sys. properties

只更改一項:

workerMaxThroughput(KB/s)=51250

限制最大傳輸流量,由於在現有環境中,每兩臺node是經過nfs進行網絡存儲的,它經過內網交互,巧的是,阿里雲以地域劃分網絡屬於同一經典網絡地域是經過內網通訊的,也就是說10臺node是經過內網與oss進行遷移。但在測試環節中,發現ossimport啓動後對流量是沒有限制的,會直接將內網帶寬跑滿致使內網間服務器與服務器通信失敗,要避免只能先遷移nfs slave節點,若是先遷移nfs master節點話,內網帶寬跑滿,網絡存儲會沒有響應,對於線上來講nfs slave節點mp3數據文件等於宕掉返回狀態碼502

內網傳輸,咱們解決了費用問題,說明在整個遷移過程當中,是不會有費用產生的。

這又是一筆時間成本的問題,有三個方案:

  1. 先遷移完slave節點以後,還需將master,slave角色互換後再進行遷移,
  2. 在backup服務器中搭建ossimport遷移備份中的nfs
    master節點,但ossimport只能夠跑一個job,多job工做是不支持的,也就是多個源目錄遷移。
  3. 從ossimport上尋找緣由,想辦法限制遷移帶寬,讓遷移過程當中不影響內網通信,從而能夠作到"火力全開"。更改workerMaxThroughput的值也就是採起這一方案的緣由。這樣所有節點均可以在規定時間段內開始遷移,時間成本上達到均衡。

分發配置文件
$ salt-cp -N 'hmf_res' local_job.cfg /data/server/ossimport/conf/local_job.cfg

$ salt-cp -N 'hmf_res' sys.properties /data/server/ossimport/conf/sys.properties

2.1抽取時間段啓動ossimport

抽取天天0點到6點與13到17點流量較低的時間段進行遷移。
$ crontabe -e

0 0-6   * * * salt -N 'hmf_res' cmd.run '/data/server/ossimport/import.sh'
0 13-17 * * * salt -N 'hmf_res' cmd.run '/data/server/ossimport/import.sh'

2.2觀察job日誌是否正常

job啓動後在$OSSIMPORT_HOME/logs/job.stat.log有實時的遷移狀態輸出,經過這裏能夠觀察到剩餘的未完成線程

---------------- job stat ------------------
JobName:local_test
JobState:Running
PendingTasks:782
DispatchedTasks:1162
RunningTasks:74
SucceedTasks:0
FailedTasks:0
ScanFinished:false
RunningTasks Progress:
9AE4A4587A50C1E025DC75507150572F_1543478694125:1001388038/1001388038 101/101
072CCCEDE220FC1AF9436F75C4CF09DC_1543478689101:1000168397/1000168397 43/43
A805C8D5402A92BEC3DA7157B54D54C7_1543478696407:1007872906/1007872906 98/98
3E6DDC612342BDA379D16330ECCAC200_1543478690703:1003686291/1003686291 36/36
0D69C2C9D02FF630E5ED169A1A935049_1543478691589:1011642606/1011642606 30/30
48F98879A6CD3A502F81646DA1A60F56_1543478696871:1015556530/1015556530 96/96
E19B1B3BACD79E64A387BC6929C984ED_1543478697556:1017042946/1017042946 99/99
47CE6608AFEC7B4969DA98762C56D758_1543478697547:1002425626/1002425626 99/99
E42B7D4B9F68195334A5E707BA4F1AE5_1543478697222:1001794526/1001794526 94/94
......

遷移結束後,若是開啓增量模式,在import.log文件輸出中會顯示:

[2018-11-29 16:24:26] [JobTracker] [INFO ] - [2018-11-29 16:24:26] [JobTracker] [INFO ] - ================ Jobs Status =================
[2018-11-29 16:24:26] [JobTracker] [INFO ] - JobName:local_test
[2018-11-29 16:24:26] [JobTracker] [INFO ] - JobState:RUNNING
[2018-11-29 16:24:26] [JobTracker] [INFO ] - Pending Task Count:0
[2018-11-29 16:24:26] [JobTracker] [INFO ] - Dispatched Task Count:2331
[2018-11-29 16:24:26] [JobTracker] [INFO ] - Succeed Task Count:2331
[2018-11-29 16:24:26] [JobTracker] [INFO ] - Failed Task Count:0
[2018-11-29 16:24:26] [JobTracker] [INFO ] - Is Scan Finished:false

Dispatced Task Count與Succeed Task Count完成線程數一致

2.3觀察控制檯信息與帶庫佔用狀況

$ find /resource_nginx/res/upload/cdn/node1/ | wc-l
根據系通通計獲得總文件數量。

clipboard.png
從控制檯上不斷刷新能夠明顯看到文件數量的實時狀態,但其餘可監控項是有1-2小時的延遲抓取。

clipboard.png
發現未超過所限流量,帶寬正常,而且嘗試訪問nfs slave節點的音頻數據,weburl正常返回,說明遷移過程帶寬未影響到內網服務器

等待所有數據遷移完成,進行下一步ossfs掛載

3.1使用ossfs掛載bucket

將rpm包分發至10臺node,具體安裝方法能夠參考下面阿里官方文檔,有詳細的過程。
https://help.aliyun.com/docum...

3.2平滑掛載oss

在以前咱們提到一個問題,是關於增量數據的。這裏咱們將數據分爲兩部分,T1數據與T2數據。T1數據已經在第一次大規模遷移中完畢;剩下的數據是在觸發6小時增備前的數據,這一部分基本不多,每一個節點應該有300~400的文件數量,此數據稱之爲T2數據

clipboard.png

①已經結束的遷移在未觸發增量前,結束job。
$ jps
2341 ossimport.jar
$ kill -9 2341

②建立新目錄,預備卸盤以後的第二次遷移T2數據的工做
$ mkdir /T2data
$ vim conf/local_job.cfg

srcPrefix=/T2data/res/upload/cdn/node2/

此路徑是存在增量數據的原硬盤,等待掛載成功後開始遷移T2數據

③逐降10臺node中SLB權重值,平滑服務

④卸載硬盤
$ lsof -n | grep resource_nginx
$ /etc/init.d/nfs stop
查看進程佔用目錄狀況,關閉nfs服務
$ umount /resource_nginx
$ du -sh /resource_nginx/*
確保目錄下已經清空
$ rm -rf /resource_nginx/*

⑤掛載oss bucket
$ ossfs hmf-res-node1 /resource_nginx/ -ourl=http://oss-cn-shanghai-internal.aliyuncs.com -o allow_other
執行完畢後,恢復此節點權重值,跟蹤nginx訪問日誌http狀態碼
$ tail -f /data/logs/nginx/node_access.log

⑥返回狀態碼200 202 304,確保無誤後,迅速掛載原硬盤,遷移T2數據
$ mount /dev/vdc1 /T2data
$ du -sh /T2data/res/upload/cdn/node1/*
確保無誤,啓動job
$ sh import.sh
調整權重,逐個遷移其餘node

5、所有節點遷移完成後,進行結尾工做

①自動掛載

echo "ossfs#hmf-res-node1 /resource_nginx fuse _netdev,url=your_url,allow_other 0 0" >> /etc/fstab

其餘節點依次類推

②至此遷移的所有實戰過程就結束了,剩下的時間就是監控數據的變化,策劃將來oss備份工做,數據難得,雲廠商的產品雖好,但必定要有數據一直存在於本地,因此從雲上備到雲下也是必不可少的過程,固然這裏我提供你們三個方案,具體實施就不在闡述:

  1. 自行在業務端寫入OSS數據時設置雙份寫入,保證多數據中心的Bucket均同步存儲業務數據,由您本身完成備份功能。
  2. 將OSS中的數據同步或者異步下載到您本地您本身進行備份。具體須要調用OSS的API/SDK接口,請您參考:https://help.aliyun.com/docum...
  3. OSS自己提供跨區域複製功能,能夠將一個Bucket中的全量和增量數據異步地複製到其餘數據中心的Bucket中,同時關閉源Bucket的增刪改操做同步到目標Bucket。您能夠參考下:https://help.aliyun.com/docum...

每一個公司有各自的業務特色,此方案是我公司遷移過程記錄,但願能夠幫到你們進一步瞭解新產品,能夠儘快開展學習。感謝阿里雲提供計算服務,數據難得,操做謹慎!

相關文章
相關標籤/搜索