1. 程式人生 > >大量資料遷移到物件儲存服務過程中使用聯合檔案系統的遷移方案

大量資料遷移到物件儲存服務過程中使用聯合檔案系統的遷移方案

記一次遷移3T靜態資料到儲存服務的實踐過程,跟大家分享一下。
剛畢業,水平有限,重在記錄和分享。^ _ ^

1.任務概述

  • 幾個T的靜態資料遷移,主要是小圖,從本地檔案系統遷移到新物件儲存服務中。
  • 遷移過程時間跨度大,可能要幾天甚至一週才能完成,在這過程中要保證業務正常,即圖片正常訪問。
  • 不對業務層作修改,嘗試通過更下層對檔案系統封裝一套方案,保證遷移過程中檔案的正常訪問。

如果你的遇到的場景與上述特徵相近,那麼可以試著讀完全文。

附錄:
問題記錄1-linux核心升級:https://blog.csdn.net/qq_37788558/article/details/84373650


問題記錄2-qingcloud對s3相容的url:https://blog.csdn.net/qq_37788558/article/details/84382102
問題記錄3-fuse的手動編譯安裝:https://blog.csdn.net/qq_37788558/article/details/84373885
問題記錄4-aufs安裝及替換overlay的可行性分析
https://blog.csdn.net/qq_37788558/article/details/84382545

2.個人分析

如果不考慮最後一條,我們可以通過修改程式碼,對資源進行雙寫,即向目前本地磁碟寫一份,向新的物件儲存服務寫一份,讀取資源不變,然後開始從本地磁碟向新的位置copy資料了,等全部copy完,新的位置就有全量資料了(遷移過來的資料+新寫入的資料),最後切換一下資料讀取的位置到新的物件儲存服務就行了。

但這次讓從linux檔案系統層面去嘗試一下,主要原因是以下幾點:

  1. 這個系統是零幾年到程式碼,那個結構和程式碼質量。。。都懂的。雙寫、切換地址,這種操作在這種老舊的程式碼裡不是修改全域性配置檔案之類的就可以搞定,有無數個地方要改,而且你還要挨個找到它們!
  2. 效能損耗。php邏輯處理、傳送http請求、資料傳輸等都有開銷,業務層開銷肯定要比更低層大。
  3. just try!領導想換個思路,嘗試個新方案。

3.初步方案

如圖,我們要從原檔案系統(source fs),遷到青雲(qingcloud)的物件儲存服務中(qingstor),通過s3fs將qingstor掛載到本地,然後和source fs組成聯合檔案系統(起初計劃用overlayFs,後來實際換成了aufs),這樣在聯合檔案系統中,上層和下層的merge用來讀寫,當讀取的資源在上層不存在時,會去找下層;當寫入寫檔案時,會寫到上層(即物件儲存服務),與此同時進行常規資料遷移。
細節不寫了,看圖意會^ ^。

資料遷移方案設計

4.知識介紹

我一開始也都不瞭解,所以查詢調研麼,分享下

4.1 OverlayFS:

一種聯合檔案系統,設計簡單,速度更快。overlayfs在linux主機上只有兩層,一個目錄在下層,用來儲存映象(docker),另外一個目錄在上層,用來儲存容器資訊。在overlayfs中,底層的目錄叫做lowerdir,頂層的目錄稱之為upperdir,對外提供統一的檔案系統為merged。 當需要修改一個檔案時,使用CoW將檔案從只讀的Lower複製到可寫的Upper進行修改,結果也儲存在Upper層。在Docker中,底下的只讀層就是image,可寫層就是Container。

參考:
https://my.oschina.net/xxbAndy/blog/884019
https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/7/html/7.2_release_notes/technology-preview-file_systems

4.2 source fs:

指原檔案系統,無特殊含義,即 from

(青雲對遷移工具qscamel的配置也是這樣定義)
source:
# type 是當前端點的型別。
# 可選值: aliyun, fs, filelist, gcs, qingstor, qiniu, s3, upyun.
type: fs
# path 是當前端點的路徑。
path: “/path/to/source”

4.3 s3fs:

S3FS(Simple Storage Service File)是一款支援將物件儲存中的bucket以檔案形式匯出的檔案系統介面,相容POSIX語義。S3fs是基於FUSE(使用者空間檔案系統(Filesystem in Userspace,簡稱FUSE)是作業系統中的概念,指完全在使用者態實現的檔案系統。目前Linux通過核心模組對此進行支援。一些檔案系統如ZFS,glusterfs和luster使用FUSE實現。)開發檔案系統,允許Linux和Mac Os X掛載S3的儲存桶在本地檔案系統,S3fs能夠保持物件原來的格式。

