分佈式文件系統簡介html
分佈式文件系統是指能夠將用戶上傳的不少不少文件保存在多臺計算機上,主要解決單臺服務器硬盤容量不夠用問題,而且可以作到數據傳輸的負載均衡、以及數據存儲的主從備份。流行的開源分佈式文件系統有不少,介紹以下:linux
mogileFS:Key-Value型元文件系統,不支持FUSE,應用程序訪問它時須要API,主要用在web領域處理海量小圖片,效率相比mooseFS高不少。nginx
fastDFS:國人在mogileFS的基礎上進行改進的key-value型文件系統,一樣不支持FUSE,提供比mogileFS更好的性能。web
mooseFS:支持FUSE,相對比較輕量級,對master服務器有單點依賴,用perl編寫,性能相對較差,國內用的人比較多shell
glusterFS:支持FUSE,比mooseFS龐大服務器
ceph:支持FUSE,客戶端已經進入了linux-2.6.34內核,也就是說能夠像ext3/rasierFS同樣,選擇ceph爲文件系統。完全的分佈式,沒有單點依賴,用C編寫,性能較好。基於不成 熟的btrfs,其自己也很是不成熟。網絡
lustre:Oracle公司的企業級產品,很是龐大,對內核和ext3深度依賴app
NFS:老牌網絡文件系統,最近好幾年沒發展,廢了。負載均衡
FastDFS是由淘寶的餘慶先生所開發,是一個輕量級、高性能的開源分佈式文件系統,用純C語言開發,包括文件存儲、文件同步、文件訪問(上傳、下載)、存取負載均衡、在線擴容、相同內容只存儲一份等功能,適合有大容量存儲需求的應用或系統。作分佈式系統開發時,其中要解決的一個問題就是圖片、音視頻、文件共享的問題,分佈式文件系統正好能夠解決這個需求。同類的分佈式文件系統有谷歌的GFS、HDFS(Hadoop)、TFS(淘寶)等。分佈式
FastDFS兩個主要的角色:Tracker Server 和 Storage Server
Tracker Server:跟蹤服務器,主要負責調度storage節點與client通訊,在訪問上起負載均衡的做用,和記錄storage節點的運行狀態,是鏈接client和storage節點的樞紐。
Storage Server:存儲服務器,保存文件和文件的meta data(元數據)
Group:文件組,也能夠稱爲卷。同組內服務器上的文件是徹底相同的,作集羣時每每一個組會有多臺服務器,上傳一個文件到同組內的一臺機器上後,FastDFS會將該文件即時同步到同組內的其它全部機器上,起到備份的做用。
meta data:文件相關屬性,鍵值對(Key Value Pair)方式,如:width=1024, height=768。和阿里雲OSS的meta data類似。
2、安裝FastDFS單節點
2.1 安裝gcc
[Shell] 純文本查看 複製代碼
?
1
2
3
4
5
6
7
yum -y install gcc[/align]
[align=center]#後面會用到解壓命令(unzip),因此這裏能夠用yum把unzip 也裝一下[/align]
[align=center]yum install -y unzip zip[/align]
[align=center]#還有後面還要安裝nginx的依賴庫:[/align]
[align=center]yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel
2.2 安裝libevent
[Shell] 純文本查看 複製代碼
?
1
2
3
[align=center]yum -y install libevent
2.3 安裝libfastcommon-master
[AppleScript] 純文本查看 複製代碼
?
1
2
3
4
unzip libfastcommon-master.zip[/align]
[align=center]cd libfastcommon-master[/align]
[align=center]./make.sh [/align]
[align=center]./make.sh install
2.4 安裝fastdfs-master
[Shell] 純文本查看 複製代碼
?
1
2
3
4
unzip fastdfs-master-V5.05.zip[/align]
[align=center]cd fastdfs-master[/align]
[align=center]./make.sh [/align]
[align=center]./make.sh install
3、配置並啓動FastDFS
3.1 配置tracker服務器
[Shell] 純文本查看 複製代碼
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf[/align]
[align=center]vi /etc/fdfs/tracker.conf [/align]
[align=center]# 修改的內容以下: [/align]
[align=center]disabled=false # 啓用配置文件 [/align]
[align=center]port=22122 # tracker服務器端口(默認22122) [/align]
[align=center]base_path=/fastdfs/tracker # 存儲日誌和數據的根目錄[/align]
[align=center]# ln -s /usr/bin/fdfs_trackerd /usr/local/bin[/align]
[align=center]# ln -s /usr/bin/stop.sh /usr/local/bin[/align]
[align=center]# ln -s /usr/bin/restart.sh /usr/local/bin[/align]
[align=center]#新建目錄: [/align]
[align=center]/fastdfs/tracker[/align]
[align=center]#關閉防火牆: [/align]
[align=center]chkconfig iptables off[/align]
[align=center]#啓動tracker服務器: [/align]
[align=center]/etc/init.d/fdfs_trackerd start[/align]
[align=center]#中止tracker服務器: [/align]
[align=center]/etc/init.d/fdfs_trackerd stop[/align]
[align=center]#檢查FastDFS Tracker Server是否啓動成功:[/align]
[align=center]ps -ef | grep fdfs_trackerd [/align]
[align=center]#設置tracker服務開機啓動:[/align]
[align=center]chkconfig fdfs_trackerd on
3.2 配置storage服務器
[Shell] 純文本查看 複製代碼
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf
vi /etc/fdfs/storage.conf
disabled=false # 啓用配置文件
port=23000 # storage服務端口
base_path=/fastdfs/storage # 數據和日誌文件存儲根目錄
store_path0=/fastdfs/storage # 第一個存儲目錄
tracker_server=192.168.56.101:22122 # tracker服務器IP和端口
http.server_port=8888 # http訪問文件的端口
ln -s /usr/bin/fdfs_storaged /usr/local/bin
chkconfig iptables off
/etc/init.d/fdfs_storaged start
/etc/init.d/fdfs_storaged stop
ps -ef | grep fdfs_storaged
chkconfig fdfs_storaged on
4、測試FastDFS
4.1 配置Tracker客戶端
[Shell] 純文本查看 複製代碼
?
1
2
3
4
5
6
7
cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf[/align]
[align=center]vi /etc/fdfs/client.conf[/align]
[align=center]# 修改如下配置,其它保持默認 [/align]
[align=center]base_path=/fastdfs/tracker [/align]
[align=center]tracker_server=192.168.56.101:22122
4.2 執行客戶端上傳命令
[AppleScript] 純文本查看 複製代碼
?
1
2
3
4
5
/usr/bin/fdfs_upload_file [/align]
[align=center]/etc/fdfs/client.conf [/align]
[align=center]/usr/local/mao/cs.jpg [/align]
[align=center]group1/M00/00/00/wKg4ZVh8U-SANp6OAAHhOIDwENQ234.jpg[/align]
[align=center]# 能返回以上文件ID,說明文件已經上傳成功
5、使用nginx訪問FastDFS
5.1 在全部storage節點安裝fastdfs-nginx-module
[Shell] 純文本查看 複製代碼
?
1
unzip fastdfs-nginx-module-master.zip
5.2 安裝Nginx
[Shell] 純文本查看 複製代碼
?
01
02
03
04
05
06
07
08
09
10
tar -zxvf nginx-1.10.0.tar.gz[/align]
[align=center]# 執行下面的命令安裝nginx的依賴庫(前面已經裝過了):[/align]
[align=center]yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel[/align]
[align=center]# 注意:在執行./configure配置nginx參數的時候,須要將fastdfs-nginx-moudle源碼做爲模塊編譯進去:[/align]
[align=center]./configure --prefix=/opt/nginx --sbin-path=/usr/bin/nginx --add-module=/usr/fds/fastdfs-nginx-module/src[/align]
[align=center]# 編譯並安裝:[/align]
[align=center]make && make install
[size=12.0000pt]/usr/fds/fastdfs-nginx-module/src/ngx_http_fastdfs_module.c:445: 錯誤:‘false’未聲明(在此函數內第一次使用)
[size=12.0000pt]/usr/fds/fastdfs-nginx-module/src/ngx_http_fastdfs_module.c: 在函數‘ngx_http_fastdfs_handler’中:
[size=12.0000pt]/usr/fds/fastdfs-nginx-module/src/ngx_http_fastdfs_module.c:882: 錯誤:‘struct fdfs_http_context’沒有名爲‘arg’的成員
[size=12.0000pt]/usr/fds/fastdfs-nginx-module/src/ngx_http_fastdfs_module.c:883: 錯誤:‘struct fdfs_http_context’沒有名爲‘header_only’的成員
[size=12.0000pt]/usr/fds/fastdfs-nginx-module/src/ngx_http_fastdfs_module.c:884: 錯誤:‘struct fdfs_http_context’沒有名爲‘url’的成員
[size=12.0000pt]/usr/fds/fastdfs-nginx-module/src/ngx_http_fastdfs_module.c:885: 錯誤:‘struct fdfs_http_context’沒有名爲‘output_headers’的成員
[size=12.0000pt]/usr/fds/fastdfs-nginx-module/src/ngx_http_fastdfs_module.c:886: 錯誤:‘struct fdfs_http_context’沒有名爲‘send_file’的成員
[size=12.0000pt]/usr/fds/fastdfs-nginx-module/src/ngx_http_fastdfs_module.c:887: 錯誤:‘struct fdfs_http_context’沒有名爲‘send_reply_chunk’的成員
[size=12.0000pt]/usr/fds/fastdfs-nginx-module/src/ngx_http_fastdfs_module.c:887: 錯誤:‘fdfs_send_reply_chunk’未聲明(在此函數內第一次使用)
[size=12.0000pt]/usr/fds/fastdfs-nginx-module/src/ngx_http_fastdfs_module.c:888: 錯誤:‘struct fdfs_http_context’沒有名爲‘proxy_handler’的成員
[size=12.0000pt]/usr/fds/fastdfs-nginx-module/src/ngx_http_fastdfs_module.c:894: 錯誤:‘struct fdfs_http_context’沒有名爲‘if_modified_since’的成員
[size=12.0000pt]/usr/fds/fastdfs-nginx-module/src/ngx_http_fastdfs_module.c:897: 錯誤:‘struct fdfs_http_context’沒有名爲‘if_modified_since’的成員
[size=12.0000pt]/usr/fds/fastdfs-nginx-module/src/ngx_http_fastdfs_module.c:927: 錯誤:‘struct fdfs_http_context’沒有名爲‘range’的成員
[size=12.0000pt]/usr/fds/fastdfs-nginx-module/src/ngx_http_fastdfs_module.c:933: 錯誤:‘struct fdfs_http_context’沒有名爲‘if_range’的成員
[size=12.0000pt]/usr/fds/fastdfs-nginx-module/src/ngx_http_fastdfs_module.c:933: 錯誤:‘true’未聲明(在此函數內第一次使用)
[size=12.0000pt]make: * [build] 錯誤 2
[size=12.0000pt]
[Shell] 純文本查看 複製代碼
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[align=center]# 執行如下2條命令,而後從新make[/align]
[align=center]# ln -sv /usr/include/fastcommon /usr/local/include/fastcommon[/align]
[align=center]# ln -sv /usr/include/fastdfs /usr/local/include/fastdfs[/align]
[align=center]啓動、中止、重啓[/align]
[align=center]# 1.啓動nginx[/align]
[align=center]nginx [/align]
[align=center]# 可經過ps -ef | grep nginx查看nginx是否已啓動成功 [/align]
[align=center]# 2.中止nginx[/align]
[align=center]nginx -s stop[/align]
[align=center]# 3. 從新啓動[/align]
[align=center]nginx -s reload[/align]
[align=center]#配置nginx開機啓動[/align]
[align=center]#將/usr/bin/nginx命令添加到/etc/rc.d/rc.local文件中,rc.local文件會在系統啓動的時候執行。但若是是CentOS7則建議將開機啓動服務寫成服務描述文件添加到系統服務中,因此rc.local默認沒有執行權限,須要給它添加執行權限。[/align]
[align=center]shell> vi /etc/rc.d/rc.local[/align]
[align=center]# 添加以下參數[/align]
[align=center]/usr/bin/nginx[/align]
[align=center]chmod +x /etc/rc.d/rc.local
5.3 配置nginx與FastDFS關聯配置文件
[Shell] 純文本查看 複製代碼
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[align=center]cp /usr/local/mao/fastdfs-nginx-module-master/src/mod_fastdfs.conf /etc/fdfs/[/align]
[align=center]vi /etc/fdfs/mod_fastdfs.conf[/align]
[align=center]# 修改如下配置:[/align]
[align=center]connect_timeout=10 # 客戶端訪問文件鏈接超時時長(單位:秒)[/align]
[align=center]base_path=/tmp # 臨時目錄[/align]
[align=center]tracker_server=192.168.56.101:22122 # tracker服務IP和端口[/align]
[align=center]storage_server_port=23000 # storage服務端口[/align]
[align=center]group_name=group1 # 組名[/align]
[align=center]url_have_group_name=true # 訪問連接前綴加上組名[/align]
[align=center]store_path0=/fastdfs/storage # 文件存儲路徑[/align]
[align=center]# 複製 FastDFS 的部分配置文件到/etc/fdfs 目錄[/align]
[align=center]cd /usr/local/mao/fastdfs-master/conf/[/align]
[align=center]cp http.conf mime.types /etc/fdfs/[/align]
[align=center]# 在/fastdfs/storage文件存儲目錄下建立軟鏈接,將其連接到實際存放數據的目錄[/align]
[align=center]ln -s /fastdfs/storage/data/ /fastdfs/storage/data/M00[/align]
[align=center]# 配置nginx訪問storage文件[/align]
[align=center]vi /opt/nginx/conf/nginx.conf
user nobody;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 8888; server_name localhost; location ~/group([0-9])/M00 { ngx_fastdfs_module; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
}
6、啓動測試
[Shell] 純文本查看 複製代碼
?
1
2
3
4
5
6
7
8
nginx -s reload
nginx -c /opt/nginx/conf/nginx.conf