大兵是
一个想全能的运维

FastDFS的原理和部署

FastDFS简介和特性

  • 类似google FS的一个轻量级分布式文件系统,纯C实现,支持linux、FreeBSD等UNIX系统;
  • 只能通过API访问,不支持POXIS;
  • 文件不分块存储,上传的文件和OS文件系统中的文件一一对应;
  • 下载文件支持http协议,可以使用内置web server,配置nginx模块;
  • 文件存储的适合范围:大于4KB,小于500M。

FastDFS架构图


    FastDFS服务端有两个角色:跟踪器(tracker)和存储节点(storage)。

    Tracker Server:跟踪服务器,主要做调度工作,在访问上起到负载均衡的作用。在内存中记录集群中group和storage server的信息,是连接client和storage servery的枢纽。tracker性能是非常高的,二三台tracker就可以管理上百个group。

    Storage Server:存储服务器,文件和文件属性都保存到存储服务器上。

    所有的服务器是对等的,不存在mater-slave的关系,存储服务器采用分组的方式,同组之间文件完全相同,raid1。不同组storage server不会通信,是有storage server主动向tracker server报告状态,tracker server之间不会通信。

上传流程

下载流程


FastDFS服务搭建

一、准备环境

    由于机器有限,我这使用二台服务器做实验,他们既做tracker,也做storage。


