首页 » 网站推广 » fastdfsnginxphp技巧_开源组件FastDFS集群搭建与实战

fastdfsnginxphp技巧_开源组件FastDFS集群搭建与实战

duote123 2024-12-10 0

扫一扫用手机浏览

文章目录 [+]

下载流程图

基本观点可参考作者上篇文章:FastDFS极速入门

fastdfsnginxphp技巧_开源组件FastDFS集群搭建与实战

底层事理FastDFS不会对文件进行分块存储,直接保存到Storage做事上,这也是不适宜超大文件存储的缘故原由,官方建议(4K~500M),优点:简介高效。
FastDFS采取分组存储办法,同一组可以包括多个Storage Server,个中一个Storage吸收到上传的文件,会同步文件到同组其他Storage Server。
一个组的存储容量为组内Storage Server容量最小的那个。
优点:组内做事压力较大时可以增加Storage Server来缓解压力;系统容量不敷时增加组来得到更大的存储空间。
文件上传成功返回的文件ID由组名,磁盘目录和文件名构成。

fastdfsnginxphp技巧_开源组件FastDFS集群搭建与实战
(图片来自网络侵删)
集群做事器方案系统环境:centos 7.3跟踪做事器1(Tracker):192.168.72.135跟踪做事器2(Tracker):192.168.72.136存储做事器1(Storage):192.168.72.135---(group1)存储做事器2(Storage):192.168.72.136---(group1)存储做事器3(Storage):192.168.72.137---(group2)

由于电脑性能有限,但要仿照多group,只虚拟了3个节点,对group1做了两个节点来备份数据,group2为单节点,生产环境要每个组至少两个节点来担保高可用。

安装包fastdfs-5.11.tar.gzfastdfs-nginx-module-master.ziplibfastcommon-1.0.36.tar.gznginx-1.8.1.tar.gz集群支配

Tracker和Storage支配

1:节点1,节2,节点3分别安装FastDFS,详细安装参考上篇文章:FastDFS极速入门2:分别关闭三个节点的防火墙,或者配置防火墙开放端口,关闭防火墙: systemctl stop firewalld3:修正节点1的tracker.conf配置文件:>mkdir /data/fdfs-tracker>vi /etc/fdfs/tracker.conf把base_path修正为:base_path=/data/fdfs-tracker4:修正节点2的tracker.conf配置文件:同上5:修正节点1的storage.conf配置文件:> mkdir /data/fdfs-storage/base> mkdir /data/fdfs-storage/storage0>vi /etc/fdfs/storage.conf把group_name修正为:group_name=group1把base_path修正为:base_path=/data/fdfs-storage/base把store_path0修正为:store_path0=/data/fdfs-storage/storage0把tracker_server修正两个tracker节点地址: tracker_server=192.168.72.135:22122 tracker_server=192.168.72.136:221226:修正节点2的storage.conf配置文件,同步骤5。
7:修正节点3的storage.conf配置文件,把group_name修正为:group_name=group2其他同步骤5。
8:节点1,节点2上启动tracker做事>service fdfs_trackerd start9:节点1,节点2和节点3上启动storage做事>service fdfs_storaged start

Tracker和Storage安装完成,可以利用FastDFS自带的客户端进行上传下载测试,详细操作方法,参考上篇

fastdfs-nginx-module和nginx安装

所有节点安装fastdfs-nginx-module模块fastdfs-nginx-module模块浸染:文件上传到组内一个storage存储后,storage做事会吧文件同步到组内其他storage,这就存在韶光延时问题,如果此时客户端通过nginx访问到还未同步完成的组内其他storage会导致文件不存在无法访问缺点,fastdfs-nginx-module可以办理该问题的发生,通过重定向到源storage节点来获取文件。
root目录解压fastdfs-nginx-module:>unzip fastdfs-nginx-module.zip安装依赖包:>yum install gcc gcc-c++ make automake autoconf libtool pcre zlib openssl openssl-devel安装nginx>tar -zxvf nginx-1.8.1.tar.gz>cd nginx-1.8.1>./configure --prefix=/opt/nginx --add-module=/roo/fastdfs-nginx-module/src>make && make install复制fastdfs-nginx-module中配置文件到/etc/fdfs目录,并修正配置文件:>cp /root/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs>vi /etc/fdfs/mod_fastdfs.conftracker_server修正为: tracker_server=192.168.72.135:22122 tracker_server=192.168.72.136:22122group_name修正为: 节点1:group_name=group1 节点2:group_name=group1 节点3:group_name=group2url_have_group_name修正为: url_have_group_name = true复制FastDFS部分配置文件到/etc/fdfs目录:> cd /root/fastdfs-5.1/conf>cp http.conf mime.types /etc/fdfs/修正nginx.conf配置文件:

