您现在的位置: 首页 > 网站导航收录 > 百科知识百科知识
分布式文件系统(分布式文件系统指的是什么)
文件,目录,客户端分布式文件系统(分布式文件系统指的是什么)
发布时间:2020-12-06加入收藏来源:互联网点击:
FastDFS的文件下载
客户端uploadfile成功后,会拿到一个storage生成的文件名,接下来客户端根据这个文件名即可访问到该文件。
跟upload file一样,在downloadfile时客户端可以选择任意tracker server。tracker发送download请求给某个tracker,必须带上文件名信息,tracke从文件名中解析出文件的group、大小、创建时间等信息,然后为该请求选择一个storage用来服务读请求。
FastDFS能方案
FastDFS 安装
软件包版本FastDFSv5.05libfastcommonv1.0.7
下载安装libfastcommon
下载wget https://github.com/happyfish100/libfastcommon/archive/V1.0.7.tar.gz解压tar -xvf V1.0.7.tar.gzcd libfastcommon-1.0.7编译、安装./make.sh./make.sh install创建软链接ln -s /usr/lib64/libfastcommon.so /usr/local/lib/libfastcommon.soln -s /usr/lib64/libfastcommon.so /usr/lib/libfastcommon.soln -s /usr/lib64/libfdfsclient.so /usr/local/lib/libfdfsclient.soln -s /usr/lib64/libfdfsclient.so /usr/lib/libfdfsclient.so下载安装FastDFS
下载FastDFS wget https://github.com/happyfish100/fastdfs/archive/V5.05.tar.gz解压tar -xvf V5.05.tar.gzcd fastdfs-5.05编译、安装./make.sh./make.sh install配置 Tracker 服务
上述安装成功后,在/etc/目录下会有一个fdfs的目录,进入它。会看到三个.sample后缀的文件,这是作者给我们的示例文件,我们需要把其中的tracker.conf.sample文件改为tracker.conf配置文件并修改它:
cp tracker.conf.sample tracker.confvi tracker.conf编辑tracker.conf
# 配置文件是否不生效,false 为生效disabled=false# 提供服务的端口port=22122# Tracker 数据和日志目录地址base_path=//home/data/fastdfs# HTTP 服务端口http.server_port=80创建tracker基础数据目录,即base_path对应的目录
mkdir -p /home/data/fastdfs使用ln -s 建立软链接
ln -s /usr/bin/fdfs_trackerd /usr/local/binln -s /usr/bin/stop.sh /usr/local/binln -s /usr/bin/restart.sh /usr/local/bin启动服务
service fdfs_trackerd start查看监听
netstat -unltp|grep fdfs如果看到22122端口正常被监听后,这时候说明Tracker服务启动成功啦!
tracker server 目录及文件结构 Tracker服务启动成功后,会在base_path下创建data、logs两个目录。目录结构如下:
${base_path} |__data | |__storage_groups.dat:存储分组信息 | |__storage_servers.dat:存储服务器列表 |__logs | |__trackerd.log: tracker server 日志文件配置 Storage 服务
进入 /etc/fdfs 目录,复制 FastDFS 存储器样例配置文件 storage.conf.sample,并重命名为 storage.conf
# cd /etc/fdfs# cp storage.conf.sample storage.conf# vi storage.conf编辑storage.conf
# 配置文件是否不生效,false 为生效disabled=false# 指定此 storage server 所在 组(卷)group_name=group1# storage server 服务端口port=23000# 心跳间隔时间,单位为秒 (这里是指主动向 tracker server 发送心跳)heart_beat_interval=30# Storage 数据和日志目录地址(根目录必须存在,子目录会自动生成)base_path=/home/data/fastdfs/storage# 存放文件时 storage server 支持多个路径。这里配置存放文件的基路径数目,通常只配一个目录。store_path_count=1# 逐一配置 store_path_count 个路径,索引号基于 0。# 如果不配置 store_path0,那它就和 base_path 对应的路径一样。store_path0=/home/data/fastdfs/storage# FastDFS 存储文件时,采用了两级目录。这里配置存放文件的目录个数。 # 如果本参数只为 N(如: 256),那么 storage server 在初次运行时,会在 store_path 下自动创建 N * N 个存放文件的子目录。subdir_count_per_path=256# tracker_server 的列表 ,会主动连接 tracker_server# 有多个 tracker server 时,每个 tracker server 写一行tracker_server=192.168.1.190:22122# 允许系统同步的时间段 (默认是全天) 。一般用于避免高峰同步产生一些问题而设定。sync_start_time=00:00sync_end_time=23:59使用ln -s 建立软链接
ln -s /usr/bin/fdfs_storaged /usr/local/bin启动服务
service fdfs_storaged start查看监听
netstat -unltp|grep fdfs启动Storage前确保Tracker是启动的。初次启动成功,会在 /home/data/fastdfs/storage 目录下创建 data、 logs 两个目录。如果看到23000端口正常被监听后,这时候说明Storage服务启动成功啦!
查看Storage和Tracker是否在通信
/usr/bin/fdfs_monitor /etc/fdfs/storage.confFastDFS 配置 Nginx 模块
软件包版本openrestyv1.13.6.1fastdfs-nginx-modulev1.1.6
FastDFS 通过 Tracker 服务器,将文件放在 Storage 服务器存储, 但是同组存储服务器之间需要进行文件复制,有同步延迟的问题。
假设 Tracker 服务器将文件上传到了 192.168.1.190,上传成功后文件 ID已经返回给客户端。此时 FastDFS 存储集群机制会将这个文件同步到同组存192.168.1.190,在文件还没有复制完成的情况下,客户端如果用这个文件 ID 在 192.168.1.190 上取文件,就会出现文件无法访问的错误。而 fastdfs-nginx-module 可以重定向文件链接到源服务器取文件,避免客户端由于复制延迟导致的文件无法访问错误。
下载 安装 Nginx 和 fastdfs-nginx-module:
推荐您使用yum安装以下的开发库:
yum install readline-devel pcre-devel openssl-devel -y下载最新版本并解压:
wget https://openresty.org/download/openresty-1.13.6.1.tar.gztar -xvf openresty-1.13.6.1.tar.gzwget https://github.com/happyfish100/fastdfs-nginx-module/archive/master.zipunzip master.zip配置 nginx 安装,加入fastdfs-nginx-module模块:
./configure --add-module=../fastdfs-nginx-module-master/src/编译、安装:
make make install查看Nginx的模块:
/usr/local/openresty/nginx/sbin/nginx -v有下面这个就说明添加模块成功
复制 fastdfs-nginx-module 源码中的配置文件到/etc/fdfs 目录, 并修改:
cp /fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/# 连接超时时间connect_timeout=10# Tracker Servertracker_server=192.168.1.190:22122# StorageServer 默认端口storage_server_port=23000# 如果文件ID的uri中包含/group**,则要设置为trueurl_have_group_name = true# Storage 配置的store_path0路径,必须和storage.conf中的一致store_path0=/home/data/fastdfs/storage复制 FastDFS 的部分配置文件到/etc/fdfs 目录:
cp /fastdfs-nginx-module/src/http.conf /etc/fdfs/cp /fastdfs-nginx-module/src/mime.types /etc/fdfs/配置nginx,修改nginx.conf:
location ~/group([0-9])/M00 { ngx_fastdfs_module;}启动Nginx:
[root@iz2ze7tgu9zb2gr6av1tysz sbin]# ./nginxngx_http_fastdfs_set pid=9236测试上传:
[root@iz2ze7tgu9zb2gr6av1tysz fdfs]# /usr/bin/fdfs_upload_file /etc/fdfs/client.conf /etc/fdfs/4.jpggroup1/M00/00/00/rBD8EFqVACuAI9mcAAC_ornlYSU088.jpg部署结构图:
JAVA 客户端集成
pom.xml引入:
!-- fastdfs --dependency groupIdorg.csource/groupId artifactIdfastdfs-client-java/artifactId version1.27/version/dependencyfdfs_client.conf配置:
#连接tracker服务器超时时长connect_timeout = 2 #socket连接超时时长network_timeout = 30#文件内容编码 charset = UTF-8 #tracker服务器端口http.tracker_http_port = 8080http.anti_steal_token = nohttp.secret_key = FastDFS1234567890#tracker服务器IP和端口(可以写多个)tracker_server = 192.168.1.190:22122FastDFSClient上传类:
public class FastDFSClient{ private static final String CONFIG_FILENAME = "D:\\itstyle\\src\\main\\resources\\fdfs_client.conf"; private static final String GROUP_NAME = "market1"; private TrackerClient trackerClient = null; private TrackerServer trackerServer = null; private StorageServer storageServer = null; private StorageClient storageClient = null; static{ try { ClientGlobal.init(CONFIG_FILENAME); } catch (IOException e) { e.printStackTrace(); } catch (MyException e) { e.printStackTrace(); } } public FastDFSClient() throws Exception { trackerClient = new TrackerClient(ClientGlobal.g_tracker_group); trackerServer = trackerClient.getConnection(); storageServer = trackerClient.getStoreStorage(trackerServer) storageClient = new StorageClient(trackerServer, storageServer); } /** * 上传文件 * @param file 文件对象 * @param fileName 文件名 * @return */ public String[] uploadFile(File file, String fileName) { return uploadFile(file,fileName,null); } /** * 上传文件 * @param file 文件对象 * @param fileName 文件名 * @param metaList 文件元数据 * @return */ public String[] uploadFile(File file, String fileName, MapString,String metaList) { try { byte[] buff = IOUtils.toByteArray(new FileInputStream(file)); NameValuePair[] nameValuePairs = null; if (metaList != null) { nameValuePairs = new NameValuePair[metaList.size()]; int index = 0; for (IteratorMap.EntryString,String iterator = metaList.entrySet().iterator(); iterator.hasNext();) { Map.EntryString,String entry = iterator.next(); String name = entry.getKey(); String value = entry.getValue(); nameValuePairs[index++] = new NameValuePair(name,value); } } return storageClient.upload_file(GROUP_NAME,buff,fileName,nameValuePairs); } catch (Exception e) { e.printStackTrace(); } return null; } /** * 获取文件元数据 * @param fileId 文件ID * @return */ public MapString,String getFileMetadata(String groupname,String fileId) { try { NameValuePair[] metaList = storageClient.get_metadata(groupname,fileId); if (metaList != null) { HashMapString,String map = new HashMapString, String(); for (NameValuePair metaItem : metaList) { map.put(metaItem.getName(),metaItem.getValue()); } return map; } } catch (Exception e) { e.printStackTrace(); } return null; } /** * 删除文件 * @param fileId 文件ID * @return 删除失败返回-1,否则返回0 */ public int deleteFile(String groupname,String fileId) { try { return storageClient.delete_file(groupname,fileId); } catch (Exception e) { e.printStackTrace(); } return -1; } /** * 下载文件 * @param fileId 文件ID(上传文件成功后返回的ID) * @param outFile 文件下载保存位置 * @return */ public int downloadFile(String groupName,String fileId, File outFile) { FileOutputStream fos = null; try { byte[] content = storageClient.download_file(groupName,fileId); fos = new FileOutputStream(outFile); InputStream ips = new ByteArrayInputStream(content); IOUtils.copy(ips,fos); return 0; } catch (Exception e) { e.printStackTrace(); } finally { if (fos != null) { try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } } return -1; } public static void main(String[] args) throws Exception { FastDFSClient client = new FastDFSClient(); File file = new File("D:\\23456.png"); String[] result = client.uploadFile(file, "png"); System.out.println(result.length); System.out.println(result[0]); System.out.println(result[1]); }}上一篇:徐贵生(金峰集团徐贵生)
下一篇:返回列表
相关链接 |
||
网友回复(共有 0 条回复) |