fastDSF介绍
FastDFS是用c语言编写的一款开源的分布式文件系统,它是由淘宝资深架构师余庆编写并开源。FastDFS专为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。
为什么要使用fastDFS呢?
上边介绍的NFS、GFS都是通用的分布式文件系统,通用的分布式文件系统的优点的是开发体验好,但是系统复杂性高、性能一般,而专用的分布式文件系统虽然开发体验性差,但是系统复杂性低并且性能高。fastDFS非常适合存储图片等那些小文件,fastDFS不对文件进行分块,所以它就没有分块合并的开销,fastDFS网络通信采用socket,通信速度很快。
fastDSF架构
FastDFS架构包括 Tracker server追踪服务器和Storage server存储服务器。客户端请求Tracker server进行文件上传、下载,通过Tracker server调度最终由Storage server完成文件上传和下载。
Storage server会连接集群中所有的Tracker server,定时向他们报告自己的状态,包括磁盘剩余空间、文件同步状况、文件上传下载次数等统计信息。
文件上传流程
文件下载流程
1 FastDFS 安装
FastDFS是C语言开发,建议在linux上运行,本教程使用CentOS7作为安装环境。
1.1 安装 VMware 虚拟机
安装 CentOS7 虚拟机。
1.2 FastDFS–tracker 安装
分别在 192.168.101.3 和 192.168.101.4 上安装 tracker。
注:初次安装可只安装一台 tracker,快速体验。
1.2.1 下载
tracker 和 storage 使用相同的安装包,下载地址:
https://github.com/happyfish100/FastDFS
本教程下载:FastDFS_v5.05.tar.gz
1.2.2 FastDFS 安装环境
FastDFS 是 C 语言开发,建议在 linux 上运行,本教程使用 Centos7 作为安
装环境。
安装 FastDFS 需要先将官网下载的源码进行编译,编译依赖 gcc 环境,如果
没有 gcc 环境,需要安装 gcc:yum install gcc-c++
1.2.3 安装 libevent
FastDFS 依赖 libevent 库,需要安装:
yum -y install libevent
1.2.4 安装 libfastcommon
libfastcommon 是 FastDFS 官方提供的,libfastcommon 包含了 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 下,由于 FastDFS 程
序引用 usr/lib 目录所以需要将/usr/lib64 下的库文件拷贝至/usr/lib 下。
要拷贝的文件如下:
libfastcommon.so
1.2.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/下。
配置
fastDFS的配置文件目录 :/etc/fdfs
主要的配置文件:/etc/fdfs/tracker.conf (tracker配置文件 );storage.conf(storage配置文件)
安装成功后进入/etc/fdfs 目录:
tracker.conf配置内容如下:
端口:port=22122
存储策略:store_lookup=
取值范围:0(轮询向storage存储文件)、1(指定具体的group)、2负载均衡,选择空闲的storage存储
指定具体的group:store_group= 如果store_lookup设置为1则这里必须指定一个具体的group。
tracker 基础目录:base_path=/home/fastdfs,tracker在运行时会向此目录存储storage的管理数据。
启动
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart
启动的日志显示先停止 5619 进程(实际环境不是 5619)再启动
注意:如果没有显示上图要注意是否正常停止原有进程。
FastDFS–storage 安装
分别在 192.168.101.5、192.168.101.6、192.168.101.7、192.168.101.8 上安装 storage。
注:初次安装可只安装一台 storage,快速体验
安装 libevent
同 tracker 安装
安装 libfastcommon
同 tracker 安装。
storage 编译安装
同 tracker 编译安装。
配置
storage.conf配置 内容如下:
组名:group_name=group1
端口:port=23000
向tracker心跳间隔(秒):heart_beat_interval=30
storage基础目录:base_path=/home/fastdfs
磁盘存储目录,可定义多个store_path:
store_path0=/home/fastdfs/fdfs_storage 此目录下存储上传的文件,在/home/fastdfs/fdfs_storage/data下
store_path1=…
…
上报tracker的地址:tracker_server=192.168.101.64:22122
如果有多个tracker则配置多个tracker,比如:
tracker_server=192.168.101.64:22122
tracker_server=192.168.101.65:22122
…
启动
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart
启动的日志显示先停止 8931 进程(实际环境不是 8931)再启动
文件上传下载测试
搭建环境
这里我们使用javaApi测试文件的上传,java版本的fastdfs-client地址在:https://github.com/happyfish100/fastdfs-client-java,参考此工程编写测试用例。
此工程采用SpringBoot创建,导入资料下边的test-fastdfs.zip,下边是一些配置文件介绍:
1)pom.xml
<dependency>
<groupId>net.oschina.zcx7878</groupId>
<artifactId>fastdfs-client-java</artifactId>
<version>1.27.0.0</version>
</dependency>
配置 文件
在classpath:config下创建fastdfs-client.properties文件
fastdfs.connect_timeout_in_seconds = 5
fastdfs.network_timeout_in_seconds = 30
fastdfs.charset = UTF-8
fastdfs.tracker_servers = 192.168.101.65:22122
fastdfs.connect_timeout_in_seconds: http连接超时时间
fastdfs.network_timeout_in_seconds: tracker与storage网络通信超时时间
fastdfs.charset:字符编码
fastdfs.tracker_servers:tracker服务器地址,多个地址中间用英文逗号分隔
文件上传
//上传文件
@Test
public void testUpload() {
try {
ClientGlobal.initByProperties("config/fastdfs-client.properties");
System.out.println("network_timeout=" + ClientGlobal.g_network_timeout + "ms");
System.out.println("charset=" + ClientGlobal.g_charset);
//创建客户端
TrackerClient tc = new TrackerClient();
//连接tracker Server
TrackerServer ts = tc.getConnection();
if (ts == null) {
System.out.println("getConnection return null");
return;
}
//获取一个storage server
StorageServer ss = tc.getStoreStorage(ts);
//创建一个storage存储客户端
StorageClient1 sc1 = new StorageClient1(ts, ss);
//本地文件路径
String item = "C:\\Users\\admin\\Desktop\\1.png";
String fileid;
fileid = sc1.upload_file1(item, "png", null);
System.out.println("Upload local file " + item + " ok, fileid=" + fileid);
} catch (Exception ex) {
ex.printStackTrace();
}
}
文件查询
//查询文件
@Test
public void testQueryFile() throws IOException, MyException {
ClientGlobal.initByProperties("config/fastdfs-client.properties");
TrackerClient tracker = new TrackerClient();
TrackerServer trackerServer = tracker.getConnection();
StorageServer storageServer = null;
StorageClient storageClient = new StorageClient(trackerServer,
storageServer);
FileInfo fileInfo = storageClient.query_file_info("group1", "M00/00/01/wKhlQFrKBSOAW5AWAALcAg10vf4862.png");
System.out.println(fileInfo);
}
文件下载
//下载文件
@Test
public void testDownloadFile() throws IOException, MyException {
ClientGlobal.initByProperties("config/fastdfs-client.properties");
TrackerClient tracker = new TrackerClient();
TrackerServer trackerServer = tracker.getConnection();
StorageServer storageServer = null;
StorageClient1 storageClient1 = new StorageClient1(trackerServer,
storageServer);
byte[] result = storageClient1.download_file1("group1/M00/00/01/wKhlQFrKBSOAW5AWAALcAg10vf4862.png");
File file = new File("d:/1.png");
FileOutputStream fileOutputStream = new FileOutputStream(file);
fileOutputStream.write(result);
fileOutputStream.close();
}
FastDFS 和 nginx 整合
nginx 代理
单独安装 nginx 代理服务,它的作用是代理访问 storage 上的文件,实现负载均衡。
nginx 的安装细节参考 nginx 文档,这里使用单机 nginx,也可以使用两台 nginx 组成高
可用或者采用 lvs+nginx 访问 Storage 上的 nginx。
创建 nginx-fdfs.conf 配置文件:
#storage 群 group1 组
upstream storage_server_group1{
server 192.168.101.5:80 weight=10;
server 192.168.101.6:80 weight=10;
}
#storage 群 group2 组
upstream storage_server_group2{
server 192.168.101.7:80 weight=10;
server 192.168.101.8:80 weight=10;
}
server {
listen 80;
server_name ccc.test.com;
location /group1{
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://storage_server_group1;
}
location /group2{
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://storage_server_group2; } }
在 Storage 上安装 nginx
在 storage server 上安装 nginx 的目的是对外通过 http 访问 storage server 上的文件。
使用 nginx 的模块 FastDFS-nginx-module 的作用是通过 http 方式访问 storage 中的文件,当 storage 本机没有要找的文件时向源 storage 主机代理请求文件。
FastDFS-nginx-module
将 FastDFS-nginx-module_v1.16.tar.gz 传 至 fastDFS 的 storage 服 务 器 的
/usr/local/下,执行如下命令:
cd /usr/local
tar -zxvf FastDFS-nginx-module_v1.16.tar.gz
cd FastDFS-nginx-module/src
修改 config 文件将/usr/local/路径改为/usr/
将 FastDFS-nginx-module/src 下的 mod_FastDFS.conf 拷贝至/etc/fdfs/下
cp mod_FastDFS.conf /etc/fdfs/
并修改 mod_FastDFS.conf 的内容:
vi /etc/fdfs/mod_FastDFS.conf
base_path=/home/FastDFS
tracker_server=192.168.101.3:22122
tracker_server=192.168.101.4:22122
url_have_group_name=true #url 中包含 group 名称
store_path0=/home/fastdfs/fdfs_storage #指定文件存储路径
…#如果有多个
将 libfdfsclient.so 拷贝至/usr/lib 下
cp /usr/lib64/libfdfsclient.so /usr/lib/
创建 nginx/client 目录
mkdir -p /var/temp/nginx/client
nginx 安装
将 nginx-1.8.0.tar.gz 拷贝到/usr/local 下
解压 nginx-1.8.0.tar.gz
进入 nginx-1.8.0 目录,执行如下配置命令:
下边add部分表示添加 FastDFS-nginx-module 模块
./configure
–prefix=/usr/local/nginx
–pid-path=/var/run/nginx/nginx.pid
–lock-path=/var/lock/nginx.lock
–error-log-path=/var/log/nginx/error.log
–http-log-path=/var/log/nginx/access.log
–with-http_gzip_static_module
–http-client-body-temp-path=/var/temp/nginx/client
–http-proxy-temp-path=/var/temp/nginx/proxy
–http-fastcgi-temp-path=/var/temp/nginx/fastcgi
–http-uwsgi-temp-path=/var/temp/nginx/uwsgi
–http-scgi-temp-path=/var/temp/nginx/scgi
–add-module=/usr/local/FastDFS-nginx-module/src
make
make install
1.5.2.3 nginx 配置文件
新建一个 nginx 配置文件 nginx-fdfs.conf.
添加虚拟主机:
server {
listen 80;
server_name 192.168.101.65;
location /group1/M00/{
root /home/FastDFS/fdfs_storage/data;
ngx_FastDFS_module;
} }
说明:
server_name 指定本机 ip
location /group1/M00/:group1 为 nginx 服务 FastDFS 的分组名称,M00 是 FastDFS
自动生成编号,对应 store_path0=/home/FastDFS/fdfs_storage,如果 FastDFS 定义
store_path1,这里就是 M01
安装完成启动storage上的nginx:
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx-fdfs.conf
在nginx图片代理服务上配置图片服务器虚拟主机
#图片服务
upstream img_server_pool{
#server 192.168.101.64:80 weight=10;
server 192.168.101.65:80 weight=10;
}
#图片服务
server {
listen 80;
server_name img.fast.com;
#个人中心
location /group1 {
proxy_pass http://img_server_pool;
}
}
1.5.3 测试
通过 java 客户端上传文件,使用浏览器 http 访问文件,这里访问上传图片测试的文件:
访问 storage:
http://192.168.101.5/group1/M00/00/00/wKhlBVVY2M-AM_9DAAAT7-0xdqM485_big.png
ip 地址改为 192.168.101.6 也可以访问到文件,因为同一个分组的 storage 文件互相同步。
访问 tracker:
http://192.168.101.3/group1/M00/00/00/wKhlBVVY2M-AM_9DAAAT7-0xdqM485_big.png
ip 地址改为 192.168.101.4 也可以访问到文件。
使用域名访问 (推荐):
nginx 对外由 vip 提供服务,使用域名访问如下:
比如 vip 对应的域名为 img.test.com:
http://img.test.com/group1/M00/00/00/wKhlBVVY2M-AM_9DAAAT7-0xdqM485_big.png