seaweedfs安裝配置使用

 Saeweedfs是一個由golang語言開發的分佈式對象存儲系統,很適合作圖片服務器,性能很好,安裝操做都很簡單,而且可兼容掛載提供路徑訪問的方式,能夠較爲便捷的將nginx+nfs此類的文件服務器轉換成nginx+seweedfs並提供api接口並不影響原有訪問url的模式html

 

參考連接node

https://github.com/chrislusf/seaweedfs/wiki/Getting-Started        官網linux

http://www.importnew.com/3292.html                                        論文nginx

https://www.jianshu.com/p/2ff61b56f37b                                       安裝git

https://blog.csdn.net/u012618915/article/details/83415955          參數github

https://www.jianshu.com/p/51d6d444303d                                    問題golang

 

首先咱們下載weedredis

在https://github.com/chrislusf/seaweedfs/releases/咱們能夠看到已有版本及歷史,寫此文檔時最新的長期支持版本爲1.34,咱們下載解壓後能夠看見一個可執行文件weed,由於是golang編譯好的,咱們能夠直接使用它sql

1 [root@seaweedfs-bj-zw-vm1~]# wget https://github.com/chrislusf/seaweedfs/releases/download/1.34/linux_amd64.tar.gz
2 [root@seaweedfs-bj-zw-vm1~]# tar -zxf linux_amd64.tar.gz
3 [root@seaweedfs-bj-zw-vm1 ~]# ll
4 -rwxr-xr-x. 1 root root  48548500 5月  29 17:29 weed
5 [root@seaweedfs-bj-zw-vm1 ~]# ./weed -h                # 查看幫助

master節點數據庫

master的做用僅僅是管理文件卷與服務器磁盤的映射,連文件的元數據也無論理,所以不須要額外的磁盤存儲,性能上也是極好的

 1 [root@seaweedfs-bj-zw-vm1 ~]# tail -30 master.out
 2 I0604 18:46:39  5872 node.go:224] topo:zw:openstack-bj-zw-bgp6 adds child 172.16.100.138:8082
 3 I0604 18:46:39  5872 master_grpc_server.go:67] added volume server 172.16.100.138:8082
 4 I0604 18:46:39  5872 master_grpc_server.go:95] master see new volume 23 from 172.16.100.136:8081
 5 I0604 18:46:39  5872 master_grpc_server.go:107] master send to filer172.16.100.111:25608: url:"172.16.100.136:8081" public_url:"172.16.100.136:8081" new_vids:23 
 6 I0604 18:46:39  5872 master_grpc_server.go:107] master send to filer172.16.100.107:15594: url:"172.16.100.136:8081" public_url:"172.16.100.136:8081" new_vids:23 
 7 I0604 18:46:39  5872 master_grpc_server.go:107] master send to filer172.16.100.106:40120: url:"172.16.100.136:8081" public_url:"172.16.100.136:8081" new_vids:23 
 8 I0604 18:46:39  5872 node.go:224] topo:zw:openstack-bj-zw-bgp6 adds child 172.16.100.138:8081
 9 I0604 18:46:39  5872 master_grpc_server.go:67] added volume server 172.16.100.138:8081
