FastDFS架構簡介 FastDFS是一款開源的、分散式文件系統(Distributed File System),由淘寶開發平臺部資深架構師餘慶開發。FastDFS 是包括一組 Tracker Server 和 Storage Server 的。Tracker Server 與 Storage ...
FastDFS架構簡介
FastDFS是一款開源的、分散式文件系統(Distributed File System),由淘寶開發平臺部資深架構師餘慶開發。FastDFS 是包括一組 Tracker Server 和 Storage Server 的。Tracker Server 與 Storage Server 之間不直接通信,其基本的信息由配置文件在系統啟動載入時獲知。多台 Tracker Server 之間保證了 Tracker 的分散式,Tracker Server 之間是對等的,防止了單點故障。 Storage Server 是分成多個 Group,每個 Group 中的Storage 都是互相備份的,也就是說,如果 Group1 有 Storage1、Storage2、Storage3,其容量分別是100GB、100GB、100GB,那麼 Group1 的存儲能力是 100GB,而不是 300GB,這就是互相備份的意思。進一步說,整個 Group 的存儲能力由該組中該儲能力最小的 Storage 決定。多個 Group 之間的存儲方式,可以採用 round robin(輪訓)、load balanced(負載均衡)或指定 Group 的方式。另一點相對於MS(Master-Slave)模式的優勢,就是 Tracker Server 與 Master 是決然不同的,不僅 master 有上面可能提到的單點故障問題,而且 client 與 master 之間可能會出現瓶頸。但 FastDFS 架構中,Tracker Server 不會稱為系統瓶頸,數據最終是與一個 available 的 Storage Server 進行傳輸的。
上傳流程
我們可以通過 FastDFS 對文件的上傳過程,來初步瞭解 FastDFS 的基本架構。首先客戶端 client 發起對 FastDFS 的文件傳輸動作,是通過連接到某一臺 Tracker Server 的指定埠來實現的,Tracker Server 根據目前已掌握的信息,來決定選擇哪一臺 Storage Server ,然後將這個Storage Server 的地址等信息返回給 client,然後 client 再通過這些信息連接到這台 Storage Server,將要上傳的文件傳送到給 Storage Server上。
總結
簡單總結一下,FastDFS的特點包括(1)高可靠性:無單點故障;(2)高吞吐量:只要 Group 足夠多,數據流量是足夠分散的。
FastDFS部署:
1、機器分佈
Tracker 192.168.100.106:22122 CentOS
Group1-Storage1 192.168.100.106:23001 CentOS
Group1-Storage1 192.168.100.125:23001 CentOS
2、需要到的軟體和版本(軟體存放位置:/root/soft)
說明:nginx主要實現負載均衡、緩存等功能
3、創建相關文件夾
配置tracker所需的base_path: /opt/fastdfs_tracker
配置storage所需的日誌目錄:fastdfs_storage_info。備註:存儲storage之間同步文件等日誌的
配置storage所需的存儲文件目錄: /opt/fastdfs_storage_data。備註: 這個目錄是用來存儲文件的
以上三個文件將在後續的tracker.conf和storage.conf、mod_fastdfs.conf中用到
4、安裝libfastcommon-1.0.7.zip (註意:先檢查是否安裝unzip、zip、gcc、perl等)
unzip libfastcommon-1.0.7.zip
cd libfastcommon-1.0.7
sh make.sh && sh make.sh install
perl安裝:
wget http://www.cpan.org/src/5.0/perl-5.20.2.tar.gz
tar zxvf perl-5.20.2.tar.gz
mkdir /usr/local/perl
./Configure -des -Dprefix=/usr/local/perl -Dusethreads -Uversiononly
make
make install
perl -version
註意:上述安裝路徑在/usr/lib64/,FastDFS主程式設置lib目錄是/usr/local/lib,創建軟連接如下:
ln -s /usr/lib64/libfastcommon.so /usr/local/lib/libfastcommon.so
ln -s /usr/lib64/libfastcommon.so /usr/lib/libfastcommon.so
ln -s /usr/lib64/libfdfsclient.so /usr/local/lib/libfdfsclient.so
ln -s /usr/lib64/libfdfsclient.so /usr/lib/libfdfsclient.so
5、安裝fastdfs-5.05.tar.gz:
tar -zxvf fastdfs-5.05.tar.gz
cd fastdfs-5.05
./make.sh && ./make.sh install
進入/etc/fdfs這個目錄,如果有配置文件存在,則安裝成功
以上步驟在tracker和storage機器上都需要執行
6、配置tracker (192.168.100.106)
進入/etc/fdfs文件夾,執行命令: cp tracker.conf.sample tracker.conf。
編輯tracker.conf,執行命令: vi tracker.conf ,配置成如下:
disabled=false #false代表開啟配置文件
bind_addr= #空代表所有host,也可以指定host
port=22122 #tracker預設開啟的埠號
connect_timeout=30 #連接超時時間
network_timeout=60 #網路超時時間
base_path=/opt/fastdfs_tracker #存放store的數據和日誌文件
max_connections=256 #允許最大連接數
accept_threads=1 #允許的線程數
work_threads=4 #工作線程數,必須小於等於max_connections
store_lookup=2 #選擇上傳文件方式0:輪詢,1:指定組,2:負載均衡
store_group=group1 #上傳到組group1
store_server=0 #上傳到storage,0:輪詢,1:IP順序,2:伺服器順序
store_path=0 #上傳文件到哪個路徑0:輪詢,2:負載均衡
download_server=0 #指定下載伺服器0:輪詢,1:使用源伺服器
reserved_storage_space = 10% #保留的存儲空間
log_level=info #日誌等級
run_by_group= #選擇用戶組,空代表當前用戶組
run_by_user= #選擇用戶,空代表當前用戶
allow_hosts=* #允許訪問的IP,*代表全部
sync_log_buff_interval = 10 #同步日誌buff到磁碟的間隔時間
check_active_interval = 120 #檢查storage狀態間隔時間
thread_stack_size = 64KB #線程的堆棧大小,必須大於等於64KB
storage_ip_changed_auto_adjust = true #storageIP改變是自動調整
storage_sync_file_max_delay = 86400 #同步文件的最大延遲
storage_sync_file_max_time = 300 #同步文件的最大時間
use_trunk_file = false #是否使用中繼文件存儲小文件
slot_min_size = 256 #存儲文件的最小單位,必須大於等於4KB
slot_max_size = 16MB #存儲文件的最大單位,必須大於slot_min_size
trunk_file_size = 64MB #中繼文件的大小,必須大於等於4MB
trunk_create_file_advance = false #是否允許創建中繼文件超前
trunk_create_file_time_base = 02:00 #創建trunk文件的時間基準
trunk_create_file_interval = 86400 #創建trunk文件的時間間隔
trunk_create_file_space_threshold = 20G
trunk_init_check_occupying = false
trunk_init_reload_from_binlog = false
trunk_compress_binlog_min_interval = 0
use_storage_id = false
storage_ids_filename = storage_ids.conf
id_type_in_filename = ip
store_slave_file_use_link = false
rotate_error_log = false
error_log_rotate_time=00:00
rotate_error_log_size = 0
log_file_keep_days = 0
use_connection_pool = false
connection_pool_max_idle_time = 3600
http.server_port=8080
http.check_alive_interval=30
http.check_alive_type=tcp
http.check_alive_uri=/status.htm
配置文件詳細註解參考:
http://blog.csdn.net/xingjiarong/article/details/50752586
啟動tracker: /usr/local/bin/fdfs_trackerd /etc/fdfs/tracker.conf start (start\stop\restart)
檢測是否啟動成功:netstat -lntup|grep fdfs_trackerd
設置開機啟動:
echo "/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf start" >> /etc/rc.d/rc.local
7、配置storage (192.168.100.106\192.168.100.125)
進入/etc/fdfs文件夾,執行命令: cp storage.conf.sample storage.conf
編輯storage.conf,執行命令: vi storage.conf ,配置成如下:
disabled=false
group_name=group1
bind_addr=
client_bind=true
port=23001
connect_timeout=30
network_timeout=60
heart_beat_interval=30
stat_report_interval=60
base_path=/opt/fastdfs_storage_info
max_connections=256
buff_size = 256KB
accept_threads=1
work_threads=4
disk_rw_separated = true
disk_reader_threads = 1
disk_writer_threads = 1
sync_wait_msec=50
sync_interval=0
sync_start_time=00:00
sync_end_time=23:59
write_mark_file_freq=500
store_path_count=1
store_path0=/opt/fastdfs_storage_data
subdir_count_per_path=256
tracker_server=192.168.100.106:22122
log_level=info
run_by_group=
run_by_user=
allow_hosts=*
file_distribute_path_mode=0
file_distribute_rotate_count=100
fsync_after_written_bytes=0
sync_log_buff_interval=10
sync_binlog_buff_interval=10
sync_stat_file_interval=300
thread_stack_size=512KB
upload_priority=10
if_alias_prefix=
check_file_duplicate=0
file_signature_method=hash
key_namespace=FastDFS
keep_alive=0
use_access_log = false
rotate_access_log = false
access_log_rotate_time=00:00
rotate_error_log = false
error_log_rotate_time=00:00
rotate_access_log_size = 0
rotate_error_log_size = 0
log_file_keep_days = 0
file_sync_skip_invalid_record=false
use_connection_pool = false
connection_pool_max_idle_time = 3600
http.domain_name=
http.server_port=8888
配置文件詳細註解參考:
http://blog.csdn.net/xingjiarong/article/details/50752586
啟動storage: /usr/local/bin/fdfs_storage /etc/fdfs/storage.conf start
檢測是否啟動成功:netstat -lntup|grep fdfs_storaged
檢測啟動狀態:/usr/bin/fdfs_monitor /etc/fdfs/storage.conf
查看192.168.100.106:23001 是ACTIVE狀態即可
設置開機自動啟動:
echo "/usr/bin/fdfs_trackerd /etc/fdfs/storage.conf start" >> /etc/rc.d/rc.local
8、安裝nginx
storage中安裝nginx,主要是為了為提供http的訪問服務,同時解決group中storage伺服器的同步延遲問題。而tracker中安裝nginx,主要是為了提供http訪問的反向代理、負載均衡以及緩存服務
yum install -y gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel
a、在storage中安裝nginx (192.168.100.106\192.168.100.125)
tar -zxvf nginx1.7.8.tar.gz
tar -zxvf fastdfs-nginx-module_v1.16.tar.gz
cd /root/soft/fastdfs-nginx-module/src
編輯config文件,找到包含CORE_INCS這個一行,將路徑中local全部去掉,變為CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"
cd nginx1.7.8
--prefix=/opt/nginx --add-module=/root/soft/fastdfs-nginx-module/src
make && make install
編輯nginx.conf文件如下:
將http.conf和mime.types拷貝到/etc/fdfs/下,如果不執行這一步,啟動nginx時會報錯。
cp /root/soft/fastdfs-5.05/conf/http.conf /etc/fdfs/
cp /root/soft/fastdfs-5.05/conf/mime.conf /etc/fdfs/
將mod_fastdfs.conf這個文件拷貝到 /etc/fdfs 目錄下
cp /root/soft/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/
編輯mod_fastdfs.conf 文件如下:
connect_timeout=2
network_timeout=30
base_path=/opt/fastdfs_storage_info
load_fdfs_parameters_from_tracker=true
storage_sync_file_max_delay = 86400
use_storage_id = false
storage_ids_filename = storage_ids.conf
tracker_server=192.168.100.106:22122
storage_server_port=23001
group_name=group1
url_have_group_name = true
store_path_count=1
store_path0=/opt/fastdfs_storage_data
log_level=info
log_filename=
response_mode=proxy
if_alias_prefix=
flv_support = true
flv_extension = flv
group_count = 1
[group1]
group_name=group1
storage_server_port=23001
store_path_count=1
store_path0=/opt/fastdfs_storage_data
store_path1=/opt/fastdfs_storage_data
配置文件詳細註解參考:
http://blog.csdn.net/xingjiarong/article/details/50752586
建立軟連接:
ln -s /opt/fastdfs_storage_data/data /opt/fastdfs_storage_data/data/M00
啟動nginx: /opt/nginx/sbin/nginx
b、在tracker中安裝nginx
tar -zxvf nginx1.7.8.tar.gz
tar -zxvf fastdfs-nginx-module_v1.16.tar.gz
cd /root/soft/fastdfs-nginx-module/src
編輯config文件,找到包含CORE_INCS這個一行,將路徑中local全部去掉,變為CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"
cd nginx1.7.8
--prefix=/opt/nginx --add-module=/root/soft/fastdfs-nginx-module/src --add-module=/root/soft/ngx_cache_purge-2.1 --with-http_ssl_module --with-pcre=/root/soft/pcre-8.40 --with-zlib=/root/soft/zlib-1.2.11
make && make install
編輯nginx.conf文件如下:
啟動nginx:/opt/nginx/sbin/nginx
9、測試並上傳文件
編輯client.conf 文件,編輯內容如下:
測試上傳文件:
echo "this is a test file -- hello world" >> test.txt
/usr/bin/fdfs_test /etc/fdfs/client.conf upload test.txt #上傳
生成如下url,並複製到瀏覽器訪問
以上測試說明成功,並且兩台stroage同步成功了
測試負載均衡辦法:停掉192.168.100.125或者192.168.100.106的storage再進行上傳測試
/usr/local/bin/fdfs_storage /etc/fdfs/storage.conf stop
10、PHP安裝FasfDFS擴展模塊
cd /root/soft/fastdfs-5.05/client
make && make install
cd /root/soft/fastdfs-5.05/php_client
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make && make install
cd /etc/fdfs
vi client.conf
tracker_server=192.168.100.106:22122 //根據環境填寫IP地址及埠號
在php.ini配置文件中載入fastdfs
cat fastdfs_client.ini >> /usr/local/php/etc/php.ini
新增nginx配置如下:
server {
listen 8080;
server_name localhost;
access_log /data/wwwlogs/access_nginx_cms.log combined;
root /opt/nginx/html;
index index.html index.htm index.php forum.php;
location /nginx_status {
access_log off;
allow 127.0.0.1;
deny all;
}
error_page 404 /404.html;
location ~ [^/]\.php(/|$) {
fastcgi_pass 192.168.100.106:9000;
fastcgi_index index.php;
include /usr/local/nginx/conf/fastcgi_params;
include fastcgi.conf;
}
location \(gif|jpg|jpeg|png|bmp|swf|flv|ico)$ {
expires 30d;
access_log off;
}
location \(js|css)?$ {
expires 7d;
access_log off;
}
}
重啟nginx和php
/opt/nginx/sbin/nginx -s reload
或者
pkill -9 nginx
/opt/nginx/sbin/nginx
kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid`
或者
pkill -9 php
/usr/local/php/sbin/php-fpm
測試:在瀏覽器中輸入:http://192.168.100.106:8080/fastdfs_test.php
如果出現類似於以下截圖則表示成功