FastDFS分布式文件系统

一、FastDFS介绍

1、FastDFS是什么?

百度:FastDFS是一个用c语言编写的开源分布式文件系统,对文件进行管理,功能包括:文件存储,文件同步,文件访问(上传,下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站,视频网站等等。

个人理解:一个可以管理文件很多操作的东西,考虑负载均衡,冗余备份等机制。

2、FastDFS架构

FastDFS服务端有两个角色:

跟踪器(tracker):主要做调度工作,在访问上起负载均衡的作用,通过Tracker server在文件上传时可以根据一些策略找到Storage server提供文件上传服务。

存储结点(storage):存储文件,完成文件管理的所有功能:存储,同步和提供存取接口,客户端上传的文件最终存储在Storage服务器上。

3、Tracker集群和Storage集群

Tracker集群:FastDFS集群中的Tracker server可以有多台,Tracker server之间是相互平等关系同时提供服务,Tracker server不存在单点故障。客户端请求Tracker server采用轮询方式,如果请求的Tracker无法提供服务则换另一个Tracker。

Storage集群:Storage集群采用了分组存储方式,Storage集群由一个或多个组构成,集群存储总容量为集群中所有组的存储容量之和。一个组由一台或多台存储服务器组成,组内Storage server之间是平等关系,不同组的Storage server之间不会相互通信,同组内的Storage server之间会相互连接进行文件同步,从而保证同组内每个Storage上的文件完全一致,所以一个组的存储容量是组内存储服务器容量最小的那个。

4、文件上传、下载流程

(注:Storage会定时向Tracker server报告自己的状态)

文件上传:

1、client询问tracker上传文件到Storage

2、tracker返回一台可用的Storage

3、client直接与Storage通信,上传文件后Storage返回文件ID

文件下载:

1、client询问tracker可以下载文件的Storage,参数为文件ID

2、tracker返回一台可用Storage

3、client与Storage直接通信,完成文件下载

二、FastDFS服务器搭建

注:本文中的所有IP均需要修改为自己的IP

1、安装libfastcommon

  • libfastcommon使用c语言编写的,所以要安装gcc编译器 
yum -y install gcc-c++
  • 安装FastDFS依赖libevent库 
yum -y install libevent    
  • 下载 libfastcommon-1.0.7.tar.gz
wget https://codeload.github.com/happyfish100/libfastcommon/tar.gz/V1.0.7 -O libfastcommon-1.0.7.tar.gz
  • 在/usr/local/目录下新建libfastcommon文件夹,将V1.0.7复制进去,执行以下命令
cd /usr/local/libfastcommon
将V1.0.7压缩文件提取出来
cd libfastcommon-1.0.7
./make.sh
./make.sh install
cp /usr/lib64/libfastcommon.so /usr/lib/

2、安装FastDFS

  • 下载:https://sourceforge.net/projects/fastdfs/  这里选择的是FastDFS_v5.05.tar.gz版本,执行以下操作
在/usr/local/下新建fastdfs文件夹
tar -zxvf fastdfs-5.05.tar.gz
cd fastdfs-5.05
./make.sh
./make.sh install
  • 进入/etc/fdfs目录下,可以看到fdfs的配置文件,即三个以conf.sample结尾的文件,去掉后缀.sample,生成另外三个.conf文件,此时可删除.conf.sample的三个文件,仅留下.conf的三个文件
cp client.conf.sample client.conf
cp storage.conf.sample storage.conf
cp tracker.conf.sample tracker.conf

3、配置Tracker

  • 新建文件夹用于存储Tracker的数据文件和日志文件等
mkdir /home/260198/fastdfs
  • 到/etc/fdfs文件夹下找到tracker.conf文件,打开并编辑

 需要修改的信息

base_path=/home/260198/fastdfs  #设置tracker数据文件和日志文件存储位置

  需要注意的信息

# is this config file disabled
# false for enabled
# true for disabled
disabled=false   #启用配置文件

# the tracker server port
port=22122 #tracker默认端口号,可修改,一般使用默认即可

# HTTP port on this tracker server
http.server_port=8080 #设置http端口号,默认为8080

  • 由于在/usr/local/bin中没有fdfs_tackerd等命令,所以创建以下软连接
ln -s /usr/bin/fdfs_trackerd /usr/local/bin
ln -s /usr/bin/restart /usr/local/bin
ln -s /usr/bin/stop /usr/local/bin
  • 最后启动tracker server
service fdfs_trackerd start 
  • 启动成功后在/home/260198/fastdfs文件夹下会生成logs和data两个文件夹,在logs文件夹下找到trackerd.log可以查看tracker日志
  • 启动成功后可以查看下端口监听情况,下图可看到22122端口正常被监听
netstat -unltp|grep fdfs

  • 若确认tracker可以正常启动,则可以设置开机启动(选操作),在/etc/rc.d/rc.local加入以下配置
service fdfs_trackerd start

4、配置Storage

  • 新建两个文件夹
mkdir /home/260198/fastdfs_storage /*存放storage服务器的文件*/
mkdir /home/260198/fastdfs_storage_data/ /*存放上传文件*/
  • 修改Storage的配置文件   进入/etc/fdfs/找到Storage.conf文件,打开并编辑

需要修改的信息

base_path=/home/260198/fastdfs_storage  #存放storage数据与日志文件
store_path0=/home/260198/fast_storage_data  #存放上传实际文件的路径
tracker_server=192.168.96.23:22122    #设置tracker服务器的IP地址和端口号 单机情况下设置ip地址为自己主机IP

需要了解的信息

# the storage server port
port=23000 #设置端口号,同一组的端口号必须一直,默认为23000

# path(disk or mount point) count, default value is 1
store_path_count=1  #存储路径个数

# the port of the web server on this storage server
http.server_port=8888  #设置http端口号
  • 同样创建软连接
ln -s /usr/bin/fdfs_storaged /usr/local/bin
  • 启动Storage服务
service fdfs_storaged start
  • 若启动成功可在/home/260198/fastdfs_storage目录下查看日志,在/home/260198/fastdfs_storage_data下查看上传文件要存放的空间,如下图
FastDFS分布式文件系统_第1张图片
  • 查看tracker和storage端口是否被正常监听,如下图即正常监听
netstat -unltp|grep fdfs

  • 最后查看tracker和storage是否整合成功 【查看与自己配置的信息是否一致】
/usr/bin/fdfs_monitor /etc/fdfs/storage.conf
  • (选操作)将Storage设置开机启动  在/etc/rc.d/rc.local写入
service fdfs_storaged start

5、测试上传文件、下载文件

  • 配置client.conf文件(在/etc/fdfs/目录下)

修改内容

base_path=/home/260198/fastdfs  #存放日志等文件
tracker_server=192.168.96.23:22122    #配置tracker服务器 单机情况下将IP地址设置为主机IP
http.tracker_server_port=8080 #必须与tracker的设置相对应
  • 模拟上传文件【比如上传/home/260198/文档/ahaha.txt文件 内容为:apple】
/usr/bin/fdfs_upload_file /etc/fdfs/client.conf /home/260198/文档/ahaha.txt

上传之后会返回一个文件的标示即文件ID:group1/M00/00/00/rByj41sHv0-AcQ-xAAAAB7eOXhE394.txt

在/home/260198/fastdfs_storage_data/data/00/00/目录下可以找到上传的文件
  • 模拟下载文件    下载文件时需要传参:标记红色即文件ID
/usr/bin/fdfs_download_file /etc/fdfs/client.conf group1/M00/00/00/rByj41sHv0-AcQ-xAAAAB7eOXhE394.txt

下载之后的文件一般在根目录下可以找到

6、安装nginx

  • 安装
sudo yum -y install nginx
  • 配置nginx   在/etc/nginx文件夹下找到nginx.conf文件  打开并编辑
1、修改user 为自己的用户名
2、error_log /var/log/nginx/error.log;
    access_log  /var/log/nginx/access.log  main; #可改为自定义路径
3、加入以下代码
server {
    listen       8080;
        location /group/M00/ {
            alias /home/260198/fast_storage_data/data/;
     }
    }

注意:在使用root时可能会找不到文件,建议使用alias

  • 测试是否成功
FastDFS分布式文件系统_第2张图片
  • 浏览器中输入:http://192.168.96.23:8080/group/M00/00/00/rByj41sHv0-AcQ-xAAAAB7eOXhE394.txt即可查看

三、简单java代码实现

  • 在pom.xml文件中添加所需要的依赖

        
            cn.bestwu
            fastdfs-client-java
            1.27
        
        
            org.testng
            testng
            RELEASE
        
        
            commons-io
            commons-io
            2.6
        
    
  • 在resource文件夹下新建fdfsclient.conf文件,存储配置信息
connect_timeout = 2
network_timeout = 30
charset = UTF-8
# Tracker配置文件中配置的http端口
http.tracker_http_port = 8080
http.anti_steal_token = no
http.secret_key = FastDFS1234567890
# Tracker服务器地址
tracker_server = 192.168.96.23:22122
#tracker_server =192.168.105.134:22122
#location /file/ {
#  alias /usr/share/file/;
#   add_header Content-disposition "shy";
#}
/*上传文件*/
    public String upload(String local_url){
        String index="";
        try{
            /*获取连接*/
            ClientGlobal.init("fdfs_client.conf");
            trackerClient=new TrackerClient();
            trackerServer=trackerClient.getConnection();
            storageClient=new StorageClient1(trackerServer,storageServer);
            /*可设置上传文件属性。log即后缀*/
            index=storageClient.upload_file1(local_url,"log",null);
        }catch (IOException e){
            e.printStackTrace();
        }catch (MyException e){
            e.printStackTrace();
        }finally {
            /*返回上传文件的ID*/
            return index;
        }
    }
/*文件下载*/
    public void download(String fileid){
        try {
            /*获取连接*/
            ClientGlobal.init("fdfs_client.conf");
            trackerClient=new TrackerClient();
            trackerServer=trackerClient.getConnection();
            storageClient = new StorageClient1(trackerServer, storageServer);
            // 根据文件ID下载文件
            byte[] by = storageClient.download_file1(fileid);
            // 将数据写入aaa.txt文件中
            IOUtils.write(by, new FileOutputStream("/home/260198/aaa.txt"));
        } catch (IOException e) {
            e.printStackTrace();
        } catch (MyException e) {
            e.printStackTrace();
        }
    }

四、遇到过的问题

1、/var/run/yum.id 已被锁定,PID为###的另一个程序正在进行

   解决:rm -f /var/run/yum.pid

2、进程被占用

 解决:kill -9 ###  (强制杀死###进程)

3、tracker服务启动不了

firewall-cmd --state  #查看防火墙状态
systemctl stop firewalld.service #关闭防火墙

4、启动Storage,无法连接到tracker服务器

1、检查storage连接tracker的ip地址是否正确
2、检查是否启动tracker
3、检查进程是否被占用
注:每次修改配置文件后需要重启服务

5、使用浏览器找不到文件【404 错误】

可能原因
1、修改user为本机用户
2、修改添加server为
server {
    listen      8080;
        location ~/M00 {
            alias /home/260198/fastdfs_storage_data/data;
     }
    }

6、使用浏览器禁止访问文件【403错误】

将文件设置为仅读模式 例:chmod 444 timg.jpg
c compiler cc is not found

c compiler cc is not fou

你可能感兴趣的:(FastDFS分布式文件系统)