10 I0604 18:46:39  5872 master_grpc_server.go:95] master see new volume 24 from 172.16.100.138:8081
11 I0604 18:46:39  5872 master_grpc_server.go:107] master send to filer172.16.100.111:25608: url:"172.16.100.138:8081" public_url:"172.16.100.138:8081" new_vids:24 
12 I0604 18:46:39  5872 master_grpc_server.go:95] master see new volume 22 from 172.16.100.138:8082
13 I0604 18:46:39  5872 master_grpc_server.go:95] master see new volume 25 from 172.16.100.138:8082
14 I0604 18:46:39  5872 master_grpc_server.go:95] master see new volume 28 from 172.16.100.138:8082
15 I0604 18:46:39  5872 master_grpc_server.go:107] master send to filer172.16.100.111:25608: url:"172.16.100.138:8082" public_url:"172.16.100.138:8082" new_vids:22 new_vids:25 new_vids:28 
16 I0604 18:46:39  5872 master_grpc_server.go:107] master send to filer172.16.100.107:15594: url:"172.16.100.138:8081" public_url:"172.16.100.138:8081" new_vids:24 
17 I0604 18:46:39  5872 master_grpc_server.go:107] master send to filer172.16.100.107:15594: url:"172.16.100.138:8082" public_url:"172.16.100.138:8082" new_vids:22 new_vids:25 new_vids:28 
18 I0604 18:46:39  5872 master_grpc_server.go:107] master send to filer172.16.100.106:40120: url:"172.16.100.138:8082" public_url:"172.16.100.138:8082" new_vids:22 new_vids:25 new_vids:28 
19 I0604 18:46:39  5872 master_grpc_server.go:107] master send to filer172.16.100.106:40120: url:"172.16.100.138:8081" public_url:"172.16.100.138:8081" new_vids:24 
20 I0604 18:46:39  5872 node.go:224] topo:zw:openstack-bj-zw-bgp5 adds child 172.16.100.136:8082
21 這是我使用過產生的日誌,在master的輸出日誌中咱們能夠直觀看出master see new volume 22 from 172.16.100.138:8082這類日誌,這就是卷及其映射,表明22號卷在172.16.100.138的8082端口可訪問
22 咱們啓動一個master,並設置一些參數,參數有不少都是默認的,能夠不設置
23 # mdir    存儲元數據的數據目錄
24 # port    監聽端口
25 # peers    主節點ip:端口
26 # defaultReplication    備份策略
27 # ip    服務器ip
28 # garbageThreshold    清空和回收空間的閾值
29 # maxCpu    最大cpu數量,0是全部
30 # pulseSeconds    心跳檢測的時間間隔單位爲秒
31 # ip.bind    綁定ip
32 # volumeSizeLimitMB    volumes超載量,最大30G,即一個卷能夠存多少數據,固然一個卷不表明一個磁盤,這點在下面的volume節點上再寫
33 [root@seaweedfs-bj-zw-vm1 ~]# /root/weed master -mdir=/data/seaweedfs -port=9333 -peers=172.16.100.107:9333,172.16.100.111:9333,172.16.100.106:9333 -defaultReplication="000" -ip="172.16.100.107" -garbageThreshold=0.3 -maxCpu=0 -pulseSeconds=5 -ip.bind=0.0.0.0 -volumeSizeLimitMB=30000 >>/root/master.out &
34 [root@seaweedfs-bj-zw-vm1 ~]# tree /data/                # 這個目錄裏其實沒啥東西
35 /data/
36 └── seaweedfs
37     ├── conf
38     ├── log
39     └── snapshot
40 
41 2 directories, 2 files
42 [root@seaweedfs-bj-zw-vm1 ~]# netstat -tpln|grep 9333
43 tcp6       0      0 :::19333                :::*                    LISTEN      770/weed            
44 tcp6       0      0 :::9333                 :::*                    LISTEN      770/weed            
45 這樣咱們一個master節點就起來,固然若是你須要高可用的時候要將另外的master節點也起來,master節點是奇數,他們之間會選舉leader,剩下的成爲從節點以備不時之需,咱們的參數-peers就是指定全部的master節點ip及port,若是是測試只是用單機那就不用加這個參數了

volume節點

volume很明顯就是存儲數據的真實節點了,它保留了文件的元數據及文件,經過卷的模式將磁盤分割,每一個卷都有一個索引文件,每一個元數據只有40字節,讀取時間O(1),效率極高,速度極快

 

 1 首先咱們先將底層磁盤掛載上,我是2個1T的磁盤
 2 [root@seaweedfs-bj-zw-vm5 ~]# mkdir -p /data/seaweedfs/volume{1..2}
 3 [root@seaweedfs-bj-zw-vm5 ~]# mount /dev/vdb /data/seaweedfs/volume1
 4 [root@seaweedfs-bj-zw-vm5 ~]# mount /dev/vdc /data/seaweedfs/volume2
 5 [root@seaweedfs-bj-zw-vm5 ~]# df -h
 6 文件系統        容量  已用  可用 已用% 掛載點
 7 /dev/vda1        40G  2.3G   38G    6% /
 8 devtmpfs        1.9G     0  1.9G    0% /dev
 9 tmpfs           1.9G   12K  1.9G    1% /dev/shm