启动nginx:>./nginx -c conf/nginx.conf

到此FastDFS集群已经搭建完成,文件上传后可以通过任意storage节点上的nginx来得到文件

实战FastDFS供应了C,PHP和java客户端,选用java客户端来进行实战。
创建maven工程,pom.xml文件添加依赖:

<dependency> <groupId>net.oschina.zcx7878</groupId> <artifactId>fastdfs-client-java</artifactId> <version>1.27.0.0</version></dependency>

添加配置文件

src/main/resoureces目录下添加fdfs_clent.conf配置文件,内容如下:

connect_timeout = 60network_timeout = 60charset = UTF-8http.tracker_http_port = 8080http.anti_steal_token = no#tracker做事地址tracker_server = 192.168.72.135:22122tracker_server = 192.168.72.136:22122

创建FdfsClient类

静态代码块:

private static StorageClient1 storageClient1 = null; private static String trackerServerUrl = null; //初始化FastDFS Client static{ try{ ClientGlobal.init(\公众src/main/resources/fdfs_client.conf\公众); TrackerClient trackerClient = new TrackerClient(ClientGlobal.g_tracker_group); TrackerServer trackerServer = trackerClient.getConnection(); if (trackerServer == null){ System.out.println(\公众getConnect return null\"大众); } trackerServerUrl = trackerServer.getInetSocketAddress().getHostString(); System.out.println(\"大众trackerServerUrl\公众 + trackerServerUrl); StorageServer storageServer = trackerClient.getStoreStorage(trackerServer); if (storageServer == null){ System.out.println(\"大众getStoreStorage return null\"大众); } storageClient1 = new StorageClient1(trackerServer,storageServer); }catch (Exception e){ e.printStackTrace(); } }

文件上传

public static String uploadFile(File file, String fileExt, Map<String,String> metaList) { try { byte[] buff = FileUtils.getFileByte(file); NameValuePair[] nameValuePairs = null; if (metaList != null) { nameValuePairs = new NameValuePair[metaList.size()]; int index = 0; for (Iterator<Map.Entry<String,String>> iterator = metaList.entrySet().iterator(); iterator.hasNext();) { Map.Entry<String,String> entry = iterator.next(); String name = entry.getKey(); String value = entry.getValue(); nameValuePairs[index++] = new NameValuePair(name,value); } } return \"大众http://\"大众+ trackerServerUrl + \"大众/\"大众 + storageClient1.upload_file1(buff, fileExt, nameValuePairs); } catch (Exception e) { e.printStackTrace(); } return null; }

文件下载

public static int downloadFile(String fileId, String filePath,String fileName) { FileOutputStream fos = null; try { byte[] content = storageClient1.download_file1(fileId); FileUtils.getFile(content, filePath, fileName); return 0; } catch (Exception e) { e.printStackTrace(); } finally { if (fos != null) { try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } } return -1; }

得到文件属性

public static Map<String,String> getFileMetadata(String fileId) { try { NameValuePair[] metaList = storageClient1.get_metadata1(fileId); if (metaList != null) { HashMap<String,String> map = new HashMap<String, String>(); for (NameValuePair metaItem : metaList) { map.put(metaItem.getName(),metaItem.getValue()); } return map; } } catch (Exception e) { e.printStackTrace(); } return null; }

文件删除

public static int deleteFile(String fileId) { try { return storageClient1.delete_file1(fileId); } catch (Exception e) { e.printStackTrace(); } return -1; }

标签:

相关文章