需要搭建一個高性能的文件系統(tǒng)?我推薦你試試它.....(下)
[root@localhost /]# cd /WorkSpace/SoftwareData/fdfs/data/storage0/data/ED/49/ [root@localhost 49]# ll 總用量 16 -rw-r--r--. 1 root root 17 9月 18 22:15 wKiJA19kwRqAI_g6AAAAEbcXlKw7921454 -rw-r--r--. 1 root root 17 9月 18 22:15 wKiJA19kwRqAI_g6AAAAEbcXlKw7921454_big -rw-r--r--. 1 root root 49 9月 18 22:15 wKiJA19kwRqAI_g6AAAAEbcXlKw7921454_big-m -rw-r--r--. 1 root root 49 9月 18 22:15 wKiJA19kwRqAI_g6AAAAEbcXlKw7921454-m [root@localhost 49]# cat wKiJA19kwRqAI_g6AAAAEbcXlKw7921454 A fdfs test file
- 文件上傳成功,可是這個目錄下面不止存在咱們方才上傳的文件,還存在其它的一些文件,這兒做一下闡明:
filename:為文件本體。
filename-m:為文件元數(shù)據(jù),例如文件的類型、巨細、假如是圖片還有長度寬度等。
filename_big:為備份文件,假如存在主備服務器,那么該文件會存放到備份服務器上。
filename_big-m:文件元數(shù)據(jù)的備份,假如存在主備服務器,那么該文件會存放到備份服務器上。
-
文件下載,運用自帶的FastDFS測驗客戶端,文件下載的方法與上傳相似,運用fdfs_test 裝備文件途徑 download 組名 長途文件名稱,即可下載該文件。
示例如下:
[root@localhost /]# rm -rf fdfstest [root@localhost /]# fdfs_test /etc/fdfs/client.conf download group1 M00/ED/49/wKiJA19kwRqAI_g6AAAAEbcXlKw7921454 This is FastDFS client test program v6.06 Copyright (C) 2008, Happy Fish / YuQing FastDFS may be copied only under the terms of the GNU General Public License V3, which may be found in the FastDFS source kit. Please visit the FastDFS Home Page http://www.fastken.com/ for more detail. [2020-09-18 22:29:10] DEBUG - base_path=/WorkSpace/SoftwareData/fdfs/client, connect_timeout=5, network_timeout=60, tracker_server_count=1, anti_steal_token=0, anti_steal_secret_key length=0, use_connection_pool=0, g_connection_pool_max_idle_time=3600s, use_storage_id=0, storage server id count: 0 storage=192.168.137.3:23000 download file success, file size=17, file save to wKiJA19kwRqAI_g6AAAAEbcXlKw7921454 [root@localhost /]# cat wKiJA19kwRqAI_g6AAAAEbcXlKw7921454 A fdfs test file
- 文件下載成功。
文件刪去測驗,運用fdfs_test 裝備文件途徑 delete 組名 長途文件名稱示例如下:
[root@localhost /]# fdfs_test /etc/fdfs/client.conf delete group1 M00/ED/49/wKiJA19kwRqAI_g6AAAAEbcXlKw7921454 This is FastDFS client test program v6.06 Copyright (C) 2008, Happy Fish / YuQing FastDFS may be copied only under the terms of the GNU General Public License V3, which may be found in the FastDFS source kit. Please visit the FastDFS Home Page http://www.fastken.com/ for more detail. [2020-09-18 22:31:40] DEBUG - base_path=/WorkSpace/SoftwareData/fdfs/client, connect_timeout=5, network_timeout=60, tracker_server_count=1, anti_steal_token=0, anti_steal_secret_key length=0, use_connection_pool=0, g_connection_pool_max_idle_time=3600s, use_storage_id=0, storage server id count: 0 storage=192.168.137.3:23000 delete file success # 然后進入stroage的對應目錄中檢查文件是否還存在 [root@localhost /]# cd /WorkSpace/SoftwareData/fdfs/data/storage0/data/ED/49/ [root@localhost 49]# ll 總用量 8 -rw-r--r--. 1 root root 17 9月 18 22:15 wKiJA19kwRqAI_g6AAAAEbcXlKw7921454_big -rw-r--r--. 1 root root 49 9月 18 22:15 wKiJA19kwRqAI_g6AAAAEbcXlKw7921454_big-m
- 發(fā)現(xiàn)僅存在文件備份,而文件本體已刪去成功。
FastDFS的HTTP拜訪
咱們只運用了FastDFS自帶的客戶端測驗東西來測驗文件的上傳、下載和刪去,可是在實踐情況下咱們并不是這么操作文件的,而是經過程序發(fā)送懇求來操作文件,那么就涉及到要經過HTTP拜訪文件,這兒單純依托FastDFS就無法做到了,咱們需求Nginx的配合。
Nginx的裝置這兒就不再贅述了,這兒就默認咱們都裝置好了Nginx。這兒直接進行nginx的裝備。
裝備之前咱們首要需求一個nginx的擴展模塊包——fastdfs-nginx-module,這兒相同供給一個下載地址:fastdfs-nginx-module。
下載完結之后,將其上傳到服務器并解壓:
[root@localhost Software]# tar -zxvf fastdfs-nginx-module-1.22.tar.gz fastdfs-nginx-module-1.22/ fastdfs-nginx-module-1.22/HISTORY fastdfs-nginx-module-1.22/INSTALL fastdfs-nginx-module-1.22/src/ fastdfs-nginx-module-1.22/src/common.c fastdfs-nginx-module-1.22/src/common.h fastdfs-nginx-module-1.22/src/config fastdfs-nginx-module-1.22/src/mod_fastdfs.conf fastdfs-nginx-module-1.22/src/ngx_http_fastdfs_module.c
然后將mod_fastdfs.conf文件復制到/etc/fdfs目錄下,而且修正它,修正項如下:
# 存儲日志文件的途徑,該途徑有必要存在,假如不存在需手動創(chuàng)立 base_path=/WorkSpace/SoftwareData/fdfs/nginx # 指定Tracker Server的地址,我這兒是192.168.137.3 tracker_server=192.168.137.3:22122 # 這兒一定得改成true,懇求中需求包含組名 url_have_group_name = true # Storage存儲文件的途徑 這個裝備有必要和storage.conf中的裝備相同 store_path0=/WorkSpace/SoftwareData/fdfs/data/storage0
裝備完結后咱們需求將這個擴展模塊新增到原來的nginx中:
# 先檢查當時nginx的信息 [root@localhost nginx-1.16.1]# nginx -V nginx version: nginx/1.16.1 built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC) configure arguments: --prefix=/WorkSpace/Software/nginx # 然后將--add-module=/WorkSpace/Software/fastdfs-nginx-module-1.22/src/添加到復制到configure的最終,重新履行configure,留意,新增的模塊途徑是每個人的都不相同,請勿直接復制粘貼。 [root@localhost nginx-1.16.1]# ./configure --prefix=/WorkSpace/Software/nginx --add-module=/WorkSpace/Software/fastdfs-nginx-module-1.22/src # 然后履行make [root@localhost nginx-1.16.1]# make # make install 重新裝置nginx [root@localhost nginx-1.16.1]# make install # 重新履行 nginx -V,假如出現(xiàn)方才添加的模塊,則裝置成功 [root@localhost nginx]# nginx -V nginx version: nginx/1.16.1 built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC) configure arguments: --prefix=/WorkSpace/Software/nginx --add-module=/WorkSpace/Software/fastdfs-nginx-module-1.22/src
修正nginx.conf文件,新增一個server:
server { listen 80; server_name 192.168.137.3; location ~/group[0-9]/M0[0-9]{ ngx_fastdfs_module; } }
然后重啟nginx:
[root@localhost conf]# nginx -s reload ngx_http_fastdfs_set pid=5044
假如你的nginx和fastdfs都是發(fā)動狀況,那么此刻已經能夠拜訪成功了。
fastdfs-nginx-module的履行原理
完結了文件拜訪之后,咱們復盤一下方才咱們做了什么,首要咱們裝置了nginx,然后將nginx的fastdfs擴展模塊添加到nginx中,之后進行了一下擴展模塊和nginx的裝備,但在裝備nginx的署理的時分,咱們并沒有像曾經相同直接將署理地址寫入裝備中,而是將原來寫署理地址的位置直接寫了fastdfs擴展模塊,那么這個模塊究竟是怎么運行起來的呢?
依照傳統(tǒng)的nginx反向署理的裝備方法,咱們應該在阻攔到懇求之后,直接經過裝備地址的方法,署理到目標服務器上,可是這兒直接指向fastdfs模塊,很顯然,這個模塊幫咱們干了這件事。
還記得咱們在擴展模塊的裝備文件中,裝備了Tracker Server的地址嗎?
當咱們懇求恣意一個Group時,都會被nginx阻攔下來然后發(fā)送給擴展模塊,然后擴展模塊經過咱們裝備的這個Tracker Server的地址,將懇求轉發(fā)給Tracker,Tracker會依據(jù)自己本地的group映射表,回來一個ip:port,例如咱們方才拜訪的是group1,那么擴展模塊會將group1發(fā)送給Tracker, Tracker回來192.168.137.3:23000給nginx,然后擴展模塊再經過這個地址,去拜訪storage,獲取文件流,回來給瀏覽器。
FastDFS分布式集群建立
單點FastDFS跑通之后,有同學或許就會有疑問,那這和咱們之前的文件體系也沒有很大差別啊,前面說的橫向擴展、容災備份咱們也徹底都沒有看到啊。
不急不急,這就來了。
方才咱們在一臺機器上部署了FastDFS,而且測驗了上傳下載刪去等功能,最終整合nginx完結了運用瀏覽器對文件的拜訪,而且了解了一下擴展模塊的運行原理。這些是為了讓咱們更好的了解FastDFS,可是本篇文章首要介紹分布式文件體系,分布式文件體系最大的特色也就在于容災備份、可擴展、高可用。那么接下來便是重頭戲,來講講FastDFS分布式集群的建立。
-
架構圖
咱們需求預備7臺Linux虛擬機,來完結本次集群的建立,包括1臺Nginx,2臺Tracker Server,4臺Storage分為2個group,每個group中一主一備。
我這兒預備的linux服務器信息如下:
入口服務器:192.168.137.7
Tracker01:192.168.137.101
Tracker02:192.168.137.102
Group1:
Storage01:192.168.137.103
Storage02:192.168.137.104
Group2:
Storage03:192.168.137.105
Storage04:192.168.137.106
- 其間Group1中的兩臺Storage彼此備份,Group2中的兩臺Storage彼此備份。
- 建立
-
對這六臺服務器,依照上文中的裝置過程,依次裝置Nginx和FastDFS。(過程如上)
主張在裝置之前履行yum指令先一次性將依賴包裝置完結:
yum -y install gcc perl openssl openssl-devel pcre pcre-devel zlib zlib-devel libevent libevent-devel wget net-tools
-
裝備集群
集群的裝備和上面單體的裝備有些許不同,因為咱們是將Tracker和Storage拆開,所以在裝Tracker的服務器上并不需求進行Storage的裝備,同理在裝Storage的機器上也不需求進行Tracker的裝備。
Tracker(101和102服務器)需求裝備的點:
# 1.綁定ip 因為有兩個Tracker,每個Tracker的IP都要不相同,請依據(jù)實踐情況! bind_addr = 192.168.137.101 # 2.設置端口 port = 22122 # 3.base目錄 該目錄需求手動創(chuàng)立,有必要保證存在 base_path = /WorkSpace/SoftwareData/fdfs/log/tracker # 4.上傳文件挑選group的方法 # 0:輪詢 # 1:指定一個group # 2:負載均衡,挑選一個最多空閑空間的group來上傳文件 store_lookup = 0
- Storage(103 104 105 106服務器)需求裝備的點:
# 1.設置group_name 103 104為group1,105 106為group2 group_name = group1 # 2.綁定ip bind_addr = 192.168.137.3 # 3.設置端口號 port = 23000 # bast_path 該途徑有必要手動創(chuàng)立 base_path = /WorkSpace/SoftwareData/fdfs/log/storage # 裝備storage存儲文件的途徑 途徑有必要手動創(chuàng)立 store_path0 = /WorkSpace/SoftwareData/fdfs/data/storage0 # Tracker Server的ip,因為有兩個tracker server,所以需求裝備兩個 tracker_server = 192.168.137.101:22122 tracker_server = 192.168.137.102:22122
-
集群發(fā)動
運用fdfs_trackered 裝備文件途徑來發(fā)動trakcer:
運用fdfs_stroaged 裝備文件途徑來發(fā)動storage:
- 咱們能夠在恣意一臺storage服務器中,運用fdfs_monitor /etc/fdfs/storage.conf指令來檢查整個集群的狀況:
[root@localhost ~]# fdfs_monitor /etc/fdfs/storage.conf [2020-09-20 20:18:05] DEBUG - base_path=/WorkSpace/SoftwareData/fdfs/log/storage, connect_timeout=5, network_timeout=60, tracker_server_count=2, anti_steal_token=0, anti_steal_secret_key length=0, use_connection_pool=1, g_connection_pool_max_idle_time=3600s, use_storage_id=0, storage server id count: 0 server_count=2, server_index=1 tracker server is 192.168.137.102:22122 #group總數(shù) group count: 2 # group1信息 Group 1: group name = group1 disk total space = 9,002 MB disk free space = 7,234 MB trunk free space = 0 MB # storage主機數(shù)及存活數(shù) storage server count = 2 active server count = 2 storage server port = 23000 storage HTTP port = 8888 store path count = 1 subdir count per path = 256 current write server index = 0 current trunk file id = 0 Storage 1: id = 192.168.137.103 ip_addr = 192.168.137.103 ACTIVE http domain = version = 6.06 join time = 2020-09-20 20:06:21 up time = 2020-09-20 20:06:21 total storage = 9,002 MB free storage = 7,234 MB upload priority = 10 store_path_count = 1 subdir_count_per_path = 256 storage_port = 23000 storage_http_port = 8888 current_write_path = 0 source storage id = 192.168.137.104 # 信息過長 省掉.... Storage 2: id = 192.168.137.104 ip_addr = 192.168.137.104 ACTIVE http domain = version = 6.06 join time = 2020-09-20 20:06:23 up time = 2020-09-20 20:06:23 total storage = 9,002 MB free storage = 7,234 MB upload priority = 10 store_path_count = 1 subdir_count_per_path = 256 storage_port = 23000 storage_http_port = 8888 current_write_path = 0 source storage id = # 信息過長 省掉.... # group2信息 Group 2: group name = group2 disk total space = 8,878 MB disk free space = 7,110 MB trunk free space = 0 MB storage server count = 2 active server count = 2 storage server port = 23000 storage HTTP port = 8888 store path count = 1 subdir count per path = 256 current write server index = 0 current trunk file id = 0 Storage 1: id = 192.168.137.105 ip_addr = 192.168.137.105 ACTIVE http domain = version = 6.06 join time = 2020-09-20 20:06:22 up time = 2020-09-20 20:06:22 total storage = 9,002 MB free storage = 7,234 MB upload priority = 10 store_path_count = 1 subdir_count_per_path = 256 storage_port = 23000 storage_http_port = 8888 current_write_path = 0 source storage id = 192.168.137.106 # 信息過長 省掉.... Storage 2: id = 192.168.137.106 ip_addr = 192.168.137.106 ACTIVE http domain = version = 6.06 join time = 2020-09-20 20:06:26 up time = 2020-09-20 20:06:26 total storage = 8,878 MB free storage = 7,110 MB upload priority = 10 store_path_count = 1 subdir_count_per_path = 256 storage_port = 23000 storage_http_port = 8888 current_write_path = 0 source storage id = # 信息過長 省掉....
- 能夠看到集群已經建立成功了,而且咱們能夠看到每個storage的狀況信息,例如每個節(jié)點的所屬組、IP、存儲空間巨細、HTTP端口、是否發(fā)動、連接的tracker server等等。
-
集群測驗
在六臺機器中隨意找一臺裝備client.conf文件,裝備項如下:
#client.conf 需求改如下兩個當?shù)氐难b備 # 日志基礎途徑 一定要手動創(chuàng)立 不然無法運用client測驗 base_path = /home/fdfs/log/client # 追尋器地址 tracker_server = 192.168.137.101:22122 tracker_server = 192.168.137.102:22122
- 然后創(chuàng)立一個用于測驗上傳功能的文件,創(chuàng)立結束后,運用fdfs_upload_file進行上傳,因為咱們設置的上傳模式是輪詢,所以記住要多上傳幾遍,才干看出作用。
上傳作用,能夠看到group1的兩臺機器互為備份,而group2的兩臺機器互為備份。
-
負載均衡策略
方才咱們設置的上傳策略是輪詢,所以咱們能夠看到,每次在上傳的時分,都會切換到與上一次不同的group中。FastDFS能夠設置三種不同的負載均衡策略,分別是:輪詢、指定一個group上傳、挑選一個剩下空間最多的group進行上傳。
# 上傳文件挑選group的方法 # 0:輪詢 # 1:指定一個group # 2:負載均衡,挑選一個最多空閑空間的group來上傳文件 store_lookup = 2 # 當store_lookup設置為1時,有必要在這個參數(shù)中設置一個group用來上傳文件 # 當store_lookup設置不為1時,這個參數(shù)無效 store_group = group2
- 因為篇幅有限,這兒就不逐個測驗了,感興趣的同學能夠在線下進行測驗。
- 拜訪集群中的文件
做一個簡略的回憶,上文中在裝備單體的FastDFS時,咱們是怎么經過HTTP拜訪文件的?
咱們運用了nginx,裝置了fastdfs的擴展模塊,然后在nginx中做了一個反向署理指向擴展模塊,擴展模塊去懇求咱們的tracker server獲取到group對應的storage服務器的ip端口號等信息,然后擴展模塊拿到這個信息之后,就去storage server中獲取文件流,回來給瀏覽器。
所以FastDFS集群也相同,咱們也需求經過nginx來拜訪文件,可是這兒的裝備稍微有些不同。
咱們得分這么幾種情況來裝備nginx:Tracker、Storage、入口服務器。
Tracker Server的nginx裝備:
upstream fastdfs_group_server{ server 192.168.137.103:80; server 192.168.137.104:80; server 192.168.137.105:80; server 192.168.137.106:80; } server { listen 80; server_name 192.168.137.101; location ~ /group[1-9]/M0[0-9]{ proxy_pass http://fastdfs_group_server; } }
-
發(fā)動nginx,假如nginx的work process沒有正常發(fā)動,需求將mod_fastdfs.conf、fastdfs解壓包目錄中的mime.types和http.conf復制到/etc/fdfs目錄下。
Storage Server的nginx裝備:
首要需求裝備mod_fastdfs.conf
base_path=/WorkSpace/SoftwareData/nginx # group1的storage就寫group1,group2的就寫group2 group_name=group1 # tracker_server tracker_server=192.168.137.101:22122 tracker_server=192.168.137.102:22122 # url包含組名 url_have_group_name = true # 和storage.conf的裝備相同 store_path0=/WorkSpace/SoftwareData/fdfs/data/storage0 # 有幾個組就寫幾 group_count = 2 # group_count寫幾個組,這兒就裝備幾個組 [group1] group_name=group1 storage_server_port=23000 store_path_count=1 store_path0=/WorkSpace/SoftwareData/fdfs/data/storage0 [group2] group_name=group2 storage_server_port=23000 store_path_count=1 store_path0=/WorkSpace/SoftwareData/fdfs/data/storage0
- nginx裝備:
server { listen 80; server_name 192.168.137.103; location ~ /group[1-9]/M0[0-9] { ngx_fastdfs_module; } }
-
然后發(fā)動Storage的nginx。
測驗一下拜訪:
-
集群拜訪流程
實踐咱們方才不論是拜訪哪臺服務器,都是能夠正常拜訪到這個文件的。
咱們能夠來推一下方才的拜訪流程,咱們方才在tracker中裝備了stroage的負載均衡,而在stroage的反向署理中裝備了fastdfs的擴展模塊。
假定咱們拜訪的是tracker,那么tracker服務器咱們裝備了負載均衡,負載均衡會自動路由到恣意一臺storage上,storage上裝備了擴展模塊,會帶上咱們拜訪的group去懇求tracker,tracker回來這個group的storage的ip和端口號。
那么假定咱們拜訪的是storage,那么storage里的擴展模塊就直接攜帶咱們的url中的group去拜訪tracker,相同也能找到storage的ip和端口。
所以只要group是正確的,無論拜訪哪臺機器,都能夠拜訪到文件。
-
裝備一致入口
還記得咱們搭集群之前說過,咱們需求7臺機器嗎,可是現(xiàn)在咱們只用了6臺,第7臺機器便是用在這兒。
因為方才咱們僅僅把集群搭起來了,可是這樣咱們需求記住6個ip地址,再來回憶一下開始的架構圖:
咱們需求供給一個nginx,負載均衡到兩個tracker中,然后咱們之后的程序就只需求拜訪這個入口,就能夠正常運用整個集群的服務了。
nginx裝備如下:
upstream tracker_server{ server 192.168.137.101; server 192.168.137.102; } server { listen 80; server_name 192.168.137.3; location ~/group[0-9]/M0[0-9]{ http://tracker_server; } }
測驗:
-
集群建立結束。
結語
分布式文件體系關于傳統(tǒng)文件體系的一些優(yōu)勢,詳細在于容災備份、橫向擴展,和處理傳統(tǒng)文件體系文中介紹的詳細的技術——FastDFS整合nginx,作為分布式文件體系的處理方案之一,能夠很好的處理一些生產環(huán)境下的巨量文件存儲問題。
別的FastDFS也能夠很便利的經過Java程序來對文件進行諸如上傳下載之類的操作,但因為篇幅原因,本文中沒有介紹到,當然假如咱們感興趣的話我會在下一篇博客中來詳細說說在實在項目是怎么運用FastDFS的。