10 tmpfs           1.9G   17M  1.9G    1% /run
11 tmpfs           1.9G     0  1.9G    0% /sys/fs/cgroup
12 tmpfs           379M     0  379M    0% /run/user/0
13 /dev/vdb        1.0T  369G  656G   36% /data/seaweedfs/volume1
14 /dev/vdc        1.0T  185G  840G   18% /data/seaweedfs/volume2
15 # dir    存儲數據文件的目錄,剛纔的掛載點
16 # mserver    master服務器列表
17 # port    監聽端口
18 # ip    服務器ip
19 # max    本機volumes的最大值,在master上咱們定義的每一個卷爲30G,但是咱們的磁盤不可能就這麼點,而max的做用就是表示這個磁盤上能夠分多少個卷,默認是7,也就是30G * 7 = 210G,很明顯磁盤被浪費了不少空間,所以咱們須要指定一個大max值,保證volumeSizeLimitMB * max >= 磁盤容量,固然你能夠直接100,簡單粗暴
20 # dataCenter    機房
21 # rack    機架
22 # idleTimeout    鏈接空閒時間秒數
23 # images.fix.orientation    上傳時調整jpg方向
24 # ip.bind    監聽ip
25 # maxCpu    最大cpu數量
26 # read.redirect    從新定向轉移非本地volumes
27 
28 /root/weed volume -dir=/data/seaweedfs/volume1 -mserver=172.16.100.107:9333,172.16.100.111:9333,172.16.100.106:9333 -ip="172.16.100.136" -max=100 -dataCenter=zw -rack=openstack-bj-zw-bgp5 -idleTimeout=30 -images.fix.orientation=true -ip.bind=0.0.0.0 -maxCpu=0 -port=8081 -read.redirect=true >>/root/volume1.out &
29 /root/weed volume -dir=/data/seaweedfs/volume2 -mserver=172.16.100.107:9333,172.16.100.111:9333,172.16.100.106:9333 -ip="172.16.100.136" -max=100 -dataCenter=zw -rack=openstack-bj-zw-bgp5 -idleTimeout=30 -images.fix.orientation=true -ip.bind=0.0.0.0 -maxCpu=0 -port=8082 -read.redirect=true >>/root/volume2.out &
30 [root@seaweedfs-bj-zw-vm5 ~]# tail -30 volume1.out 
31 I0605 05:28:44 23656 store.go:99] In dir /data/seaweedfs/volume1 adds volume:35 collection: replicaPlacement:000 ttl:
32 I0605 05:28:44 23656 volume_loading.go:82] loading index /data/seaweedfs/volume1/35.idx to memory readonly false
33 I0605 05:28:44 23656 store.go:103] add volume 35
34 I0605 22:36:02 23656 store.go:99] In dir /data/seaweedfs/volume1 adds volume:36 collection: replicaPlacement:000 ttl:
35 I0605 22:36:02 23656 volume_loading.go:82] loading index /data/seaweedfs/volume1/36.idx to memory readonly false
36 I0605 22:36:02 23656 store.go:103] add volume 36
37 I0605 22:36:02 23656 store.go:99] In dir /data/seaweedfs/volume1 adds volume:41 collection: replicaPlacement:000 ttl:
38 I0605 22:36:02 23656 volume_loading.go:82] loading index /data/seaweedfs/volume1/41.idx to memory readonly false
39 I0605 22:36:02 23656 store.go:103] add volume 41
40 I0605 22:36:02 23656 store.go:99] In dir /data/seaweedfs/volume1 adds volume:42 collection: replicaPlacement:000 ttl:
41 I0605 22:36:02 23656 volume_loading.go:82] loading index /data/seaweedfs/volume1/42.idx to memory readonly false
42 I0605 22:36:02 23656 store.go:103] add volume 42
43 I0606 04:03:13 23656 store.go:99] In dir /data/seaweedfs/volume1 adds volume:43 collection: replicaPlacement:000 ttl:
44 I0606 04:03:13 23656 volume_loading.go:82] loading index /data/seaweedfs/volume1/43.idx to memory readonly false
45 I0606 04:03:13 23656 store.go:103] add volume 43
46 I0606 09:42:43 23656 store.go:99] In dir /data/seaweedfs/volume1 adds volume:50 collection: replicaPlacement:000 ttl:
47 I0606 09:42:43 23656 volume_loading.go:82] loading index /data/seaweedfs/volume1/50.idx to memory readonly false
48 I0606 09:42:43 23656 store.go:103] add volume 50
49 I0606 09:42:43 23656 store.go:99] In dir /data/seaweedfs/volume1 adds volume:51 collection: replicaPlacement:000 ttl:
50 I0606 09:42:43 23656 volume_loading.go:82] loading index /data/seaweedfs/volume1/51.idx to memory readonly false
51 I0606 09:42:43 23656 store.go:103] add volume 51
52 I0606 09:42:43 23656 store.go:99] In dir /data/seaweedfs/volume1 adds volume:53 collection: replicaPlacement:000 ttl:
53 I0606 09:42:43 23656 volume_loading.go:82] loading index /data/seaweedfs/volume1/53.idx to memory readonly false
54 I0606 09:42:43 23656 store.go:103] add volume 53
55 I0606 14:23:03 23656 store.go:99] In dir /data/seaweedfs/volume1 adds volume:58 collection: replicaPlacement:000 ttl:
56 I0606 14:23:03 23656 volume_loading.go:82] loading index /data/seaweedfs/volume1/58.idx to memory readonly false
57 I0606 14:23:03 23656 store.go:103] add volume 58
58 I0606 14:23:03 23656 store.go:99] In dir /data/seaweedfs/volume1 adds volume:62 collection: replicaPlacement:000 ttl:
59 I0606 14:23:03 23656 volume_loading.go:82] loading index /data/seaweedfs/volume1/62.idx to memory readonly false
60 I0606 14:23:03 23656 store.go:103] add volume 62
61 [root@seaweedfs-bj-zw-vm5 ~]# du -sh /data/seaweedfs/volume1/*
62 30G    /data/seaweedfs/volume1/23.dat
63 4.9M    /data/seaweedfs/volume1/23.idx
64 30G    /data/seaweedfs/volume1/29.dat
65 5.5M    /data/seaweedfs/volume1/29.idx
66 30G    /data/seaweedfs/volume1/33.dat
67 5.5M    /data/seaweedfs/volume1/33.idx
68 30G    /data/seaweedfs/volume1/34.dat
69 5.5M    /data/seaweedfs/volume1/34.idx
70 30G    /data/seaweedfs/volume1/35.dat
71 5.5M    /data/seaweedfs/volume1/35.idx
72 30G    /data/seaweedfs/volume1/36.dat
73 4.8M    /data/seaweedfs/volume1/36.idx
74 30G    /data/seaweedfs/volume1/41.dat
75 4.9M    /data/seaweedfs/volume1/41.idx
76 30G    /data/seaweedfs/volume1/42.dat
77 4.9M    /data/seaweedfs/volume1/42.idx
78 30G    /data/seaweedfs/volume1/43.dat
79 3.0M    /data/seaweedfs/volume1/43.idx
80 30G    /data/seaweedfs/volume1/50.dat
81 3.5M    /data/seaweedfs/volume1/50.idx
82 30G    /data/seaweedfs/volume1/51.dat
83 3.5M    /data/seaweedfs/volume1/51.idx
84 30G    /data/seaweedfs/volume1/53.dat
85 3.5M    /data/seaweedfs/volume1/53.idx
86 8.1G    /data/seaweedfs/volume1/58.dat
87 2.0M    /data/seaweedfs/volume1/58.idx
88 7.9G    /data/seaweedfs/volume1/62.dat
89 2.0M    /data/seaweedfs/volume1/62.idx
90 咱們能夠看錯,每一個索引文件最大5M,數據文件30G,磁盤被分割成了不少的卷(idx+dat)

