FastDFS

什么是分布式文件系统

  • 分布式文件系统解决了海量文件存储及传输访问的瓶颈问题,对海量视频的管理、对海量图片的管理等。
  • 分布式文件系统(Distributed File System)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连。

为什么会有分布文件系统

存在问题

  • 分布式文件系统是面对互联网的需求而产生,互联网时代对海量数据如何存储?
  • 靠简单的增加硬盘的个数已经满足 不了我们的要求,因为硬盘传输速度有限但是数据在急剧增长,
  • 另外我们还要要做好数据备份、数据安全等。

解决办法

  • 采用分布式文件系统可以将多个地点的文件系统通过网络连接起来
  • 组成一个文件系统网络,结点之间通过网络进行通信
  • 一台文件系统的存储和传输能力有限,我们让文件在多台计算机上存储,通过多台计算共同传输

示例图

好处

  • 一台计算机的文件系统处理能力扩充到多台计算机同时处理
  • 一台计算机挂了,还有另外的副本计算机提供数据。
  • 每台计算机可以放在不同的地域,这样用户就可以就近访问,提高访问速度

主流的分布式文件系统

NFS(Network File System),即网络文件系统

  • 在客户端上映射NFS服务器的驱动器
  • 客户端通过网络访问NFS服务器的硬盘完全透明。

结构图

GFS(Google File System)

  • GFS采用主从结构,一个GFS集群由一个master和大量的chunkserver组成
  • master存储了数据文件的元数据,一个文件被分成了若干块存储在多个chunkserver中。
  • 用户从master中获取数据元信息,从chunkserver存储数据

结构图

HDFS(Hadoop Distributed File System)

  • Hadoop分布式文件系统主要用于大数据
  • HDFS采用主从结构,一个HDFS集群由一个名称结点和若干数据结点组成
  • 名称结点存储数据的元信息,一个完整的数据文件分成若干块存储在数据结点。
  • 客户端从名称结点获取数据的元信息及数据分块的信息,得到信息客户端即可从数据块来存取数据。

结构图

什么是fastDFS

简介

为什么要使用fastDFS

通用分布式文件系统

  • NFS、GFS都是通用的分布式文件系统
  • 通用的分布式文件系统的优点的是开发体验好,但是系统复杂 性高、性能一般

专用分布式文件系统

  • 专用的分布式文件系统虽然开发体验性差,但是系统复杂性低并且性能高。
  • fastDFS非常适合存储图片等那些小文件,fastDFS不对文件进行分块,所以它就没有分块合并的开销,fastDFS网络通信采用 socket,通信速度很快

fastDFS工作原理

  • FastDFS架构包括 Tracker server和Storage server。
  • 客户端请求Tracker server进行文件上传、下载,通过Tracker server调度最终由Storage server完成文件上传和下载。

结构图

Tracker

作用
    Tracker Server作用是负载均衡和调度,
    通过Tracker server在文件上传时可以根据一些策略找到Storage server提供文件上传服务。
    可以将tracker称为追踪服务器或调度服务器。
集群
    FastDFS集群中的Tracker server可以有多台
    Tracker server之间是相互平等关系同时提供服务.
    客户端请求Tracker server采用轮询方式,如果请求的tracker无法提供服务则换另一个tracker。 

Storage

作用
    Storage Server作用是文件存储,客户端上传的文件最终存储在Storage服务器上

集群
     Storage集群采用了分组存储方式。storage集群由一个或多个组构成,集群存储总容量为集群中所有组的存储容量之和
    一个组由一台或多台存储服务器组成,组内的Storage server之间是平等关系,
    不同组的Storage server之间不会相互通信
    同组内的Storage server之间会相互连接进行文件同步,从而保证同组内每个storage上的文件是完全一致的
    一个组的存储容量为该组内的存储服务器容量最小的那个
    采用分组存储方式的好处
        灵活、可控性较强。比如上传文件时,可以由客户端直接指定上传到的组也可以由tracker进行调度选择。
        一个分组的存储服务器访问压力较大时,可以在该组增加存储服务器来扩充服务能力(纵向 扩容)
        当系统容量不足时,可以增加组来扩充存储容量(横向扩容)。

Storage状态收集
    Storage server会连接集群中所有的Tracker server,定时向他们报告自己的状态,
    包括磁盘剩余空间、文件同步 状况、文件上传下载次数等统计信息。

