搭建部署FastDFS 分佈式文件系統php
什麼是分佈式文件系統html
分佈式文件系統 ( Distributed File System ) 是指文件系統管理的物理存儲資源不必定直接鏈接在本地節點上,而是經過計算機網絡與節點相連nginx
分佈是文件系統的設計基於客戶機/服務器模式c++
一個典型的網絡可能包括多個供多用戶訪問的服務器web
對等特性容許一些系統扮演客戶機和服務的雙重角色算法
衡量分佈式文件系統的優劣chrome
數據的存儲方式vim
數據的讀取速率瀏覽器
數據安全機制安全
FastDFS介紹
FastDFS是一款開源分佈式文件系統,它用純C語言實現,支持Linux,FreeBSD, AIX 等UNIX系統
做者爲淘寶網的餘慶
功能包括:文件存儲,文件同步,文件訪問(文件上傳,文件下載) 等
解決了大容量存儲和負載均衡的問題
FastDFS基本概念
FastDFS服務端有兩個角色:跟蹤器 ( tracker ) 和存儲節點 ( storage )
— 跟蹤器:主要作調度工做,在訪問上起負載均衡的做用
— 存儲節點:完成文件管理的全部功能,即存儲,同步和提供存儲接口,同時對文件的元數據進行管理
FastDFS系統結構
跟蹤器和存儲節點均可以由一臺多臺服務器構成
跟蹤器和存儲節點中的服務器都可以隨時增長或下線而不會影響線上服務
跟蹤器中的全部服務器都是對等的,能夠根據服務器的壓力狀況隨時增長或縮小
FastDFS 上傳文件過程
client 詢問 tracker 上傳到的 storage ,不須要附加參數
tracker 返回一臺可用的storage
client 直接和 storage 通信完成文件上傳
FastDFS下載文件過程
Client 詢問tracker 下載文件的storage , 參數爲文件標識( 卷名和文件名 )
tracker 返回一臺可用的storage
client 直接和storage 通信完成文件下載
搭建部署FastDFS 分佈式文件系統
實驗使用軟件包:
fastdfs-nginx-module_v1.16.tar.gz
FastDFS_v4.06.tar.gz
libevent-devel-1.4.13-4.el6.x86_64.rpm
libevent-doc-1.4.13-4.el6.noarch.rpm
libevent-headers-1.4.13-4.el6.noarch.rpm
nginx-1.7.10.tar.gz
實驗使用操做系統爲:RHEL6
實驗拓撲圖:
本案例 搭建一個簡單的輪詢FastDFS 分佈式文件系統
只搭建一臺跟蹤器 倆臺存儲節點 爲方便理解
實際生產項目中可使用更多 但具體操做步驟不變
操做流程:
跟蹤器 (tracker) pc70 192.168.4.70
配置主控服務器
存儲節點 (storage) pc71 192.168.4.71 pc72 192.168.4.72
準備存儲空間
配置存儲節點
搭建nginx web服務器
客戶端 ( client ) 192.168.4.254
上傳文件
下載文件
操做步驟:
配置主控跟蹤器服務器 pc70
1) 安裝依賴包
# yum -y install gcc gcc-c++
# rpm -q make
make-3.81-20.el6.x86_64
# yum -y install libevent
# cd fastdfs/
# ls libevent*
libevent-devel-1.4.13-4.el6.x86_64.rpm libevent-headers-1.4.13-4.el6.noarch.rpm
libevent-doc-1.4.13-4.el6.noarch.rpm
# yum -y install *.rpm
2) 安裝主包
# tar -zxf FastDFS_v4.06.tar.gz
# cd FastDFS
# ls
client conf HISTORY INSTALL php_client restart.sh storage tracker
common COPYING-3_0.txt init.d make.sh README stop.sh test
# ./make.sh
# ./make.sh install
# ls /usr/local/bin///命令存放路徑
fdfs_appender_test fdfs_delete_file fdfs_storaged fdfs_upload_appender
fdfs_appender_test1 fdfs_download_file fdfs_test fdfs_upload_file
fdfs_append_file fdfs_file_info fdfs_test1 restart.sh
fdfs_crc32 fdfs_monitor fdfs_trackerd stop.sh
# ls /etc/fdfs///配置文件存放路徑
client.conf http.conf mime.types storage.conf tracker.conf
3) 修改配置文件tracker.conf
# vim /etc/fdfs/tracker.conf
22 base_path=/data/fastdfs//日誌文件 數據 存放目錄
# mkdir -p /data/fastdfs // 建立數據存儲目錄
# vim /etc/fdfs/tracker.conf
36 store_lookup=0 //修改調到算法爲輪詢
46 store_server=0
51 store_path=0
56 download_server=0
182 use_storage_id = true//根據服務器的ID號時別
186 storage_ids_filename = storage_ids.conf//存儲主機編號文件
4) 建立存儲主機編號文件 storage_ids.conf
//在源碼目錄下有 storage_ids.conf 文件模版
# ls conf/storage_ids.conf
conf/storage_ids.conf
# cp conf/storage_ids.conf /etc/fdfs/ //使用模版 建立 storage_id 文件
# vim /etc/fdfs/storage_ids.conf //編輯 storage_id 文件,加入存儲組聲明
100001 group1 192.168.4.71
100002 group1 192.168.4.72
配置存儲節點 pc71 pc72
1) 準備存儲空間
# fdisk -l /dev/vdb
Disk /dev/vdb: 3221 MB, 3221225472 bytes
16 heads, 63 sectors/track, 6241 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xaf03cc5f
Device Boot Start End Blocks Id System
/dev/vdb1 1 6241 3145432+ 83 Linux
# mkdir -p /data/fastdfs/ //建立數據存儲目錄
[root@pc71 ~]# blkid /dev/vdb1
/dev/vdb1: UUID="e632a1df-60d5-47a6-825b-fc47ece05569" TYPE="ext4"
[root@pc71 ~]# vim /etc/fstab //將準備的存儲空間掛載到 數據存儲目錄上
[root@pc71 ~]# tail -1 /etc/fstab
UUID=e632a1df-60d5-47a6-825b-fc47ece05569 /data/fastdfs/ ext4defaults0 0
[root@pc72 ~]# blkid /dev/vdb1
/dev/vdb1: UUID="86acaaca-6c2c-4a41-8052-60038c41cc92" TYPE="ext4"
[root@pc72 ~]# vim /etc/fstab
[root@pc72 ~]# tail -1 /etc/fstab
UUID=86acaaca-6c2c-4a41-8052-60038c41cc92/data/fastdfs/ext4defaults0 0
# mount -a
# df -h | grep /dev/vdb1
/dev/vdb1 2.9G 4.5M 2.8G 1% /data/fastdfs
2) 安裝軟件包
# yum -y install gcc gcc-c++
# rpm -q make
make-3.81-20.el6.x86_64
# yum -y install libevent
# cd fastdfs/
# ls libevent*
libevent-devel-1.4.13-4.el6.x86_64.rpm libevent-headers-1.4.13-4.el6.noarch.rpm
libevent-doc-1.4.13-4.el6.noarch.rpm
# yum -y install *.rpm
# tar -zxf FastDFS_v4.06.tar.gz
# cd FastDFS
# ./make.sh && ./make.sh install
# ls /usr/local/bin/
fdfs_appender_test fdfs_delete_file fdfs_storaged fdfs_upload_appender
fdfs_appender_test1 fdfs_download_file fdfs_test fdfs_upload_file
fdfs_append_file fdfs_file_info fdfs_test1 restart.sh
fdfs_crc32 fdfs_monitor fdfs_trackerd stop.sh
# ls /etc/fdfs/
client.conf http.conf mime.types storage.conf tracker.conf
3) 修改配置文件storage.conf
# vim /etc/fdfs/storage.conf
7 group_name=group1//所屬存儲組
37 base_path=/data/fastdfs//數據 和日誌存儲目錄
85 sync_start_time=00:00//同步數據的默認開始時間
89 sync_end_time=23:59//同步數據的默認結束時間 實時推送
96 store_path_count=1//存儲路徑的個數
100 store_path0=/data/fastdfs//第一個存儲路徑
109 tracker_server=192.168.4.70:22122//主存儲服務器的ip 端口號
140 file_distribute_path_mode=0//有多個存儲路徑時 數據存儲路徑的選擇 0 輪詢
145 file_distribute_rotate_count=100//當存儲選擇爲輪詢 當存儲數據文件達到100時 輪詢給下一個存儲路徑
啓動服務
1)啓動主控跟蹤器服務器 pc70
//進入 源碼安裝目錄中
# cp init.d/fdfs_trackerd /etc/init.d///拷貝啓動腳本
# chmod +x /etc/init.d/fdfs_trackerd
# chkconfig --add fdfs_trackerd
# chkconfig fdfs_trackerd on
# service fdfs_trackerd start
Starting FastDFS tracker server:
# netstat -pantu | grep :22122
tcp 0 0 0.0.0.0:22122 0.0.0.0:* LISTEN 2393/fdfs_trackerd
2) 啓動存儲節點 pc71 pc72
//進入 源碼安裝目錄中
# cp init.d/fdfs_storaged /etc/init.d/
# chmod +x /etc/init.d/fdfs_storaged
# chkconfig --add fdfs_storaged
# chkconfig fdfs_storaged on
# service fdfs_storaged start
會在存儲路徑 初始化256子文件夾 結束後 按回車繼續
storage 數據文件說明
storage 爲用戶建立256個目錄存放上傳文件
輔助文件的目錄爲 /data/fastdfs/data
— .data_init_flag: 初始化信息
— storage_stat.dat:統計信息
— sync/binlog.### : 更新操做記錄 ( 日誌 )
— sync/${id}.mark : 同步完成狀況
[root@pc71 ~]# netstat -pantu | grep :23000
tcp 0 0 0.0.0.0:23000 0.0.0.0:* LISTEN 3848/fdfs_storaged
tcp 0 0 192.168.4.71:35832 192.168.4.72:23000 ESTABLISHED 3848/fdfs_storaged
tcp 0 0 192.168.4.71:23000 192.168.4.72:35316 ESTABLISHED 3848/fdfs_storaged
[root@pc72 ~]# netstat -pantu | grep :23000
tcp 0 0 0.0.0.0:23000 0.0.0.0:* LISTEN 3301/fdfs_storaged
tcp 0 0 192.168.4.72:23000 192.168.4.71:35832 ESTABLISHED 3301/fdfs_storaged
tcp 0 0 192.168.4.72:35316 192.168.4.71:23000 ESTABLISHED 3301/fdfs_storaged
[root@pc70 ~]# netstat -pantu | grep :22122
tcp 0 0 0.0.0.0:22122 0.0.0.0:* LISTEN 2393/fdfs_trackerd
tcp 0 0 192.168.4.70:22122 192.168.4.72:56753 ESTABLISHED 2393/fdfs_trackerd
tcp 0 0 192.168.4.70:22122 192.168.4.71:34256 ESTABLISHED 2393/fdfs_trackerd
客戶端 訪問主控服務器 驗證配置
1) 提供訪問命令 : 上傳文件命令 下載文件命令
//客戶端創建存放 提供訪問命令文件目錄
# mkdir /root/bin
//在主控服務器 pc70 山
# ls /usr/local/bin/
# cd /usr/local/bin/
//將其下的 fdfs_test fdfs_upload_fil fdfs_download_file fdfs_delete_file 拷貝給客戶端 /root/bin
# scp fdfs_test fdfs_upload_fil fdfs_download_file fdfs_delete_file 192.168.4.254:/root/bin
2) 編輯鏈接主控節點主機的配置文件 client.conf
//客戶端創建配置文件目錄
# mkdir /etc/fdfs/
//靠拷貝主控服務器
# scp /etc/fdfs/client.conf 192.168.4.254:/etc/fdfs/
//修改客戶端 上的客戶端配置文件
# vim /etc/fdfs/client.conf
10 base_path=/data/fastdfs
14 tracker_server=192.168.4.70:22122//指定主控服務節點的ip 和 端口
//客戶端建立 存放數據可日誌文件目錄
# mkdir /data/fastdfs
3) 客戶端上傳文件
# head -3 /etc/passwd > user.txt
# fdfs_test /etc/fdfs/client.conf upload user.txt //顯示訪問詳細過程
This is FastDFS client test program v4.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.csource.org/
for more detail.
[2018-01-16 14:30:14] DEBUG - base_path=/data/fastdfs, connect_timeout=30, 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
tracker_query_storage_store_list_without_group:
server 1. group_name=, ip_addr=192.168.4.71, port=23000
server 2. group_name=, ip_addr=192.168.4.72, port=23000
group_name=group1, ip_addr=192.168.4.71, port=23000
storage_upload_by_filename
group_name=group1, remote_filename=M00/00/00/wKgER1pdK3WABIFgAAAAaejzMko287.txt
source ip address: 192.168.4.71
file timestamp=2018-01-16 06:30:13
file size=105
file crc32=3908252234
file url: http://192.168.4.70:8080/group1/M00/00/00/wKgER1pdK3WABIFgAAAAaejzMko287.txt
storage_upload_slave_by_filename
group_name=group1, remote_filename=M00/00/00/wKgER1pdK3WABIFgAAAAaejzMko287_big.txt
source ip address: 192.168.4.71
file timestamp=2018-01-16 06:30:13
file size=105
file crc32=3908252234
file url: http://192.168.4.70:8080/group1/M00/00/00/wKgER1pdK3WABIFgAAAAaejzMko287_big.txt
[root@pc71 ~]# ls /data/fastdfs/data/00/00/ //查看存儲結果
wKgER1pdK3WABIFgAAAAaejzMko287_big.txt
wKgER1pdK3WABIFgAAAAaejzMko287_big.txt-m
wKgER1pdK3WABIFgAAAAaejzMko287.txt
wKgER1pdK3WABIFgAAAAaejzMko287.txt-m
//由於時實時推送數據文件 全部在 pc72 上也會存在
[root@pc72 ~]# ls /data/fastdfs/data/00/00/
wKgER1pdK3WABIFgAAAAaejzMko287_big.txt
wKgER1pdK3WABIFgAAAAaejzMko287_big.txt-m
wKgER1pdK3WABIFgAAAAaejzMko287.txt
wKgER1pdK3WABIFgAAAAaejzMko287.txt-m
# fdfs_upload_file /etc/fdfs/client.conf 1.jpg //上傳圖片文件 不顯示訪問過程
group1/M00/00/00/wKgESFpdLzOAUmpNAAB_2jHRplo230.jpg
[root@pc71 ~]# ls /data/fastdfs/data/00/00/ //查看存儲結果
...
wKgESFpdLzOAUmpNAAB_2jHRplo230.jpg
[root@pc72 ~]# ls /data/fastdfs/data/00/00/
...
wKgESFpdLzOAUmpNAAB_2jHRplo230.jpg
4) 下載文件
// 下載文件 將其命名爲test.jpg
# fdfs_download_file /etc/fdfs/client.conf group1/M00/00/00/wKgESFpdLzOAUmpNAAB_2jHRplo230.jpg test.jpg
# ls test.jpg
test.jpg
5) 刪除文件
# fdfs_delete_file /etc/fdfs/client.conf group1/M00/00/00/wKgESFpdLzOAUmpNAAB_2jHRplo230.jpg
配置Web訪問 pc71 pc72
1) 安裝提供nginx 軟件包
fastdfs-nginx-module_v1.16.tar.gz
nginx-1.7.10.tar.gz
在pc71 和 pc72
# tar -zxf fastdfs-nginx-module_v1.16.tar.gz
# tar -zxf nginx-1.7.10.tar.gz
# useradd nginx
# yum -y install pcre-devel
# yum -y install zlib-devel
# cd nginx-1.7.10
# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --add-module=../fastdfs-nginx-module/src/
# make
# make install
# ls /usr/local/nginx/
conf html logs sbin
2) 修改配置文件
# vim /usr/local/nginx/conf/nginx.conf
43 location / {
44 #root html;
45 #index index.html index.htm;
46 ngx_fastdfs_module; //引入模塊文件
47 }
//拷貝模塊配置文件 到配置文件目錄
# cp /root/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/
# vim /etc/fdfs/mod_fastdfs.conf
40 tracker_server=192.168.4.70:22122//指定主控服務器的IP 和端口
44 storage_server_port=23000//存儲節點監聽端口
47 group_name=group1//當前所在存儲組
53 url_have_group_name = true
57 store_path_count=1
62 store_path0=/data/fastdfs
# /etc/init.d/fdfs_storaged restart//重啓存儲服務
3)啓動nginx
# /usr/local/nginx/sbin/nginx
# netstat -pantu | grep nginx
具體訪問過程
客戶端訪問 80 ---> nginx ---> nginx.conf --->模塊 ---> 配置文件 ---> 主控服務的IP地址 ---> 主控服務器分配
4) 客戶端訪問測試
上傳文件
# fdfs_upload_file /etc/fdfs/client.conf test.jpg
group1/M00/00/00/wKgER1pdQ0iASS_fAAB_2jHRplo601.jpg
//在瀏覽器訪問 就會看見圖片內容
# google-chrome http://192.168.4.71/group1/M00/00/00/wKgER1pdQ0iASS_fAAB_2jHRplo601.jpg
# google-chrome http://192.168.4.72/group1/M00/00/00/wKgER1pdQ0iASS_fAAB_2jHRplo601.jpg
在上述實驗的基礎上作相關的調整實現下面的實驗
搭建擴展存儲服務器
實驗拓撲圖:
操做流程:
跟蹤器 (tracker) pc70 192.168.4.70
配置主控服務器
存儲節點 (storage) pc71 192.168.4.71 pc72 192.168.4.72
pc73 192.168.4.73 pc74 192.168.4.74
準備存儲空間
配置存儲節點
搭建nginx web服務器
客戶端 ( client ) 192.168.4.254
上傳文件
下載文件
操做步驟:
使用上述實驗繼續實驗
具體步驟不詳細介紹 只說明與上述文件不一樣之處和注意之處
配置主控跟蹤器服務器 pc70
在以前配置的pc 70 上
修改存儲主機編號文件 storage_ids.conf
# vim /etc/fdfs/storage_ids.conf
100001 group1 192.168.4.71
100002 group1 192.168.4.72
100003 group2 192.168.4.73
100004 group2 192.168.4.74
配置存儲節點 pc73 pc74
1) 準備存儲空間
2) 安裝軟件包
3) 修改配置文件storage.conf
# vim /etc/fdfs/storage.conf //配置文件中只有聲明組與上述不一樣 其於均相同
7 group_name=group2//所屬存儲組
配置Web訪問 pc71 pc72
1) 安裝提供nginx 軟件包
2) 修改配置文件
# vim /etc/fdfs/mod_fastdfs.conf //模版配置文件中只有聲明組與上述不一樣 其於均相同
47 group_name=group1//當前所在存儲組
3) 啓動nginx
啓動服務
1) pc70 須要從新啓動服務
2) 啓動存儲節點 pc71 pc72
[root@pc70 ~]# netstat -utnalp | grep 22122
tcp 0 0 0.0.0.0:22122 0.0.0.0:* LISTEN 4875/fdfs_trackerd
tcp 0 0 192.168.4.70:22122 192.168.4.72:57119 ESTABLISHED 4875/fdfs_trackerd
tcp 0 0 192.168.4.70:22122 192.168.4.71:34335 ESTABLISHED 4875/fdfs_trackerd
tcp 0 0 192.168.4.70:22122 192.168.4.74:45914 ESTABLISHED 4875/fdfs_trackerd
tcp 0 0 192.168.4.70:22122 192.168.4.73:45099 ESTABLISHED 4875/fdfs_trackerd
[root@pc73 ~]# netstat -pantu | grep 23000
tcp 0 0 0.0.0.0:23000 0.0.0.0:* LISTEN 8496/fdfs_storaged
tcp 0 0 192.168.4.73:23000 192.168.4.74:38378 ESTABLISHED 8496/fdfs_storaged
tcp 0 0 192.168.4.73:51322 192.168.4.74:23000 ESTABLISHED 8496/fdfs_storaged
[root@pc74 ~]# netstat -pantu | grep 23000
tcp 0 0 0.0.0.0:23000 0.0.0.0:* LISTEN 7905/fdfs_storaged
tcp 0 0 192.168.4.74:23000 192.168.4.73:51322 ESTABLISHED 7905/fdfs_storaged
tcp 0 0 192.168.4.74:38378 192.168.4.73:23000 ESTABLISHED 7905/fdfs_storaged
客戶端測試
//會發現 group1 和 group2 已經實現輪詢存儲
# fdfs_upload_file /etc/fdfs/client.conf 1.jpg
group1/M00/00/00/wKgER1pdbEaAUfkvAAB_2jHRplo065.jpg
# fdfs_upload_file /etc/fdfs/client.conf 1.jpg
group2/M00/00/00/wKgESVpdbEeANZeWAAB_2jHRplo990.jpg
# fdfs_upload_file /etc/fdfs/client.conf test.jpg
group1/M00/00/00/wKgESFpdbE2AVXMfAAB_2jHRplo700.jpg
# fdfs_upload_file /etc/fdfs/client.conf test.jpg
group2/M00/00/00/wKgESlpdbFCAet_vAAB_2jHRplo946.jpg
//在瀏覽器訪問 就會看見圖片內容
# google-chrome http://192.168.4.71/group1/M00/00/00/wKgER1pdbEaAUfkvAAB_2jHRplo065.jpg
# google-chrome http://192.168.4.74/group2/M00/00/00/wKgESlpdbFCAet_vAAB_2jHRplo946.jpg