學(xué)習(xí)筆記-FastDFS

  • 內(nèi)容簡介

    在跟隨項目實踐過程中,代碼中需要使用上傳圖片的功能,其中使用了FastDFS作為圖片服務(wù)器,在此記錄一下搭建FastDFS服務(wù)器的過程


  • 框架介紹

    1.什么是FastDFS

    FastDFS是用c語言編寫的一款開源的分布式文件系統(tǒng)。FastDFS為互聯(lián)網(wǎng)量身定制,充分考慮了冗余備份、負(fù)載均衡、線性擴(kuò)容等機(jī)制,并注重高可用、高性能等指標(biāo),使用FastDFS很容易搭建一套高性能的文件服務(wù)器集群提供文件上傳、下載等服務(wù)。

    2.FastDFS架構(gòu)

    FastDFS架構(gòu)包括 Tracker server和Storage server。客戶端請求Tracker server進(jìn)行文件上傳、下載,通過Tracker server調(diào)度最終由Storage server完成文件上傳和下載。
    Tracker server作用是負(fù)載均衡和調(diào)度,通過Tracker server在文件上傳時可以根據(jù)一些策略找到Storage server提供文件上傳服務(wù)。可以將tracker稱為追蹤服務(wù)器或調(diào)度服務(wù)器。
    Storage server作用是文件存儲,客戶端上傳的文件最終存儲在Storage服務(wù)器上,Storage server沒有實現(xiàn)自己的文件系統(tǒng)而是利用操作系統(tǒng) 的文件系統(tǒng)來管理文件。可以將storage稱為存儲服務(wù)器,如下圖:

    fastdfs-show
    fastdfs-show

    3.Tracker 集群

    FastDFS集群中的Tracker server可以有多臺,Tracker server之間是相互平等關(guān)系同時提供服務(wù),Tracker server不存在單點故障。客戶端請求Tracker server采用輪詢方式,如果請求的tracker無法提供服務(wù)則換另一個tracker。

    4.Storage集群

    Storage集群采用了分組存儲方式。storage集群由一個或多個組構(gòu)成,集群存儲總?cè)萘繛榧褐兴薪M的存儲容量之和。一個組由一臺或多臺存儲服務(wù)器組成,組內(nèi)的Storage server之間是平等關(guān)系,不同組的Storage server之間不會相互通信,同組內(nèi)的Storage server之間會相互連接進(jìn)行文件同步,從而保證同組內(nèi)每個storage上的文件完全一致的。一個組的存儲容量為該組內(nèi)存儲服務(wù)器容量最小的那個,由此可見組內(nèi)存儲服務(wù)器的軟硬件配置最好是一致的。
    采用分組存儲方式的好處是靈活、可控性較強(qiáng)。比如上傳文件時,可以由客戶端直接指定上傳到的組也可以由tracker進(jìn)行調(diào)度選擇。一個分組的存儲服務(wù)器訪問壓力較大時,可

  • 準(zhǔn)備工作

    1.前提條件

    安裝好了VM+CentOs6.4(網(wǎng)絡(luò)等配置都可正常使用)
    已安裝nginx(非必須)
    JDK1.7

    2.安裝所需

    fastdfs-nginx-module_v1.16.tar.gz - 集成nginx所需模塊
    FastDFS_v5.05.tar.gz - FastDFS源碼,C語言編寫,需要手動編譯
    jdk-7u67-linux-x64.tar.gz
    nginx-1.8.0.tar.gz - nginx源碼,C語言編寫,需要手動編譯
    libfastcommonV1.0.7.tar.gz - FastDFS官方提供的基礎(chǔ)庫
    perl-5.20.2.tar.gz - 編譯基礎(chǔ)庫所需要的語言環(huán)境


  • 服務(wù)搭建

    1.環(huán)境介紹

    • VM + CentOs6.4 + Jdk1.7 + nginx1.8.0

    • 此處記錄的是在同一臺服務(wù)器上同時搭建tracker和storage,并且都是一個,組成的是一個最簡便的集群環(huán)境。


    2.安裝libfastcommon基礎(chǔ)庫

    • 將壓縮包上傳至虛擬機(jī)/usr/local下,解壓縮

    • 進(jìn)入文件夾,看到有make.sh文件,執(zhí)行 ./make.sh ,初次安裝會報錯,因為缺少必要的語言運行環(huán)境,執(zhí)行下列命令

    # FastDFS依賴libevent庫,需要安裝:
    yum -y install libevent
    
    # 安裝gcc庫,若之前安裝過nginx,則不需要重復(fù)安裝
    yum -y install gcc 
    yum -y install gcc -c++ 
    
    • 安裝Perl語言環(huán)境,需要下載源碼perl-5.20.2.tar.gz,上傳至/usr/local下,解壓縮,進(jìn)入目錄,依次執(zhí)行:
    $ tar -xzf perl-5.x.y.tar.gz //解壓縮
    $ cd perl-5.x.y
    $ ./Configure -de
    $ make
    $ make test
    $ make install
    $ perl -v //檢測是否安裝成功
    
    • 環(huán)境準(zhǔn)備完成后再進(jìn)入libfastcommon目錄,執(zhí)行 ./make.sh ,庫會安裝在/usr/lib64目錄下,但是FastDFS設(shè)置的lib目錄是/usr/local/lib ,所以此時可以有兩種方式
    # 第一種方式,復(fù)制一份
    cp /usr/lib64/libfastcommon.so /usr/local/lib  
    
    # 第二種方式,建立軟連接(推薦)
    ln -s /usr/lib64/libfastcommon.so /usr/local/lib/libfastcommon.so
    ln -s /usr/lib64/libfastcommon.so /usr/lib/libfastcommon.so
    
    • 到此基礎(chǔ)庫安裝完成

    3.安裝FastDFS

    • 將FastDFS_v5.05.tar.gz拷貝至/usr/local/下,依次執(zhí)行
    tar -zxvf FastDFS_v5.05.tar.gz
    cd FastDFS
    ./make.sh
    ./make.sh install
    
    • 如果安裝過程中沒有報錯,并且在/etc/fdfs目錄中包含配置文件,說明安裝成功,隨后將FastDFS目錄下的conf下的文件拷貝到/etc/fdfs/下

    4.配置tracker

    • 前面所執(zhí)行的步驟無論是tracker還是storage都是必須的,之后若要在不同的虛擬機(jī)上分別配置,主要就是對FastDFS安裝完成之后的配置過程的不同,此處演示的是在同一臺虛擬機(jī)上安裝配置

    • 初始化文件目錄

    # 配置tracker所需要的base_path
    mkdir /home/fastdfs_tracker 
    
    • 進(jìn)入/etc/fdfs目錄,復(fù)制tracker.conf.simple并改名為tracker.conf

    • 編輯tracker.conf,對以下幾個配置進(jìn)行修改

    # 是否啟用此配置文件
    disabled = true 
    # 端口號,一般使用這個默認(rèn)端口
    port = 22122 
    # tracker的數(shù)據(jù)和日志文件目錄(預(yù)先創(chuàng)建)
    base_path = /home/fastdfs_tracker 
    
    • 啟動tracker,執(zhí)行命令
    /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart
    
    • 查看日志觀察啟動過程中是否報錯
    tail -100f /home/fastdfs_tracker/logs/tracker.log   (base_path路徑)
    
    • 啟動沒有問題,則設(shè)置tracker為開機(jī)自動啟動,編輯:vi /etc/rc.d/rc.local , 將此命令加入末行。至此,tracker安裝完畢

    5.配置storage

    • 若更換虛擬機(jī)則需要執(zhí)行以上的步驟,此處繼續(xù)在原虛擬機(jī)上執(zhí)行

    • 初始化文件目錄

    # 配置storage所需要的base_path,保存日志信息
    mkdir /home/fastdfs_storage_info 
    # 配置storage所需要的base_path,保存數(shù)據(jù)文件
    mkdir /home/fastdfs_storage_data 
    
    • 進(jìn)入/etc/fdfs目錄,復(fù)制storage.conf.simple并改名為storage.conf

    • 編輯storage.conf,對以下幾個配置進(jìn)行修改

    # 是否啟用此配置文件
    disabled = true 
    # 組名
    group_name = group1
    # 端口,同一組必須保證端口統(tǒng)一
    port = 23001
    # 日志目錄
    base_path = /home/fastdfs_storage_info
    # 存儲路徑個數(shù),與組成員個數(shù)保持一致
    store_path_count = 1
    # 數(shù)據(jù)文件存儲路徑,果有多個掛載磁盤則定義多個store_path,后綴遞增即可
    store_path0 = /home/fastdfs_storage_data
    # tracker服務(wù)器IP和端口,如果有多個則配置多個tracker
    tracker_server = 192.168.XX.XXX:22122
    
    • 啟動storage,執(zhí)行命令
    /usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart
    
    • 觀察啟動過程中是否報錯
    # 通過日志觀察
    tail -100f /home/fastdfs_storage_info/logs/storaged.log
    # 通過監(jiān)控觀察是否成功注冊到tracker
    /usr/bin/fdfs_monitor /etc/fdfs/storage.conf
    
    • 啟動沒有問題,則設(shè)置storage為開機(jī)自動啟動,編輯:vi /etc/rc.d/rc.local , 將此命令加入末行。至此,storage安裝完畢

    6.測試服務(wù)

    • FastDFS安裝成功可通過/usr/bin/fdfs_test測試上傳、下載等操作。

    • 編輯/etc/fdfs/client.conf,修改以下配置

    base_path=/home/fastdfs_tracker
    tracker_server=192.168.XX.XXX:22122
    
    • 使用格式:/usr/bin/fdfs_test 客戶端配置文件地址 upload 上傳文件,例如:
    /usr/bin/fdfs_test /etc/fdfs/client.conf upload test.jpg
    

  • 整合nginx

    • 1.此處討論的是在之前nginx上重新安裝nginx(添加了新模塊)的情況,如何安裝nginx可以參考之前的博文:學(xué)習(xí)筆記-nginx

    • 2.不管是在tracker上安裝還是storage安裝nginx,都需要先上傳FastDFS-nginx-module模塊,并且修改相應(yīng)配置

    3.tracker上安裝nginx

    在每個tracker上安裝nginx,的主要目的是做負(fù)載均衡及實現(xiàn)高可用。此處只有一個tracker.為配置nginx

    4.在storage上安裝nginx

    • 庫環(huán)境在此處不再贅述,由于之前已經(jīng)安裝了nginx,此處需要添加新模塊FastDFS-nginx-module,添加之前,先下載該模塊并且修改相應(yīng)的配置文件

    • 上傳FastDFS-nginx-module至/usr/java目錄,解壓縮,進(jìn)入/FastDFS-nginx-module/src目錄下,編輯config文件,將/usr/local改為/usr (將/local去掉)

    CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"
    CORE_LIBS="$CORE_LIBS -L/usr/lib -lfastcommon -lfdfsclient"
    
    • 將FastDFS-nginx-module/src下的mod_FastDFS.conf拷貝至/etc/fdfs/下,并且修改配置(類比按照自己實際情況修改):
    base_path = /home/fastdfs_storage_info
    tracker_server = XX
    storage_server_port = XX
    group_name = XX
    url_have_group_name = true #是否在url中使用組名
    store_path_count = 1
    store_path0 = /home/fastdfs_storage_data
    group_count = 1
    #最后根據(jù)自己實際情況,為每一個組添加如下配置
    [group1]
    group_name=group1
    storage_server_port=23000
    store_path_count=1
    store_path0=/home/fastdfs_storage_data
    
    • 進(jìn)入nginx源碼的目錄(不是編譯后生產(chǎn)的目錄):/usr/java/nginx-1.8.0執(zhí)行命令:
    ./configure \
    --prefix=/usr/local/nginx \
    --pid-path=/var/run/nginx/nginx.pid \
    --lock-path=/var/lock/nginx.lock \
    --error-log-path=/var/log/nginx/error.log \
    --http-log-path=/var/log/nginx/access.log \
    --with-http_gzip_static_module \
    --http-client-body-temp-path=/var/temp/nginx/client \
    --http-proxy-temp-path=/var/temp/nginx/proxy \
    --http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
    --http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
    --http-scgi-temp-path=/var/temp/nginx/scgi
    --add-module=/usr/java/fastdfs-nginx-module/src  //XXX為模塊存在路徑
    
    • 成功后執(zhí)行make,重新編譯,會生成新的nginx執(zhí)行文件,不要執(zhí)行make install,在obj目錄下,將obj/nginx復(fù)制到舊版本的nginx安裝目錄下,將舊版本的改為nginx.bak

    • 測試新的nginx程序是否正確,執(zhí)行/usr/local/nginx/sbin/nginx -t , 若顯示以下信息則測試通過

    nginx: theconfiguration file /usr/local/nginx/conf/nginx.conf syntax is ok
    nginx:configuration file /usr/local/nginx/conf/nginx.conf test issuccessful
    
    • FastDFS設(shè)置的lib目錄是/usr/local/lib ,所以此時可以有兩種方式
    # 第一種方式,復(fù)制一份
    cp /usr/lib64/libfdfsclient.so /usr/local/lib  
    
    # 第二種方式,建立軟連接(推薦)
    ln -s /usr/lib64/libfdfsclient.so /usr/local/lib/libfdfsclient.so
    ln -s /usr/lib64/libfdfsclient.so /usr/lib/libfdfsclient.so
    
    • 最后需要配置nginx反向代理,進(jìn)入nginx安裝目錄,編輯nginx.conf文件,添加server節(jié)點:
    server {
        listen       80;
        server_name  localhost;
    
        location /group1/M00 {
                root /home/fastdfs_storage_data/data;
                ngx_fastdfs_module;
        }
    
        # location / {
           # root   html;
           # index  index.html index.htm;
        # }
    
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html81;
        }
    }
    
    • 配置好節(jié)點后,依次重啟tracker,重啟storage,重啟nginx,利用上述測試上傳圖片返回的url,在瀏覽器中訪問,檢測是否可以成功訪問

    5.坑和排坑

    • 我在操作過程中,卡在重新安裝nginx這一個步驟很久,啟動nginx的時候一直不成功,此時可以通過查看nginx的日志文件來查看錯誤,這個很重要

    • 編輯nginx.conf文件,添加server節(jié)點時,注意監(jiān)聽的端口,80端口只能配置一個

    • 若正常啟動了nginx還是不能成功訪問圖片(圖片已經(jīng)成功上傳的情況下),也可以通過查看日志來解決,比如我訪問的時候路徑里面會帶上/html/group1/...等路徑,就是因為下面那個默認(rèn)的location沒有注釋掉導(dǎo)致的

    • 看日志,很重要 tail -100f /var/log/nginx/error.log


  • 結(jié)語

搭這個服務(wù)器花了差不多一天的時間。。。過程中難免遇到很多坑,多查資料多百度,文中記錄的信息有限,中途說不定也有遺漏的信息,歡迎指正,僅供參考!


本文作者: little-dragon
個人博客: http://littledragon.cn
版權(quán)聲明: 原創(chuàng)文章,有問題請評論中留言。非商業(yè)轉(zhuǎn)載請注明作者及出處。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,505評論 6 533
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,556評論 3 418
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,463評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,009評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 71,778評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,218評論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,281評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,436評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,969評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,795評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,993評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,537評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,229評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,659評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,917評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,687評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 47,990評論 2 374

推薦閱讀更多精彩內(nèi)容