FastDFS安装与配置

  • FastDFS是 C 语言开发,建议在 linux 上运行
  • 安装 FastDFS需要先将官网下载的源码进行编译,编译依赖 gcc 环境,如果没有 gcc 环境,需要先安装gcc

1.需要安装 gcc

yum install gcc-c++ 

2.安装libevent(FastDFS依赖libevent库)

yum -y install libevent 

3.安装libfastcommon (由 FastDFS 官方提供,包含了 FastDFS 运行所需要的一些基础库)

将libfastcommonV1.0.7.tar.gz拷贝至/usr/local/下
cd /usr/local/
tar -zxvf libfastcommonV1.0.7.tar.gz
cd libfastcommon-1.0.7
./make.sh
./make.sh install

libfastcommon安装好后会自动将库文件拷贝至/usr/lib64下

4.安装libevent

cd /usr/local/
tar -zxvf libevent-2.0.15-stable.tar.gz
cd libevent-2.0.15-stable/
./configure
make && make install
ln -s /usr/local/lib/libevent-2.0.so.5 /usr/lib/libevent-2.0.so.5

4.安装libevent

cd /usr/local/
tar -zxvf libevent-2.0.15-stable.tar.gz
cd libevent-2.0.15-stable/
./configure
make && make install
ln -s /usr/local/lib/libevent-2.0.so.5 /usr/lib/libevent-2.0.so.5

5.tracker编译安装

将FastDFS_v5.05.tar.gz拷贝至/usr/local/下
tar -zxvf FastDFS_v5.05.tar.gz
cd FastDFS
./make.sh
./make.sh install