4.4 qingstor:

QingStor™ 物件儲存為使用者提供可無限擴充套件的通用資料儲存服務,具有安全可靠、簡單易用、高效能、低成本等特點。
即青雲的物件儲存服務(to

文件地址:https://docs.qingcloud.com/qingstor/

4.5 qscamel:

設計圖裡寫的qcamel,應該是指qscamel(一個用於在不同的端點 (Endpoint) 中高效遷移資料的工具)
文件上說,可以對接青雲、阿里、七牛等的多種提供商的物件儲存服務,這樣就好理解了,就是個遷移工具。

文件地址:https://docs.qingcloud.com/qingstor/developer_tools/qscamel.html

4.6 消化整理:

通過s3fs進行資料映象掛載,把S3儲存桶掛載到Linux的檔案系統下,這樣操作儲存桶裡的資料就如同操作本地檔案一樣方便。
通過overlay這種聯合檔案系統保證遷移過程中資料(圖片)的正常訪問,將source fs作為下層,青雲物件儲存服務作為上層,通過qscamel下層資料向上層的資料遷移。

5. 環境部署

linux:centos 6.6 / 核心 2.24(自己的centos7 /核心版本 3.10)
s3fs:  v1.84
fuse:   2.8.4 
overlay:基於linux 4.19核心

一開始用的我自己的機器,但線上的機器比較老,版本低,所以又用了環境一致的,共兩臺機器(後來都升級了核心,這裡提一下,overlayFs需要linux核心在3.18以上,aufs需要3.10)

6. 實踐過程

特別說明:以下內容大多都是過程中的文字記錄,暫不整理了,時間不太多

6.1 個人理解的步驟:

1、利用s3實現對qingstor的掛載
2、完成overlay的上(qingstor)、下層(source fs)的配置,實現資源的正常訪問
3、利用qscamel對資料進行遷移

6.2 具體步驟
  1. 申請qingstor獲取key、secret
    因為是測試過程,所以我先通過個人註冊,並進行身份認證後獲取免費配額,建立bucket之後獲得key、secret等,用自己的東西測試,隨便折騰。
  2. 安裝s3
    經查,qingcloud有qsfs工具,對該工具等描述如下:

qsfs 是基於 FUSE 的檔案系統,允許 Linux 將 QingStor Bucket 掛載在本地檔案系統。
qsfs 已在 GitHub 開源,更多詳情可參見 https://github.com/yunify/qsfs-fuse。

即,qsfs與s3fs都是基於fuse的,那麼fuse是什麼?如下:

FUSE(使用者空間檔案系統)作為類UNIX系統平臺上可載入的核心模組,允許非特權使用者建立功能完備的檔案系統,而不需要重新編譯核心。FUSE模組僅僅提供kernel模組的接入口,而本身的主要實現程式碼位於使用者空間中。對於讀寫虛擬檔案系統來說,FUSE是個很好的選擇。
FUSE起初是為了研究AVFS(A Virtual Filesystem)而設計的,而現在已經成為SourceForge的一個獨立專案,目前適用的平臺有Linux, FreeBSD, NetBSD, OpenSolaris和Mac OS X。官方的linux kernel版本到2.6.14才添加了FUSE模組,因此2.4的核心模組下,使用者如果要在FUSE中建立一個檔案系統,需要先安裝一個FUSE核心模組,然後使用FUSE庫和API來建立。
詳細資訊可參考:https://github.com/libfuse/libfuse

  • 那麼,我傾向選擇直接使用 qsfs 來掛載青雲的物件儲存,畢竟配套的東西會更加方便。
  • 但瞭解到目前公司普遍使用s3掛載磁碟,所以最終選擇使用 s3 ,熟悉一下對以後幫助會更大。

青雲物件儲存s3fs示例文件:https://docs.qingcloud.com/qingstor/s3/examples.html#s3fs

過程:

#獲取系統版本資訊
> uname -a
Linux iZ2ze1ddoyj3i3p3098r20Z 3.10.0-123.9.3.el7.x86_64 #1 SMP Thu Nov 6 15:06:03 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
或
> lsb_release -a
#這臺是我自己的機器,週二機器還沒給到
LSB Version:    :core-4.1-amd64:core-4.1-noarch
Distributor ID: CentOS
Description:    CentOS Linux release 7.5.1804 (Core) 
Release:        7.5.1804
Codename:       Core
或
>  cat /etc/redhat-release
CentOS release 6.6 (Final)

#安裝S3
#安裝依賴
> sudo yum install automake fuse fuse-devel gcc-c++ git libcurl-devel libxml2-devel make openssl-devel epel-release s3fs-fuse

##更改yum源(藍色部分是解決新機器問題時後加的):
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
yum clean all
yum makecache
##編譯安裝fuse(運維提供的機器是centos6.6,缺好多依賴,yum源也和版本不完全匹配,fuse通過yum一直安裝不上)
見 “錯誤記錄-fuse的安裝”
手動編譯過程記錄到了另一篇文章:http://note.youdao.com/noteshare?id=32a86a37653200966515201102f544eb

#下載並安裝S3fs-fuse
> git clone https://github.com/s3fs-fuse/s3fs-fuse.git
> cd s3fs-fuse
> ./autogen.sh
> ./configure
> make
> sudo make install
#檢查S3是否安裝成功
> s3fs
s3fs: missing BUCKET argument.
Usage: s3fs BUCKET:[PATH] MOUNTPOINT [OPTION]...
#成功 
  1. 修改s3配置,對qingstor進行掛載

配置項中的url如何設定文件交代的不明確,費了點時間,記錄到了另一篇文章:
http://note.youdao.com/noteshare?id=3c1d6830b30659be65cfeb937170ce55

過程:

#建立密匙
> mkdir /root/.s3fs
> vim /root/.s3fs/credentials
#PHHXPRD【防止惡意使用】ZAJJIGS:Kt7z8EsvajpLCIXUf3t9C【防止惡意使用】Eh5OEY3QFmuObs
#密匙檔案許可權給600 (只能給這個值,其他使用者不能給任何許可權,會報錯)
> chmod 600 /root/.s3fs/credentials
#掛載 bucket 到本地目錄:
> mkdir -p /mnt/mybucket
> s3fs hqw-wyq /mnt/mybucket -o passwd_file=/root/.s3fs/credentials -o url=http://s3.pek3b.qingstor.com -f -d -o f2
#驗證結果
> df -T | grep s3fs
s3fs           fuse.s3fs 274877906944       0 274877906944   0% /mnt/mybucket
> ls /mnt/mybucket
5.png  access_key.csv  demo6-16a47e5d31.jpg
#之前放到物件儲存服務中的檔案已經有了,新增檔案後在物件儲存服務中也同步過去了,掛載成功。
  1. 配置s3的開機自動掛載:
#寫入密匙
echo PHHXPRD【防止惡意使用】ZAJJIGS:Kt7z8EsvajpLCIXUf3t9C【防止惡意使用】Eh5OEY3QFmuObs > /etc/passwd-s3fs
#修改檔案許可權
chmod 600 /etc/passwd-s3fs
#修改 /etc/fstab 檔案,加入下面內容:
s3fs#hqw-wyq /mnt/mybucket fuse _netdev,url=http://s3.pek3b.qingstor.com,allow_other 0 0
#儲存 /etc/fstab 檔案,執行 mount -a 命令,如果沒有報錯,則說明設定正常
#如果您的系統為 centos6.5 ,還需要執行下面的命令:
chkconfig netfs on
#重啟測試
reboot
  1. 完成overlay的上(qingstor)、下層(source fs)的配置,實現資源的正常訪問

#Linux核心3.18以上才支援overlayFS,我的機器是3.10.0,運維提供的是2.6.32
此步驟中更新linux核心的操作寫到了另一篇文件中,避免太亂 :
http://note.youdao.com/noteshare?id=4ea02aeb6d4d7a6319471f55547ee03d

overlay設定:

mkdir /mnt/source
mkdir /mnt/merged
mount -t overlay overlay -olowerdir=/mnt/source,upperdir=/mnt/mybucket,workdir=/mnt/work /mnt/merged

整體結構分為三層:merged dir、upperdir、lowdir。
其中掛載的qingstor(/mnt/mybuket)作為上層,原資料檔案(/mnt/source)作為下層,二者的合集(/mnt/merged)供外部訪問,這樣以來對merged層的新寫入會同步到upper層即qingstor物件儲存服務中,訪問upper層沒有的資料時,會到lower層讀取舊資料。

!!貌似不可以使用s3掛載的映象作為upperdir,報錯如下:

mount: wrong fs type, bad option, bad superblock on overlay,
       missing codepage or helper program, or other error

       In some cases useful info is found in syslog - try
       dmesg | tail or so.

通過dmesg指令檢視詳細資訊主要有下面這條報錯:
[ 6094.524644] overlayfs: workdir and upperdir must reside under the same mount

(建立正常資料夾/mnt/upper,將配置引數換為upperdir=/mnt/upper,其他全部不變,則正常執行。)

  • 個人認為,workdir位置要與uppdir同級,但用s3掛載過來的檔案位置與一般檔案路徑還是有區別的,兩者某種意義上來說不在一級。
  • 不知道是不是可以這樣理解,也沒深究,希望能有人能解答我!
  • 後來試過不用workdir和upperdir,只用lowerdir,並放置多層。這樣可以正常執行,但是lower層只讀不可寫,這樣一來,也行不通。
  1. 利用qscamel對資料進行遷移

文件:https://docs.qingcloud.com/qingstor/developer_tools/qscamel

過程:

#下載qscamel工具
wget https://github.com/yunify/qscamel/releases/download/v2.0.5/qscamel_v2.0.5_linux_amd64.tar.gz
#解壓
tar -zxvf  qscamel_v2.0.5_linux_amd64.tar.gz
#建立配置檔案
vim example-tast.yaml
#內容如下
name: example-task
type: copy

source:
  type: fs
  path: /mnt/source

destination:
  type: qingstor
  path: /
  options:
    bucket_name: hqw-wyq
    access_key_id: PHHXPRDMQQSFJZAJJIGS
    secret_access_key: Kt7z8EsvajpLCIXUf3t9C12VlSEh5OEY3QFmuObs
# ignore_existing 控制是否跳過已經存在的檔案,這樣來跑增量
ignore_existing: last_modified
# 執行(首次執行跑全量)
./qscamel run example-task -t example.yaml
# 再次建立新的任務並執行(配置不變,ignore已存在的,跑增量)
./qscamel run example-task2 -t example.yaml

日誌檔案:~/.qscamel/qscamel.log

INFO[2018-11-15T11:46:14+08:00] Task example-task2 migrate started.          
INFO[2018-11-15T11:46:15+08:00] Start listing job /.                         
INFO[2018-11-15T11:46:15+08:00] Job / listed.                                
INFO[2018-11-15T11:46:15+08:00] Start checking object /s2.txt.               
INFO[2018-11-15T11:46:15+08:00] Start checking object /s1.txt.               
INFO[2018-11-15T11:46:15+08:00] Start checking object /s3.txt.               
INFO[2018-11-15T11:46:15+08:00] Object /s3.txt is not found at qingstor:hqw-wyq. 
INFO[2018-11-15T11:46:15+08:00] Start copying single object /s3.txt.         
INFO[2018-11-15T11:46:15+08:00] Object /s2.txt check passed, ignore.         
INFO[2018-11-15T11:46:15+08:00] Object /s1.txt check passed, ignore.         
INFO[2018-11-15T11:46:15+08:00] Single object /s3.txt copied.                
INFO[2018-11-15T11:46:15+08:00] Task example-task2 has been finished.     

以上,就是全部過程。

整理

目前風險點:

1、overlayfs需linux核心在3.18版本以上,目前機器版本較低centos6.6 / 2.6.32 ,需升級核心,這樣會影響到服務。
2、overlayfs的upper層使用通過s3掛載到檔案系統的qingstor映象未能成功執行,有報錯,使用正常檔案路徑則正常,初步懷疑這種方法不可行,二者不能這樣應用,具體有待進一步查閱和除錯。

可行性方案:
  1. 可以利用qingstor提供的外部映象源,它的介紹如下:
    在這裡插入圖片描述

個人認為步驟設計如下:

  • a、使用qscamel遷移全量資料
  • b、配置qingstor的外部映象到源空間
  • c、修改訪問地址轉到物件儲存服務的url
  • d、使用qscamel遷移增量資料
  • e、最終增量資料遷移完成,且外部映象使用量為0後,則表明全部成功
  1. 通過嘗試aufs,發現可以在overlay的使用過程中設定多個下層,將qingstor放在最上邊可以正常執行。

!!後來發現overlay這樣用,qingstor掛載過來的會不可寫(overlay中,upper可寫,lower只讀,都在lower層,則不可寫,所以無法使用。aufs中,多層會寫最上層),所以可以用aufs,overlay不行。
但兩種聯合檔案系統的問題是,都需要對linux版本做升級,重啟機器會影響服務,升級過程中是否影響其他一些功能的正常啟動暫不清楚(例如定時指令碼少執行一次;個別服務沒有設定開機自動重啟……)

最終還是將overlayfs用aufs替換
在這裡插入圖片描述

筆記到此end。