[root@nfs1 ~]# cat /etc/redhat-release 
CentOS Linux release 7.2.1511 (Core) 
[root@nfs1 ~]# uname -r
3.10.0-327.el7.x86_64
[root@nfs1 ~]# getenforce 
Disabled
[root@nfs1 ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
#注意:磁盘空间留多一些,不然storage会报错。

二、安装FastDFS

    源码作者在github上有提交的,地址:http://github.com/happyfish100。

安装依赖:

    下面的这些安装是需要在二台服务器操作的。

[root@nfs1 ~]# cd /usr/local/src/
[root@nfs1 ~]# git clone https://github.com/happyfish100/libfastcommon.git
[root@nfs1 ~]# cd libfastcommon/
[root@nfs1 ~]# ./make.sh
[root@nfs1 ~]# ./make.sh install
#make报错需要安装yum install gcc gcc-c++ make -y

安装FastDFS:

    这次使用的版本是5.0.4。

[root@nfs1 ~]# cd /usr/local/src/
[root@nfs1 ~]# wget https://github.com/happyfish100/fastdfs/archive/V5.04.tar.gz
[root@nfs1 ~]# tar xf V5.04.tar.gz 
[root@nfs1 ~]# cd fastdfs-5.04/
[root@nfs1 ~]# ./make.sh 
[root@nfs1 ~]# ./make.sh install

这个版本的坑:

   启动命令中的路径不对。

[root@nfs1 ~]# sed -i 's#/usr/local/bin#/usr/bin#g' /etc/init.d/fdfs_trackerd
[root@nfs1 ~]# sed -i 's#/usr/local/bin#/usr/bin#g' /etc/init.d/fdfs_storaged
#需要将/usr/local/bin修改为/usr/bin

三、配置环境

    tracker配置文件。

[root@nfs1 ~]# cd /etc/fdfs/
[root@nfs1 ~]# cp tracker.conf.sample  tracker.conf
[root@nfs1 ~]# mkdir /data/fdfs/tracker -p
[root@nfs1 ~]# vim tracker.conf
......
22 base_path=/data/fdfs/tracker
......
[root@nfs1 fdfs]# /etc/init.d/fdfs_trackerd start

    storage配置文件。

[root@nfs1 fdfs]# cd /etc/fdfs
[root@nfs1 fdfs]# mkdir /data/fdfs/storage/base -p
[root@nfs1 fdfs]# mkdir /data/fdfs/storage/store -p
[root@nfs1 fdfs]# cp storage.conf.sample storage.conf
[root@nfs1 fdfs]# vim storage.conf
...
 37 base_path=/data/fdfs/storage/base
105 store_path0=/data/fdfs/storage/store
...
114 tracker_server=10.0.0.31:22122
115 tracker_server=10.0.0.32:22122
...
[root@nfs1 fdfs]# /etc/init.d/fdfs_storaged start

    client配置文件。

[root@nfs1 fdfs]# mkdir /data/fdfs/client
[root@nfs1 fdfs]# cp client.conf.sample client.conf
[root@nfs1 fdfs]# vim client.conf
...
 10 base_path=/data/fdfs/client
 14 tracker_server=10.0.0.31:22122
 15 tracker_server=10.0.0.32:22122
...

    好的,配置成功了,参数我在这里不解释了,可参看http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=1941456&extra=page%3D1%26filter%3Ddigest%26digest%3D1

四、使用操作

[root@nfs1 fdfs]# /etc/init.d/fdfs_trackerd status
[root@nfs1 fdfs]# /etc/init.d/fdfs_storaged status
#在操作前我们可以看看这两个服务是不是起来了,如果没有起来,查看日志
[root@nfs1 fdfs]# tailf /data/fdfs/tracker/logs/trackerd.log
[root@nfs1 fdfs]# tailf /data/fdfs/storage/base/logs/storaged.log
##############我是分割线###################
[root@nfs1 fdfs]# fdfs_monitor /etc/fdfs/client.conf
server_count=2, server_index=1

tracker server is 10.0.0.32:22122

group count: 1

Group 1:
group name = group1
disk total space = 28657 MB
disk free space = 26333 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 = 10.0.0.31
		ip_addr = 10.0.0.31 (nfs1)  ACTIVE
...
	Storage 2:
		id = 10.0.0.32
		ip_addr = 10.0.0.32  ACTIVE
#上传文件测试
[root@nfs1 ~]# cd 
[root@nfs1 ~]# fdfs_upload_file /etc/fdfs/client.conf /etc/resolv.conf 
group1/M00/00/00/CgAAH1jexOiAKDWjAAAAMjpGoJk87.conf
#下载文件测试
[root@nfs1 ~]# fdfs_download_file /etc/fdfs/client.conf group1/M00/00/00/CgAAH1jexOiAKDWjAAAAMjpGoJk87.conf
[root@nfs1 ~]# ll
total 8
-rw-------. 1 root root 1240 Mar 11 17:27 anaconda-ks.cfg
-rw-r--r--  1 root root   50 Apr  1 05:07 CgAAH1jexOiAKDWjAAAAMjpGoJk87.conf
[root@nfs1 ~]# cat CgAAH1jexOiAKDWjAAAAMjpGoJk87.conf 
# Generated by NetworkManager
nameserver 10.0.0.2

    分享一些常用的命令。

#可以查看命令帮助
fdfs_upload_file
#上传文件
fdfs_upload_file /etc/fdfs/client.conf file
#下载文件
fdfs_download_file
#查看信息
fdfs_file_info
#删除文件
fdfs_delete_file
#添加追加文件
fdfs_upload_appender /etc/fdfs/client.conf appent.txt 
#追加内容
fdfs_append_file /etc/fdfs/client.conf file_id appent2.txt
#监控状态
fdfs_monitor /etc/fdfs/client.conf
#所有的命令都是需要接上配置文件的。

五、安装PHP模块

    FastDFS是不能挂载的,使用API接口,这里先介绍php的使用方法。

    编译安装php。

#编译安装php5.5.32,不详细说明了
[root@nfs1 ~]# yum install -y pcre pcre-devel openssl openssl-devel
[root@nfs1 ~]# yum install zlib-devel libxml2-devel libjpeg-devel libjpeg-turbo-devel libconv-devel -y
[root@nfs1 ~]# yum install freetype-devel libpng-devel dg-devel libcurl-devel libxslt-devel -y
[root@nfs1 ~]# cd /tools/
[root@nfs1 tools]# rz -E
[root@nfs1 tools]# ll
total 23056
-rw-r--r--  1 root root  4984397 Jan 17 08:55 libiconv-1.14.tar.gz
-rw-r--r--  1 root root   833473 Jan 18 09:51 nginx-1.8.1.tar.gz
-rw-r--r--  1 root root 17773092 Jan 17 08:56 php-5.5.32.tar.gz
[root@nfs1 tools]# tar xf libiconv-1.14.tar.gz 
[root@nfs1 tools]# cd libiconv-1.14/
[root@nfs1 libiconv-1.14]# ll
[root@nfs1 libiconv-1.14]# ./configure --prefix=/usr/local/libconv
[root@nfs1 libiconv-1.14]# cd ..
[root@nfs1 tools]#  yum install libmcrypt-devel -y
[root@nfs1 tools]#  yum install mhash -y
[root@nfs1 ~]# yum install mcrypt -y
[root@nfs1 tools]# taf xf php-5.5.32.tar.gz
[root@nfs1 tools]# useradd -M -s /sbin/nologin www
[root@nfs1 tools]# cd php-5.5.32/
[root@nfs1 php-5.5.32]# ./configure --prefix=/usr/local/php-5.5.32 --with-mysql=mysqlnd --with-pdo-mysql=mysqlnd --with-iconv-dir=/usr/local/libiconv --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --disable-rpath --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --enable-mbregex --enable-fpm --enable-mbstring --with-mcrypt --with-gd --enable-gd-native-ttf --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-xmlrpc --enable-soap --enable-short-tags --enable-static --with-xsl --with-fpm-user=www --with-fpm-group=www --enable-ftp --enable-opcache=no
[root@nfs1 php-5.5.32]# make && make install

[root@nfs1 php-5.5.32]#ln -s /usr/local/php-5.5.32/ /usr/local/php
[root@nfs1 php-5.5.32]# cp php.ini-production /usr/local/php/lib/php.ini

[root@nfs1 php-5.5.32]# cd /usr/local/php/etc/
[root@nfs1 etc]# cp php-fpm.conf.default php-fpm.conf

    增加fastdfs模块。

[root@nfs1 src]# cd /usr/local/src/fastdfs-5.04/php_client/
[root@nfs1 php_client]# /usr/local/php/bin/phpize
[root@nfs1 php_client]# ./configure --with-php-config=/usr/local/php/bin/php-config
[root@nfs1 php_client]# make && make install
[root@nfs1 php_client]# cat fastdfs_client.ini >>/usr/local/php/lib/php.ini #追加配置到php的配置文件,如果你不知道PHP的配置放在哪里了,下面那句命令可以帮助你。
#/usr/local/php/bin/php -i|grep php.ini

    测试。

[root@nfs1 php_client]# /usr/local/php/bin/php fastdfs_test.php #会执行一系列的操作,增删改查,可测试你搭建环境是否成功
fastdfs_tracker_make_all_connections result: 1
...
tracker_close_all_connections result: 1
[root@nfs1 php_client]# vim fastdfs_test.php 
<?php
 $group_name = "group1";
 $remote_filename = "M00/28/E3/U6Q-CkrMFUgAAAAAAAAIEBucRWc5452.h";
 $file_id = $group_name . FDFS_FILE_ID_SEPERATOR . $remote_filename;

 echo fastdfs_client_version() . "\n";
...
#这里面是php的模块,开发涉及,运维止步。

六、java模块

    同时,也有使用java程序的,现在我们来增加java模块。

[root@nfs1 ~]# cd /usr/local/src/
[root@nfs1 src]# git clone https://github.com/happyfish100/fastdfs-client-java.git
[root@nfs1 src]# cd fastdfs-client-java/src/
[root@nfs1 src]# yum install ant -y #部署java程序的
[root@nfs1 src]# ant
Buildfile: /usr/local/src/fastdfs-client-java/src/build.xml

init:

compile:
    [javac] /usr/local/src/fastdfs-client-java/src/build.xml:30: warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds

jar:

BUILD SUCCESSFUL
Total time: 0 seconds
#测试
[root@nfs1 src]# java -cp /usr/local/src/fastdfs-client-java/src/build/fastdfs_client.jar org.csource.fastdfs.test.TestClient /etc/fdfs/client.conf /etc/host
java.version=1.8.0_121
network_timeout=60000ms
charset=ISO8859-1
file length: 14
store storage servers count: 2
1. 10.0.0.31:23000
2. 10.0.0.32:23000
...

七、Nginx模块

    我们在使用FastDFS部署一个分布式文件系统的时候,通过FastDFS的客户端API来进行文件的上传、下载、删除等操作。同时通过FastDFS的HTTP服务器来提供HTTP服务。但是FastDFS的HTTP服务较为简单,无法提供负载均衡等高性能的服务,所以FastDFS的开发者为我们提供了Nginx上使用的FastDFS模块(也可以叫FastDFS的Nginx模块),其使用非常简单。
    FastDFS通过Tracker服务器,将文件放在Storage服务器存储,但是同组之间的服务器需要复制文件,有延迟的问题.假设Tracker服务器将文件上传到了10.0.0.31,文件ID已经返回客户端,这时,后台会将这个文件复制到10.0.0.32,如果复制没有完成,客户端就用这个ID在10.0.0.32取文件,肯定会出现错误。这个fastdfs-nginx-module可以重定向连接到源服务器取文件,避免客户端由于复制延迟的问题,出现错误。

#下载fastdfs-nginx-modul
[root@nfs1 ~]# cd /usr/local/src/
[root@nfs1 ~]# git clone https://github.com/happyfish100/fastdfs-nginx-module.git
#安装Nginx
[root@nfs1 ~]# yum install -y pcre pcre-devel openssl openssl-devel
[root@nfs1 tools]# cd /tools/
[root@nfs1 tools]# tar xf nginx-1.8.1.tar.gz  
[root@nfs1 tools]# cd nginx-1.8.1/
[root@nfs1 nginx-1.8.1]#  useradd -M -s /sbin/nologin www #没有用户的添加
[root@nfs1 nginx-1.8.1]#  ./configure --prefix=/usr/local/nginx-1.8.1 --user=www --group=www --with-http_ssl_module --add-module=/usr/local/src/fastdfs-nginx-module/src/
[root@nfs1 nginx-1.8.1]#  make && make install
#复制配置文件
[root@nfs1 nginx-1.8.1]# cd /usr/local/src/fastdfs-nginx-module/src
[root@nfs1 src]# cp mod_fastdfs.conf /etc/fdfs/
[root@nfs1 src]# cd /usr/local/src/fastdfs-5.04/conf/
[root@nfs1 conf]# cp anti-steal.jpg http.conf mime.types /etc/fdfs/
#日志文件
[root@nfs1 ~]# touch /var/log/mod_fastdfs.log
[root@nfs1 ~]# chown www.www /var/log/mod_fastdfs.log
[root@nfs1 ~]# cd /usr/local/nginx/conf/
[root@nfs1 conf]# egrep -v "#|^$" nginx.conf.default >nginx.conf
[root@nfs1 conf]# vim nginx.conf
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  10.0.0.31;
        location /group1/M00 {
                root /data/fdfs/storage/store/;
                ngx_fastdfs_module;
        }
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}
[root@nfs1 conf]# /usr/local/nginx/sbin/nginx -t
ngx_http_fastdfs_set pid=127697
[root@nfs1 conf]# vim /etc/fdfs/mod_fastdfs.conf
 40 tracker_server=10.0.0.31:22122
 41 tracker_server=10.0.0.32:22122
 54 url_have_group_name = true
 63 store_path0=/data/fdfs/storage/store/
 79 log_filename=/var/log/mod_fastdfs.log
#重启Nginx
[root@nfs1 fdfs]# /usr/local/nginx/sbin/nginx -s stop
ngx_http_fastdfs_set pid=127854
[root@nfs1 fdfs]# /usr/local/nginx/sbin/nginx
ngx_http_fastdfs_set pid=127855

打赏

未经允许不得转载: » FastDFS的原理和部署

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)