安装成功将安装目录下的conf下的文件拷贝到/etc/fdfs/下
cp -ri conf/* /etc/fdfs

进入/etc/fdfs目录
cd /etc/fdfs

修改tracker.conf
vim tracker.conf
base_path=/home/fastdfs
http.server_port=80

创建目录
    mkdir -p /home/fastdfs

启动
    /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart

6.进入/etc/fdfs

cd /etc/fdfs
vi storage.conf
group_name=group1
base_path=/home/yuqing/FastDFS改为:base_path=/home/fastdfs
store_path0=/home/fastdfs/fdfs_storage
#配置tracker服务器:IP如果有多个则配置多个tracker
tracker_server=192.168.1.88:22122
http.server_port=80

mkdir -p /home/fastdfs/fdfs_storage
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart

查看是否启动
ps aux|grep dfs

文件上传流程

流程图

文件信息

客户端上传文件后,存储服务器将文件ID返回给客户端,此文件ID用于以后访问该文件的索引信息。
文件索引信息 包括:组名,虚拟磁盘路径,数据两级目录,文件名

组名:
    文件上传后所在的storage组名称,在文件上传成功后有storage服务器返回,需要客户端自行保存。

虚拟磁盘路径:
    storage配置的虚拟路径,与磁盘选项store_path*对应。如果配置了store_path0则是M00, 如果配置了store_path1则是M01,以此类推。

数据两级目录:
    storage服务器在每个虚拟磁盘路径下创建的两级目录,用于存储数据文件

文件名:
    是由存储服务器根据特定信息生成,文件名包含:源存储服务器IP地址、文件创 建时间戳、文件大小、随机数和文件拓展名等信息

通过客户端上传图片

添加fastdfs依赖

<dependencies>
    <dependency>
        <groupId>org.csource.fastdfs</groupId>
        <artifactId>fastdfs</artifactId>
        <version>1.2</version>
    </dependency>
</dependencies>

在resources当中创建fdfs_client.conf配置文件

# connect timeout in seconds
# default value is 30s
connect_timeout=30

# network timeout in seconds
# default value is 30s
network_timeout=60

# the base path to store log files
base_path=/home/fastdfs

# tracker_server can ocur more than once, and tracker_server format is
#  "host:port", host can be hostname or ip address
tracker_server=192.168.1.88:22122

#standard log level as syslog, case insensitive, value list:
### emerg for emergency
### alert
### crit for critical
### error
### warn for warning
### notice
### info
### debug
log_level=info

# if use connection pool
# default value is false
# since V4.05
use_connection_pool = false

# connections whose the idle time exceeds this time will be closed
# unit: second
# default value is 3600
# since V4.05
connection_pool_max_idle_time = 3600

# if load FastDFS parameters from tracker server
# since V4.05
# default value is false
load_fdfs_parameters_from_tracker=false

# if use storage ID instead of IP address
# same as tracker.conf
# valid only when load_fdfs_parameters_from_tracker is false
# default value is false
# since V4.05
use_storage_id = false

# specify storage ids filename, can use relative or absolute path
# same as tracker.conf
# valid only when load_fdfs_parameters_from_tracker is false
# since V4.05
storage_ids_filename = storage_ids.conf


#HTTP settings
http.tracker_server_port=80

#use "#include" directive to include HTTP other settiongs
##include http.conf

创建测试,上传图片

 public static void main(String[] args) throws Exception {
        //1. 加载配置文件
        ClientGlobal.init("D:\\Java\\testcode\\fastDFSProject\\src\\main\\resources\\fdfs_client.conf");
        //2. 创建管理端对象
        TrackerClient trackerClient = new TrackerClient();
        //3. 通过管理端对象获取连接
        TrackerServer connection = trackerClient.getConnection();
        //4. 创建存储端对象
        StorageClient1 storageClient = new StorageClient1(connection, null);

        //创建文件属性信息对象数组
        NameValuePair[] meta_list = new NameValuePair[3];
        meta_list[0] = new NameValuePair("fileName","idea");
        meta_list[1] = new NameValuePair("ExtName","jpg");
        meta_list[2] = new NameValuePair("zuozhe","gaowei");

        //5. 上传文件
        String path = storageClient.upload_file1("E:\\idea.jpg", "jpg", meta_list);
        System.out.println("======" + path);
    }

搭建图片服务虚拟主机

在Storage上安装nginx

  • 在storage server上安装nginx的目的是对外通过http访问storage server 上的文件
  • 使用 nginx 的模块 FastDFS-nginx-module 的作用是通过 http 方式访问 storage 中的文件

安装FastDFS-nginx-module_v1.16

将 FastDFS-nginx-module_v1.16.tar.gz上到usr/local下
cd /usr/local
tar -zxvf fastdfs-nginx-module_v1.16.tar.gz
rm -rf fastdfs-nginx-module_v1.16.tar.gz
cd fastdfs-nginx-module/src
修改config文件将带有/usr/local/的路径改为/usr/
vi config
esc后保存并退出 :wq

将FastDFS-nginx-module/src下的mod_FastDFS.conf拷贝至/etc/fdfs/下
cp mod_fastdfs.conf /etc/fdfs/

修改mod_fastdfs.conf
vim /etc/fdfs/mod_fastdfs.conf
base_path=/home/fastdfs
tracker_server=192.168.1.88:22122
url_have_group_name=true
store_path0=/home/fastdfs/fdfs_storage
esc后保存并退出 :wq

将libfdfsclient.so拷贝至/usr/lib下
    cp /usr/lib64/libfdfsclient.so /usr/lib/
复制 FastDFS的部分配置文件到/etc/fdfs目录,根据相对应的安装情况进入到相对应的路径
    cd /usr/local/FastDFS/conf/
    cp http.conf mime.types /etc/fdfs/

nginx安装

        将nginx-1.8.1.tar.gz拷贝到/usr/local下

        cd /usr/local

        解压nginx-1.8.1.tar.gz
            tar -zxvf nginx-1.8.1.tar.gz

            rm -rf nginx-1.8.1.tar.gz

        安装依赖包
            sudo yum -y install pcre pcre-devel zlib zlib-devel openssl openssl-devel
        cd nginx-1.8.1/
        执行配置
            ./configure --prefix=/opt/nginx --sbin-path=/usr/bin/nginx --add-module=/usr/local/fastdfs-nginx-module/src
        make
        make install
        useradd -s /sbin/nologin -M nginx
        id nginx

        启动
            nginx

        停止
            nginx -s stop

        重新加载配置
            nginx -s reload

        查看是否启动
            ps -ef|grep nginx

        修改配置文件,添加上
            vim  /opt/nginx/conf/nginx.conf


#监听域名中带有group的,交给FastDFS模块处理
location ~/group([0-9])/ {
    ngx_fastdfs_module;
}

启动

/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart
nginx
01-22 23:12
查看更多