簡單測試

如今的模式是master+ volume這種標準模式

 1 [root@seaweedfs-bj-zw-vm5 ~]# curl http://172.16.100.107:9333/dir/assign
 2 {"fid":"3,57f4e1898d66","url":"172.16.100.136:8082","publicUrl":"172.16. 100.136:8082","count":1}
 3 [root@seaweedfs-bj-zw-vm5 ~]# curl -F file=@/root/9ee6c1c5d88b0468af1a3280865a6b7a.png http://172.16.100.136:8082/3,57f4e1898d66
 4 [root@seaweedfs-bj-zw-vm5 ~]# wget 172.16.100.136:8082/3,57f4e1898d66
 5 [root@seaweedfs-bj-zw-vm5 ~]# ls                # 新下載下來的資源會被命名爲fid
 6 3,57f4e1898d66
 7 [root@seaweedfs-bj-zw-vm5 ~]# curl -X DELETE 172.16.100.136:8082/3,57f4e1898d66
 8 咱們能夠看出流程是,找master節點申請ip:port及fid,本身拼接ip:port/fid,而後post上傳,此時該資源到服務器上了,咱們能夠對ip:port/fid進行get等請求
 9 這裏面有2點比較麻煩
10 1.    要先申請,再拼接,再上傳
11 2.    要記錄返回的ip:port/fid才能對該資源進行之後的操做,也就是3個信息
12 相對應的解決方式也是有的
13 1.    curl -F file=@/root/9ee6c1c5d88b0468af1a3280865a6b7a.png http://172.16.100.107:9333/submit這樣會直接上傳(申請fid+上傳)
14 2.    wget 172.16.100.107:9333/3,57f4e1898d66咱們就直接訪問master節點ip:port/fid,這樣也是能夠操做資源的,由於內部默認是開啓了內部代理功能,咱們只須要記錄fid就能夠了

