SeaweedFS的配置使用


    SeaweedFS是一個簡單並且高度可擴展的分布式文件系統,可以存儲數十億的文件並且快速獲得文件,特別適合於有效處理小文件,這里我們簡稱為weed,weed的主節點不管理文件元數據而是僅管理文件卷,這些文件卷服務器各自管理各自的元數據,所以這樣在高並發的情況下減少了主節點的壓力和網絡通信,同時定位文件也更迅速. 

    weed的每個文件元數據最多只有40字節的磁盤開銷,並且讀取磁盤的速度為O(1)級別的,因此性能非常高,weed的主要應用場景是存儲海量的圖片信息並且可以快讀定位. 

    weed是使用Go語言開發的,github主頁為:https://github.com/chrislusf/seaweedfs,使用weed可以通過源碼編譯,需要提前安裝Go環境;也可以使用編譯好的二進制包,不依賴Go環境直接執行,這里為了方便配置直接使用編譯好的二進制文件,下載地址是:https://github.com/chrislusf/seaweedfs/releases/tag/0.90,目前最新版是0.90,下面有不同平台的包以及源碼可以根據需要下載:

    

    我這里是64位linux,所以下載的是linux_amd64.tar.gz這個包,下載之后執行解壓: tar -xvzf linux_amd64.tar.gz 解壓之后直接在當前目錄有一個weed可執行文件,沒錯就是這么簡單,可以把這個二進制文件復制到任何地方.

    下面看一下幫助: ./weed help ,然后再看一下master的幫助: ./weed help master 注意不要寫反了,這里會列出master啟動的相關參數,查看卷啟動參數可以使用 /weed help volume ,其他的根據需要來.

    現在啟動一個master: ./weed master  默認綁定端口為9333可以通過-port指定,默認綁定ip為localhost和0.0.0.0,這個也可以指定,現在是在前台執行,實際環境可以使用nohup放到后台.  特別注意一點是,當單機啟動不同的master來管理多個存儲時,一定要使用-mdir參數指定master服務元數據目錄,如果不指定默認是/tmp,當多個實例分開時就會出現交叉的情況,當請求其中一個master時,會返回另外master管理的volume,引起很多問題,所以單節點部署多master一定要注意.

    然后我們啟動第一個volume服務:

nohup ./weed volume -dir="/data/weed" -max=5 -mserver="127.0.0.1:9333" -port=8080 > /var/log/weed.log 2>&1 &

    volume端口默認不指定為8080,-max指定是最大的卷個數,即這一個服務管理5個卷.

    然后我們再啟動第二個volume服務:

nohup ./weed volume -dir="/data/weed" -max=10 -mserver="127.0.0.1:9333" -port=8081 > /var/log/weed2.log 2>&1 &

    這里我們是在同一個服務器節點做的偽分布式,實際的分布式配置和上面完全一樣,很簡單.

    然后可以做一個簡單上傳圖片測試:

    首先向master發送請求獲取fid和卷服務器url:

curl -X POST http://127.0.0.1:9333/dir/assign

    這里本機寫127.0.0.1其他服務器要寫實際的master地址,然后返回如下:

    

    這里fid為8,06ca4883a0:8為卷id,是無符號的32位整數;后面的06為文件密鑰,是64位無符號整數,以16進制編碼;然后后面的ca4883a0是文件cookie,32位無符號整數,這里用的4組16進制字符串表示長度為8,主要是防止url猜測. 

    這個fid需要我們自己存儲,第一種方式可以按照結構拆分為整數類型存儲,最多占用4 + 8 + 4 = 16個字節;另一種方式我們直接可以存儲這個串,字符串長度最多也就是是8 + 1 + 16 + 8 = 33,所以一個char 33的數組就夠了,並且通常也沒有卷編號能夠達到2的32次方;這里是兩種常用的存儲方式,可以根據需要選擇.

     然后可以根據卷返回的url上傳文件的,這里8對應的是8081端口這個服務,下面可以上傳文件:

curl -X PUT -F file=@/root/test.jpg http://127.0.0.1:8081/8,06ca4883a0

    

    上傳成功之后會返回文件名和大小,現在就上傳成功了,原來的文件名不需要記錄.

    然后讀取方法如下:

    首先根據fid的卷編號獲得卷對應的服務器地址: curl http://127.0.0.1:9333/dir/lookup?volumeId=8 

    

    返回的是一個列表,可能之前volume和現在啟動方式不同會出現這種情況,當然盡量不要這樣,這里拿到ip后可以訪問圖片了,這里weed做的很人性化,下面的url都是可以的:

http://192.168.4.205:8081/8,06ca4883a0
http://192.168.4.205:8081/8,06ca4883a0.jpg
http://192.168.4.205:8081/8/06ca4883a0
http://192.168.4.205:8081/8/06ca4883a0.jpg
http://192.168.4.205:8081/8/06ca4883a0/xxxxx
http://192.168.4.205:8081/8/06ca4883a0/xxxxx.jpg

    具體ip改成實際的ip,可以看到上面做這些地址都是可以的,可以根據需要設計,最后的xxxxx可以是任意的字符串

    另外還可以對圖片做簡單的處理如調整尺寸: http://192.168.4.205:8081/8/06ca4883a0.jpg?height=200&width=200 ,只指定一個參數按比例縮放,另外更多參數可以參考文檔.

    最后刪除圖片可以使用: curl -X DELETE http://127.0.0.1:8081/8/06ca4883a0.jpg 

    

    可以看出,當刪除成功是返回實際的大小,文件不存在時返回0

    知道了上面的這些基本操作,我們就可以在程序中實現圖片的存儲,訪問和刪除了,這些基本操作在github首頁介紹的已經很詳細了,我這里只是敘述一遍而已.

    以上就是weed的基本配置和使用,實際使用中weed還支持分布式多主和跨數據中心管理等,操作都比較簡單,並且任何的卷掛掉之后,寫入仍然可以寫入剩余正常的而不受影響,讀取正常的卷上面的文件也不受影響,甚至主節點掛了如果知道對應的卷地址,訪問圖片仍然不受影響,這樣生產環境的使用彈性就非常好. 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM