FastDFS的介绍
架构图
FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。
所需要的文件,上传到/usr/upload目录下
FastDFS的安装
1.安装c语言环境
yum -y install gcc
2.安装c函数库
libfastcommon-master.zip(是从 FastDFS 和 FastDHT 中提取出来的公共 C 函数库)
#进入上传目录
cd /usr/upload
#解压上传的libfastcommon-master.zip
unzip libfastcommon-master.zip#进入解压完成的目录
cd libfastcommon-master#编译并且安装:
./make.sh
./make.sh install
3.安装FastDFS
#解压FastDFS
tar -zxvf FastDFS_v5.08.tar.gz
#进入fastDFS
cd FastDFS
#编译并安装
./make.sh
./make.sh install
如果安装成功,会看到/etc/init.d/下看到提供的脚本文件:
-
fdfs_trackerd
是tracker启动脚本 -
fdfs_storaged
是storage启动脚本
ll /etc/fdfs/
4.配置并启动tracker服务
1.将模板文件复制
cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf
2.修改复制后的配置文件
vim /etc/fdfs/tracker.conf
3.修改的内容
base_path=/powershop/tracker
4.修改完成,创建目录
mkdir -p /powershop/tracker
5.启动与停止
启动tracker服务:service fdfs_trackerd start
停止tracker服务:service fdfs_trackerd stop
6.查看是否启动:
ps -ef | grep fdfs.trackerd
7.设置tracker服务的开机自启:
chkconfig fdfs_trackerd on
5.配置并启动storage服务
1.将模板文件复制
cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf
2.修改复制后的文件
vim /etc/fdfs/storage.conf
3.修改的内容
base_path=/powershop/storage # 日志文件存储根目录
store_path0=/powershop/storage # 文件存储目录
tracker_server=192.168.204.131:22122 # tracker服务器IP和端口
4.创建目录
mkdir -p /powershop/storage
5.启动与停止
启动storage服务:service fdfs_storage start
停止storage服务:service fdfs_storage stop
6.查看是否启动:
ps -ef | grep fdfs_storaged
7.设置storage服务开机启动:
chkconfig fdfs_storaged on
FastDFS和nginx的结合使用
为了承载更高的并发量,tracker可以做成集群。需要使用nginx做负载均衡。
fastdfs-nginx-module插件的作用
FastDFS通过Tracker服务器,将文件放在Storage服务器存储,但是同组存储服务器之间需要进入文件复制,有同步延迟的问题。
假设Tracker服务器将文件上传到了192.168.4.125,上传成功后文件ID已经返回给客户端。此时FastDFS存储集群机制会将这个文件同步到.同组存储192.168.4.126,在文件还没有复制完成的情况下,客户端如果用这个文件ID在192.168.4.126上取文件,就会出现文件无法访问的错误。
而fastdfs-nginx-module可以重定向文件连接到文件上传时的源服务器取文件,避免客户端由于复制延迟导致的文件无法访问错误
安装fastdfs-nginx-module插件
1.解压
cd /usr/upload
tar -zxvf fastdfs-nginx-module_v1.16.tar.gz
#进入src目录
cd fastdfs-nginx-module/src/
#修改config
vim config
#使用以下底行命令
:%s+/usr/local/+/usr/+g
将所有的/usr/local替换为 /usr,这个才是正确的目录:
2.配置fastdfs-nginx-module与FastDFS关联
1.复制 fastdfs-nginx-module 源码中的配置文件到/etc/fdfs 目录, 并修改
cp /usr/upload/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/
vim /etc/fdfs/mod_fastdfs.conf
修改以下配置:
connect_timeout=10 # 客户端访问文件连接超时时长(单位:秒)
tracker_server=192.168.204.131:22122 # tracker服务IP和端口
url_have_group_name=true # 访问链接前缀加上组名
store_path0=/powershop/storage # 文件存储路径
2.开启nginx支持
cd /usr/upload/FastDFS/conf/
cp http.conf mime.types /etc/fdfs/
3.安装nginx
1.安装nginx的依赖库
yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel
2.解压
cd /usr/upload
tar -zxvf nginx-1.10.0.tar.gz
3.配置nginx安装包,并指定fastdfs-nginx-model
cd nginx-1.10.0
./configure --prefix=/usr/local/nginx --add-module=/usr/upload/fastdfs-nginx-module/src
#编译并安装
make && make install
nginx的开机自启 http://t.csdn.cn/rFVHY
4.配置nginx动静分离
修改nginx的nginx.conf
基于上面的配置来使用
FastDFS改造power_shop_item工程 :
1.引入依赖
在父工程中,添加管理依赖,版本为:
<fastDFS-client-version>1.26.2</fastDFS-client-version>
<!--fastdfs-->
<dependency>
<groupId>com.github.tobato</groupId>
<artifactId>fastdfs-client</artifactId>
<version>${fastDFS-client-version}</version>
</dependency>
子工程pom.xml中引入坐标
<dependency>
<groupId>com.github.tobato</groupId>
<artifactId>fastdfs-client</artifactId>
</dependency>
2.引入配置类
3.application.yml
4.配置hosts
C:\Windows\System32\drivers\etc目录下的hosts
#测试环境
192.168.204.158 image.powershop.com
5.测试:
创建测试类:
import com.github.tobato.fastdfs.domain.StorePath;
import com.github.tobato.fastdfs.domain.ThumbImageConfig;
import com.github.tobato.fastdfs.service.FastFileStorageClient;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.junit4.SpringRunner;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes={PowerShopItemApp.class})
public class FastDFSTest {
@Autowired
private FastFileStorageClient storageClient;
@Autowired
private ThumbImageConfig thumbImageConfig;
3.Test
public void testUpload() throws FileNotFoundException {
// 要上传的文件
File file = new File("D:/images/1.jpg");
// 上传并保存图片,参数:1-上传的文件流 2-文件的大小 3-文件的后缀 4-可以不管他
StorePath storePath = this.storageClient.uploadFile(
new FileInputStream(file), file.length(), "jpg", null);
// 带分组的路径
System.out.println(storePath.getFullPath());
// 不带分组的路径
System.out.println(storePath.getPath());
}
@Test
public void testUploadAndCreateThumb() throws FileNotFoundException {
File file = new File("D:/images/1.jpg");
// 上传并且生成缩略图
StorePath storePath = this.storageClient.uploadImageAndCrtThumbImage(
new FileInputStream(file), file.length(), "png", null);
// 带分组的路径
System.out.println(storePath.getFullPath());
// 不带分组的路径
System.out.println(storePath.getPath());
// 获取缩略图路径
String path = thumbImageConfig.getThumbImagePath(storePath.getFullPath());
System.out.println(path);
}
}
结果:
group1:卷名
/M00:store_path0 目录
00/00:两层256个文件夹
访问第一组的第一个路径
访问第一组的第最后路径
访问第二组的第一个路径