現實問題

在大部分中小企業中,你們一開始使用的都是nginx+nfs提供靜態資源訪問的模式,也就是nginx管理root路徑,而root路徑是外部掛載的大磁盤,而後咱們訪問的時候就是url/資源路徑模式。

它的優勢在於

  1. 簡單、簡單、簡單,重要的事情說三遍
  2. 成本低,不管是硬件成本仍是管理成本
  3. 訪問模式很直觀,從url就能夠看出文件路徑

它的缺點主要仍是來源於規模帶來的一些問題

  1. 不是接口形式,因此項目須要直接操做磁盤,自己只支持get請求,其餘請求須要代碼來協助完成
  2. 權限問題,由於項目必須能操做磁盤,那麼該目錄的權限須要管理以及相關的安全問題
  3. 容量問題,隨着時間的推移,咱們的大磁盤須要擴容,但是每次擴容前咱們須要備份(以防萬一),而這個磁盤已經幾個T了,備份時間過長
  4. 高可用問題,nfs的底層磁盤應該是某臺機器組成的raid,那麼這臺機器掛了怎麼辦,固然有人說有備機,可是nfs掛載自動切換還有有點慢
  5. 全部須要落盤操做的機器都必需要掛載nfs,nfs的掛載鏈接數,磁盤io及網絡開銷隨着掛載機器增多也在增大
  6. Nfs是文件存儲,隨着文件的增多,文件的索引層級也會愈來愈深影響速度
  7. 逼格不夠,哈哈哈哈

 

解決方式

