張祥俊,伍衛(wèi)國
(1.西安交通大學(xué) 軟件學(xué)院,陜西 西安 710000;2.西安交通大學(xué) 電信學(xué)院,陜西 西安 710000)
高性能計算機(jī)已跨入了E級計算時代,數(shù)字媒體產(chǎn)業(yè)作為信息技術(shù)和人文藝術(shù)結(jié)合的內(nèi)容創(chuàng)意產(chǎn)業(yè)已成為最活躍的高性能計算應(yīng)用之一,用戶眾多。數(shù)字媒體作品的制作中,計算機(jī)3D技術(shù)的作用愈加重要,3D建模和渲染成為全球電影、動漫工業(yè)界關(guān)注的核心技術(shù)[1]。動漫作品團(tuán)隊(duì)使用渲染農(nóng)場后處理好的數(shù)據(jù)需要存放在一個共享的平臺[1],而在此平臺上對數(shù)據(jù)的安全有效管理成為目前需要考慮的問題。因此,在渲染流程處理中的數(shù)據(jù)量很大,眾包模式下的數(shù)據(jù)安全性、可靠性、高效存儲、便捷管理是一個問題,為了節(jié)約成本,使用統(tǒng)一的開放平臺接口處理渲染數(shù)據(jù)的問題也亟待解決。
FastDFS是一種分布式存儲系統(tǒng),特點(diǎn)在于以中小文件為載體[2],同時配合NGINX,兩者作為圖片服務(wù)器提供對應(yīng)的在線服務(wù),客戶端使用API讀寫文件,基本解決了大容量存儲的問題,并且這套高性能的文件服務(wù)器集群可以提供文件上傳、下載等操作。雖然FastDFS能滿足高性能的存儲,但是針對渲染流程中海量媒體的管理需求,還沒有辦法完全達(dá)到。首先,F(xiàn)astDFS不支持?jǐn)帱c(diǎn)續(xù)傳,在大文件上傳時,一般采用切片上傳形式;第二,F(xiàn)astDFS對文件的上傳版本沒有控制,客戶端上傳的文件都保存在服務(wù)器中,沒有進(jìn)行版本化的管理;第三,完成一個數(shù)字產(chǎn)品所需要的數(shù)據(jù)量很大,同時資產(chǎn)數(shù)據(jù)的個數(shù)也很多,為了能夠方便管理,需要有每個客戶所上傳的目錄分級,而FastDFS不能完成這一點(diǎn);第四,近年來,文創(chuàng)眾包走進(jìn)了大眾視野,在此新制作模式下,多個制作團(tuán)隊(duì)之間需要資源共享與權(quán)限控制,顯然當(dāng)前的FastDFS無法滿足這種多租戶的存儲即服務(wù)的需求。因此希望可以通過容器技術(shù)Docker支持多租戶,實(shí)現(xiàn)用戶環(huán)境隔離;第五,在數(shù)據(jù)安全方面,自動化恢復(fù)機(jī)制不完善:如果storage的某塊磁盤故障發(fā)生,且故障時間較長,只能手動恢復(fù)原有數(shù)據(jù)并且換磁盤;需要預(yù)先準(zhǔn)備好熱備磁盤,否則很難立即向外提供正常服務(wù)。不能自動化恢復(fù)會增加管理員的運(yùn)維成本。國內(nèi)的FastDFS與Google FS相似,具有存儲小文件優(yōu)化和簡潔的特性,比較mogileFS,維護(hù)和使用體驗(yàn)更好的開源分布式文件系統(tǒng)[3]。主要用于大中網(wǎng)站,為文件上傳和下載提供在線服務(wù)。所以在負(fù)載均衡、動態(tài)擴(kuò)容等方面都支持得比較好,但是截止目前,運(yùn)用FastDFS進(jìn)行存儲,并在其基礎(chǔ)上管理媒體資產(chǎn)的系統(tǒng)還未出現(xiàn)典型代表。
基于此,文中提出了一種利用容器化技術(shù)在給定時間進(jìn)行數(shù)據(jù)同步的機(jī)制,保證整個存儲集群滿足高性能存儲的數(shù)據(jù)可靠性要求,同時由于容器的多租戶技術(shù)[4],具備了很好的隔離性。最后對其進(jìn)行實(shí)驗(yàn)驗(yàn)證和測試。
海量媒體數(shù)據(jù)管理功能負(fù)責(zé)存儲傳輸海量場景數(shù)據(jù),由tracker集群和存儲集群組成。tracker集群負(fù)責(zé)管理數(shù)據(jù)的元數(shù)據(jù)信息,具有文件分塊/多副本/版本控制等功能,媒體作品創(chuàng)作端讀寫文件時首先和tracker集群通信完成元數(shù)據(jù)操作,隨后將數(shù)據(jù)通過restful API對象接口傳輸?shù)酱鎯?。具體使用場景如圖1所示。
圖1 數(shù)字媒體資產(chǎn)在線管理系統(tǒng)結(jié)構(gòu)
1.2.1 分布式文件系統(tǒng)概念
Distributed file system(DFS)是指多臺計算機(jī)協(xié)同合作,從而完成文件存儲、大數(shù)據(jù)計算等目標(biāo)?;ヂ?lián)網(wǎng)上的所有資源,最終都會以文件的形式存放在具體的物理機(jī)器的存儲設(shè)備上。存儲、讀取和管理這些海量的文件依靠單一的機(jī)器無疑是不行的,所以分布式文件系統(tǒng)進(jìn)入人們的視野。
1.2.2 FastDFS的系統(tǒng)架構(gòu)
FastDFS組成包括跟蹤服務(wù)器(tracker server)、存儲服務(wù)器(storage server)和客戶端(client)[5]。tracker的工作職責(zé)首要是調(diào)度,在整個過程中維持storage均衡;第二,作為所有storage server和group的管理者,需要連接每個storage,并得到它們所屬group信息,同時獲取其周期性心跳。得到心跳信息后,tracker負(fù)責(zé)建立group與storage serverlist的映射。
storage的責(zé)任是提供容量信息和冗余備份;storage server按group分組,同組內(nèi)可以有多臺storage,其中存儲的文件有同步備份。按group為單位存儲,可以進(jìn)行隔離應(yīng)用、服務(wù)器負(fù)載均衡、獲取到副本數(shù)等。
client主要是客戶端上傳下載文件等數(shù)據(jù)的服務(wù)器,即在client上部署自身開發(fā)的項(xiàng)目。安裝Nginx后,用戶發(fā)送的請求可以被分發(fā)到不同的tracker上。
(1)FastDFS的存儲策略。
FastDFS具有大容量存儲的特性,其原因是存儲節(jié)點(diǎn)采用了分組的組織方式。存儲系統(tǒng)中包含一個或多個組,組與組之間的文件獨(dú)立,整個存儲系統(tǒng)中的文件容量是將所有組的文件容量累加起來得到的。一個組可以由一臺或多臺storage組成[6]。當(dāng)組中增加storage時,系統(tǒng)自動完成同步組內(nèi)已有的文件,同步結(jié)束后,新增服務(wù)器會被系統(tǒng)切換上線,并對外提供服務(wù)。如果發(fā)生存儲空間不足或快要使用完的情況,動態(tài)添加組即可擴(kuò)大存儲系統(tǒng)的容量[7]。
(2)FastDFS的上傳過程。
使用者可以通過upload、download、appendfile、deletfile等基本文件訪問接口結(jié)合FastDFS進(jìn)行操作,這些接口是以客戶端庫的方式提供給用戶的。首先客戶端發(fā)送上傳文件的請求給tracker,tracker會分配一個可以存儲文件的group,之后再繼續(xù)分配合適的storage server。確定storage server后,client繼而發(fā)送寫文件請求,storage得到該消息后,將會為文件分配一個數(shù)據(jù)存儲目錄[8]。同時文件將得到fileid以作區(qū)分,最后生成存儲文件的文件名信息。
(3)FastDFS的文件下載。
client端上傳文件成功后,通過storage生成唯一文件名,調(diào)用download方法訪問到該文件并下載。在下載時client可以選擇任意tracker server。client發(fā)送download請求給某個tracker,請求信息中包含文件全名,tracker從文件全名中解析出文件的Id、所屬group、擴(kuò)展名等信息,之后選擇一個storage讀請求,提供下載服務(wù)[9]。
docker pull zxj2017/fastdfs:v1
docker network create --subnet=172.18.0.0/16 fastDfsnet
docker run -d --name trackerA-h Server-A --net=fastDfsnet --ip 172.18.0.10--add-host="storageA :172.18.0.12" --add-host="storageB :172.18.0.13"zxj2017/fastdfs:v1 sh tracker.sh
docker run -d --name trackerB -h Server-B --net=fastDfsnet --ip 172.18.0.11--add-host="storageA :172.18.0.12" --add-host="storageB :172.18.0.13" zxj2017/fastdfs:v1 sh tracker.sh
docker run -d --name storageA --net=fastDfsnet --ip 172.18.0.12 -h storageA -e TRACKER_IP=172.18.0.10:22122 -e GROUP_NAME=group1 zxj2017/fastdfs:v1 sh storage.sh
docker run -d --name storageB --net=fastDfsnet --ip 172.18.0.13-h storageB-e TRACKER_IP=172.18.0.11.202:22122-e GROUP_NAME=group2zxj2017/fastdfs:v1 sh storage.sh
環(huán)境測試:
進(jìn)入trackerA,上傳文件 查看結(jié)果:docker exec -it trackerA /bin/bash
vi /etc/fdfs/client.conf
tracker_server= Server-A:22122
vi test.txt
hellofastDFS
/usr/bin/fdfs_upload_file /etc/fdfs/client.conf test.txt
進(jìn)入storageA 查看結(jié)果:docker exec -it storageA/bin/bash
此時表明FastDFS的容器已經(jīng)啟動成功。
環(huán)境說明:工作服務(wù)器A:IP地址 172.18.0.10,操作系統(tǒng)Ubuntu,已建立用戶tom;備份服務(wù)器B:IP地址 172.18.0.11,操作系統(tǒng)Ubuntu,已建立用戶jack(uid 503,gid 503)。
實(shí)現(xiàn)目的:每天早上3點(diǎn),將A服務(wù)器上的用戶目錄/home,自動備份到B服務(wù)器的/home/jack/backup-A下,備份增量進(jìn)行[10],不需要任何用戶交互。
配置步驟:
配置備份服務(wù)器B。
(1)[root@Server-B ~]# rpm -qa| grep rsync #查看是否有rsync包
rsync-2.6.8-3.1
以上輸出說明rsync已經(jīng)裝好了,保證/etc/services有下面的行。
rsync 873/tcp *rsync
rsync 873/udp *rsync
(2)rsync的rpm包本身沒有附帶rsyncd的配置文件,需要手動創(chuàng)建(/etc/rsyncd.conf)。
[root@Server-B~]#vi /etc/rsyncd.conf
Log file=/var/log/rsyncd.log
[local0]
Comment=back from Server-A
Path=/home/jack/backup-A
Hosts allow=172.18.0.10 127.0.0.1
Read only=false
uid=503 #保證在服務(wù)器B的備份操作以jack這個用戶進(jìn)行
gid=503
(3)修改/etc/xinetd.d/rsync,打開rsync服務(wù)。
[root@Server-B ~]# vi /etc/xinetd.d/rsync
(4)開啟rsyncd服務(wù),并設(shè)置系統(tǒng)啟動時加載rsync服務(wù)。
[root@Server-B ~]# /usr/bin/rsync --daemon
(5)檢驗(yàn)rsync服務(wù)是否啟動成功。
[root@Server-B ~]#rsync localhost::
有如下內(nèi)容表示已經(jīng)成功啟動。
(6)配置ssh的非交互式登錄。
>>在服務(wù)器A上生成一對密鑰(以root的身份執(zhí)行)[root@Server-B ~]# ssh-keygen -t rsa
>>遠(yuǎn)程登錄到備份服務(wù)器B上并且創(chuàng)建.ssh目錄
[root@Server-A ~]#ssh jack@172.18.0.11
[jack@Server-B ~]$ mkdir .ssh;chmod 0700 .ssh
>>在A機(jī)上執(zhí)行遠(yuǎn)程拷貝公鑰到B機(jī):
[root@Server-A ~]#scp .ssh/id-rsa.pub root@172.18.0.11: /home/jack/.ssh/authorized_keys
這樣,無交互的ssh登錄就完成了。
(7)編制備份腳本。
在服務(wù)器A上編寫一個備份腳本,放置在/home/tom/public_scripts下,名為backup.sh。
#!/bin/sh
TARGET_DIR=backup-A
for SOURCE_DIR in “/home”
do
echo “Backing up $SOURCE_DIR …”
rsyn-au-delete $SOURCE_DIR jack@192.168.1.87:/home/jack/$TARGET_DIR
done
[root@Server-A public_scripts]# chmod 755 backup.sh
該腳本權(quán)限設(shè)置為755,以便其他用戶可訪問到。
(8)修改計劃任務(wù)。
在服務(wù)器A上,用root身份執(zhí)行以下命令,可以設(shè)定什么時候執(zhí)行腳本
[root@Server-A ~]# crontab -e
3* * * * /home/tom/public_scripts/backup.sh
同樣的操作在storageA和storageB之間將它們的目錄數(shù)據(jù)采用定時同步,然后對節(jié)點(diǎn)的同步進(jìn)行備份。
測試節(jié)點(diǎn)配置見表1。
表1 測試節(jié)點(diǎn)配置
續(xù)表1
該系統(tǒng)的測試使用FastDFS tracker服務(wù)器,FastDFS storage服務(wù)器,Mysql服務(wù)器與一臺終端進(jìn)行,安裝完成后,可通過上傳、下載的命令行進(jìn)行是否安裝成功的測試。圖2是測試環(huán)境的網(wǎng)絡(luò)拓?fù)洹?/p>
圖2 測試環(huán)境網(wǎng)絡(luò)拓?fù)?/p>
由圖2可知,因?yàn)榉?wù)器在FastDFS中擔(dān)任的角色不同,所以配置啟動的服務(wù)也不同。首先,在服務(wù)器172.18.0.10上對應(yīng)配置tracker,而在存儲服務(wù)器的group1對應(yīng)的172.18.0.12(storageA)和172.18.0.13(storageB)、group2對應(yīng)的172.18.0.14(storageC)和172.18.0.15(storageD)上配置storage,分成2組。按要求,tracker、storage服務(wù)器的配置文件都需要修改后方可運(yùn)行。根據(jù)上節(jié)提出的同步目錄組問題的設(shè)計[11],可知172.18.0.14(storageC)和172.18.0.15(storageD)中還必須配置rsync服務(wù)。最后配置啟動數(shù)據(jù)庫,包含3臺服務(wù)器。按照測試環(huán)境配置中劃分的角色,修改配置文件/var/lib/mysql-cluster/config.ini和/etc/my.cnf。由于條件限制,數(shù)據(jù)節(jié)點(diǎn)和訪問節(jié)點(diǎn)安裝在同一服務(wù)器上,先啟動管理節(jié)點(diǎn)192.168.0.243,再啟動數(shù)據(jù)節(jié)點(diǎn)192.168.0.241,192.168.0.242。
由部署的測試環(huán)境可知,F(xiàn)astDFS組內(nèi)一般有多臺存儲服務(wù)器,組內(nèi)設(shè)計在group2對應(yīng)的172.18.0.14和172.18.0.15上配置storage,通過將其中一臺存儲服務(wù)器172.18.0.14以及數(shù)據(jù)庫集群節(jié)點(diǎn)172.19.0.12關(guān)閉,模擬出分組中一臺存儲服務(wù)器及數(shù)據(jù)庫集群宕機(jī)的情況,如圖3所示。
第二步登入系統(tǒng)上傳一個文件,文件上傳成功后保存在FastDFS中的key是:
group1/M00/00/00/ rBIADFsMB9-AQUvBAAAA DT_u2ZM252.txt。由圖4、圖5可知,當(dāng)同組內(nèi)的某臺存儲服務(wù)器宕機(jī)時,集群對外提供的服務(wù)穩(wěn)定,并且可將上傳的文件同步到在分組中另外一臺存儲服務(wù)器172.18.0.15上。
由測試結(jié)果可知,當(dāng)172.18.0.12宕機(jī)時,開啟172.18.0.13服務(wù)器,可查找到已經(jīng)同步的文件,集群在某些節(jié)點(diǎn)宕機(jī)的情況仍可工作,因此系統(tǒng)具備較高的可靠性。
文中提出一種在FastDFS基礎(chǔ)上增加新功能的解決方案,以滿足平臺對海量媒體存儲要求的技術(shù),通過容器技術(shù)對存儲組鏡像進(jìn)行隔離[12-14],結(jié)合nginx模塊的無縫銜接,跟蹤節(jié)點(diǎn)和存儲節(jié)點(diǎn)可以靈活分配。針對FastDFS在數(shù)據(jù)恢復(fù)方面的缺點(diǎn),提出一種在不同節(jié)點(diǎn)上的同步策略,保證了存儲系統(tǒng)的可靠性和高效性。實(shí)驗(yàn)結(jié)果證明了該方法在高性能計算環(huán)境下的可靠性和隔離性[15],該技術(shù)提高了數(shù)字媒體系統(tǒng)在存儲方面的效率和靈活性。但是依然有一些不足,比如對于上層的應(yīng)用程序還可以結(jié)合容器編排技術(shù)對其進(jìn)行微服務(wù)式的管理,這樣可以大大提高整個系統(tǒng)的可靠性。另外,同步策略在同步數(shù)據(jù)時會給系統(tǒng)的性能帶來一些影響,這些問題還需要在今后的研究中繼續(xù)解決。