Liunx中配置fastDFS
环境:
虚拟机VMware Workstation
CentOS7系统
安装Docker以及配置远程仓库(阿里云)和镜像加速器(不是必须)
JDK1.8
安装:
docker开机自启动
systemctl enable docker
安装fastDFS(Docker拉取),注意:要先启动Docker,否则会报错
docker pull morunchang/fastdfs
安装并运行tracker(跟踪服务器,起到调度的作用):
docker run -d --name tracker --net=host morunchang/fastdfs sh tracker.sh
安装并运行storage(存储服务器,提供容量和备份服务):
docker run -d --name storage --net=host -e TRACKER_IP=服务器或者虚拟机的ip:跟踪服务的端口(默认22122) -e GROUP_NAME=组名(写group1) morunchang/fastdfs sh storage.sh
- -net :添加网络模式
- -e :添加 storage 到环境变量
开机自启动
docker update --restart=always tracker
docker update --restart=always storage
查看docker启动了的容器
docker ps
配置:
进入docker容器
docker exec -it storage bash
配置tracker.conf
vim /etc/fdfs/tracker.conf
reserved storage space 是存储空间,可以根据需求自己调节,默认是10%
FastDFS :java.lang.Exception: getStoreStorage fail, errno code: 28
如果出现这个异常解决方案
1.删除垃圾文件
2.找到配置文件,改reserved storage space
3.扩大服务器存储
配置storage.conf
vim /etc/fdfs/storage.conf
group_name是组名,可以手动修改
存储服务的端口
连接超时时间、网络超时时间和心跳时间(心跳默认是每30秒向跟踪服务发送文件的信息
存储文件的路径
每个区存储的路径
store_path0是第一个M00,以此类推
跟踪服务的的地址,注意:配置错了无法通讯
配置nginx的配置文件
vim /etc/nginx/conf/nginx.conf
location ~ /M00 {
root /data/fast_data/data;
ngx_fastdfs_module;
}
如果是Docker,会自动帮我们配置好,如果有更多分区,可以继续配置
退出容器
exit
重启容器
docker restart storage
使用Java操作文件
创建一个springboot项目,在pom文件中加入依赖
<dependency>
<groupId>net.oschina.zcx7878</groupId>
<artifactId>fastdfs-client-java</artifactId>
<version>1.27.0.0</version>
</dependency>
在resources下创建 fastdfs-client.properties 文件
# http连接超时时间
fastdfs.connect_timeout_in_seconds=5
# tracker与storage网络通信超时时间
fastdfs.network_timeout_in_seconds=30
# 字符编码
fastdfs.charset=utf-8
# tracker服务器地址,多个地址中间用英文逗号分隔
fastdfs.tracker_servers=192.168.109.128:22122
文件上传
/**
* 文件上传
*/
@Test
public void upload(){
try {
//1.初始化fastdfs的数据
ClientGlobal.initByProperties("fastdfs-client.properties");
//2.创建Tracker对象TrackerClient
TrackerClient trackerClient = new TrackerClient();
//3.通过trackerClient得到TrackerServer
TrackerServer trackerServer = trackerClient.getConnection();
//4.通过trackerServer得到StorageServer
StorageServer storageServer = trackerClient.getStoreStorage(trackerServer);
//5.创建一个StorageClient1
StorageClient1 sc1=new StorageClient1(trackerServer,storageServer);
//6.可传的附加参数
NameValuePair[] meta_list=new NameValuePair[1];
meta_list[0]=new NameValuePair("author","mmmmores");
//7.待上传的图片路径
String item="D://1.gif";
//8.上传文件
String file_id = sc1.upload_file1(item, "gif", meta_list);
//9.打印
System.out.println("上传的文件id:"+file_id);
} catch (IOException | MyException e) {
e.printStackTrace();
}
}
文件下载
/**
* 文件下载
*/
@Test
public void download(){
try {
//1.初始化fastdfs的数据
ClientGlobal.initByProperties("fastdfs-client.properties");
//2.创建Tracker对象TrackerClient
TrackerClient trackerClient = new TrackerClient();
//3.通过trackerClient得到TrackerServer
TrackerServer trackerServer = trackerClient.getConnection();
//4.通过trackerServer得到StorageServer
StorageServer storageServer = trackerClient.getStoreStorage(trackerServer);
//5.创建一个StorageClient1
StorageClient1 sc1=new StorageClient1(trackerServer,null);
//7.下载
byte[] bytes = sc1.download_file1("上传时拿到的id");
FileOutputStream fileOutputStream = new FileOutputStream(new File("D://3.gif"));
//6.写入磁盘
fileOutputStream.write(bytes);
fileOutputStream.close();
} catch (IOException | MyException e) {
e.printStackTrace();
}
}
文件删除
/**
* 文件删除
*/
@Test
public void del(){
try {
//1.初始化fastdfs的数据
ClientGlobal.initByProperties("fastdfs-client.properties");
//2.创建Tracker对象TrackerClient
TrackerClient trackerClient = new TrackerClient();
//3.通过trackerClient得到TrackerServer
TrackerServer trackerServer = trackerClient.getConnection();
//4.通过trackerServer得到StorageServer
StorageServer storageServer = trackerClient.getStoreStorage(trackerServer);
//5.创建一个StorageClient1
StorageClient1 sc1=new StorageClient1(trackerServer,null);
int i = sc1.delete_file1("上传拿到的id");
if (i==1){
System.out.println("删除成功");
}
} catch (IOException | MyException e) {
e.printStackTrace();
}
}
文件查询
/**
* 文件查询
*/
@Test
public void del(){
try {
//1.初始化fastdfs的数据
ClientGlobal.initByProperties("fastdfs-client.properties");
//2.创建Tracker对象TrackerClient
TrackerClient trackerClient = new TrackerClient();
//3.通过trackerClient得到TrackerServer
TrackerServer trackerServer = trackerClient.getConnection();
//4.通过trackerServer得到StorageServer
StorageServer storageServer = trackerClient.getStoreStorage(trackerServer);
//5.创建一个StorageClient1
StorageClient1 sc1=new StorageClient1(trackerServer,null);
//6.查询(查看文件信息)
FileInfo info = sc1.get_file_info1("上传时拿到的id");
System.out.println(info);
} catch (IOException | MyException e) {
e.printStackTrace();
}
}
使用服务器ip或虚拟机ip+“/”+id作为浏览器访问路径可以拿到图片(虚拟机或服务器必须开着)
常见问题:
Win家庭版VM与Hyper-V不兼容的问题
问题:WINI10家庭版没有Hyper-V服务,不自带虚拟机。
解决办法:
-
1.win+r,输入services.msc,打开服务。将下列所有的服务停止,稍等这还没结束。
这一步,很关键,一定要用 以管理员身份运行 cmd ,然后输入
bcdedit /set hypervisorlaunchtype off
运行成功后会有提示:操作成功,如果提示无法操作一定是你没有使用管理员身份运行!!!
之后重启就可以啦。
-
2.安全中心 → 设备安全性 → 内核隔离 → 关闭内存完整性 → 重启电脑
再打开VM你会发现,安装完的虚拟机可以启动了!
Docker拉取镜像超时
安装远程仓库时,选择阿里云的
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
镜像加速器配置
打开我们的阿里云官网https://www.aliyun.com/
右上角登录,点击控制台
工作台 -> 弹性计算 -> 容器服务 -> 容器镜像服务 -> 镜像工具 -> 镜像加速器
然后选择我们的系统,将我们指令复制进入执行
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://0rgcp567.mirror.aliyuncs.com"]
}
然后重新加载我们的daemon
systemctl daemon-reload
重启我们的Docker
systemctl restart docker
getStoreStorage fail, errno code: 2
这是跟踪服务连接存储服务超时导致的
说明存储服务找不到
1.存储服务没用起来
2.client.conf和storage.conf中tracker_server中的ip和端口出错了