咱們天然是使用本次的seaweedfs做爲圖片服務器了,這樣就能夠對應解決咱們上述的問題

  1. 默認提供restful api,不須要代碼層級再度實現
  2. 有了接口走的是http協議,只須要網絡通就能夠,不須要處處掛載文件系統了
  3. 容量不足了咱們加機器、加磁盤進集羣便可
  4. 自己實現了多種備份方式,可根據實際狀況來選擇
  5. 同2
  6. 本質仍是對象存儲,索引文件5M,操做速度極快

 

引出的問題

  1. 現有階段的代碼都是以url/文件路徑,這種模式進行操做的,而seaweedfs是url/fid,改動量太大,很差實現
  2. 由於是restful api,因此你們都能直接delete,很危險…..

 

解決方式

  1. 使用filer功能
  2. 對內網提供不一樣的域名,對外域名在Nginx上只容許get請求

 

filer節點

filer節點是能夠在任何地方執行的,它再次打開了一個http服務,而且也對外提供restful api,只是咱們可使用url/文件路徑的模式進行訪問了(以前的url/fid依然生效),filer節點提供的http服務能夠如同一個文件系統同樣被掛載,在掛載點,咱們能夠直觀的看見目錄層級(也是對象),及操做各個文件

1 [root@seaweedfs-bj-zw-vm1 ~]# /root/weed filer -master=172.16.100.111:9333,172.16.100.107:9333,172.16.100.106:9333 -ip=172.16.100.107 -defaultReplicaPlacement='000' -disableDirListing >>/root/filer.out &
2 [root@seaweedfs-bj-zw-vm1 ~]# /root/weed mount -filer=172.16.100.107:8888 -dir=/mnt >>/dev/null &
3 [root@seaweedfs-bj-zw-vm1 ~]# netstat -tpln|grep 8888
4 tcp        0      0 172.16.100.107:8888     0.0.0.0:*               LISTEN      771/weed            
5 tcp6       0      0 :::18888                :::*                    LISTEN      771/weed            
6 [root@seaweedfs-bj-zw-vm1 ~]# df -h|grep mnt
7 SeaweedFS                  1.3T  1.2T   48G   97% /mnt

訪問的流程其實仍是,以路徑模式操做---根據路徑獲取fid---以fid模式操做----seaweedfs,也就是路徑跟fid之間filer節點幫你作了一次轉換

在默認狀況下這種對應關係是存放在內存當中,實際狀況下,咱們須要安裝一個記錄關係的服務,如下是官方推薦的服務及其功能,咱們果斷使用了熟悉的redis,redis的記錄也很簡單,就是最簡單的string的kv對應關係,key是路徑,value是fid(轉義過的),固然其餘存儲的關係大概也能想來,數據庫類的天然就是有一個表(這個表的sql在配置文件裏都有),而後就是兩個記錄的字段便可

1 [root@seaweedfs-bj-zw-vm1 ~]# mkdir -p /etc/seaweedfs
2 [root@seaweedfs-bj-zw-vm1 ~]# cd /etc/seaweedfs
3 [root@seaweedfs-bj-zw-vm1 seaweedfs]# /root/weed scaffold filer -output=" filer.toml "
4 [root@seaweedfs-bj-zw-vm1 ~]# vim /etc/seaweedfs/filer.toml        # 把redis的信息填好,若是使用其餘後端,將其enabled改爲true並填寫相關信息便可
5 [redis]
6 enabled = true
7 address  = "xxx:6379"
8 password = ""
9 db = 0

咱們重啓filer服務後再次掛載,此時對應關係就會存在redis裏了,我的已經放入1.T數據,大概1.5億個key,在性能上徹底沒問題

後期咱們不管是使用restful api,仍是在mount的目錄直接進行操做,仍是在redis的庫裏直接操做,這三者操做都是一致的。例如咱們在redis上刪除了某個路徑的key,那麼這個文件就會直接消失,所以保存關係的後端也要維護好哦,固然,若是redis掛了,那麼filer功能就會崩潰,只能直接使用url/fid的模式

 

所以,使用filer來兼容以前nfs,咱們須要額外保證後端存儲的可用性!

相關文章
相關標籤/搜索