zl程序教程

您现在的位置是:首页 >  后端

当前栏目

Java分布式篇5——FastDFS

2023-09-14 09:01:23 时间

Java分布式篇5——FastDFS

分布式文件系统

1、主流的分布式文件系统

1.1、 HDFS

(Hadoop Distributed File System)Hadoop 分布式文件系统

  • 高容错的系统,适合部署到廉价的机器上
  • 能提供高吞吐量的数据访问,非常适合大规模数据应用
  • HDFS采用主从结构,一个HDFS是由一个name节点和N个data节点组成
  • name节点储存元数据,一个文件分割成N份存储在不同的data节点上
  • 生态好

1.2、GFS

Google File System

  • 可扩展的分布式文件系统,用于大型的,分布式的,对大量数据进行访问的应用
  • 运行于廉价的普通硬件上,可以提供容错功能
  • 它可以给大量的用户提供总体性能较高的服务
  • GFS采用主从结构,一个GFS集群由一个master和大量的chunkserver(分块服务器)组成
  • 一个文件被分割若干块,分散储存到多个分块server中

1.3、FastDFS

  • fastDFS特别适合图 片,小视频等小文件,因为fastDFS对文件是不分割的,所以没有文件合并的开销
  • 网络通信用socket,速度快

2、工作原理

在这里插入图片描述

  • Tracker(追踪者):负载均衡和调度,它管理着存储服务(Storage Server),可以集群,实现高可用
  • Storage(仓库):文件存储的位置
    • storage集群采用分组的方式,同组内的每台服务器是平等关系,数据同步,目的是实现数据备份,从而高可用,而不同组的服务器之间是不通信的
    • 同组内的每台服务器的存储量不一致的情况下,会选取容量最小的那个,所以同组内的服务器之间软硬件最好保持一致
    • Storage Server会连接集群中的所有Tracker Server,定时向他们汇报自己的状态,例如:剩余空间,文件同步情况,文件上传下载次数等信息

3、上传下载原理

3.1、上传

在这里插入图片描述

3.2、下载

在这里插入图片描述

4、FastDFS安装

libfastcommon 百度云:https://pan.baidu.com/s/1js5_xYNU_d1wV29BF1GQIg提取码:4q2m

FastDFS_v5.05 百度云:https://pan.baidu.com/s/11hBxbbxy6cneRYTLjOgXYg提取码:2rxp

4.1、安装gcc环境

yum install -y gcc gcc-c++

4.2、安装libevent

yum -y install libevent

4.3、安装libfastcommon

#安装解压zip包工具
yum install -y unzip
#解压zip
unzip libfastcommon.zip
#进入目录
cd libfastcommon-master
#编译
./make.sh
#如果出现权限不允许
chmod 777 make.sh
./make.sh
#安装
./make.sh install

4.4、安装Tracker

#解压
tar -zxvf FastDFS_v5.05.tar.gz
#进入目录
cd FastDFS
#编译
./make.sh
#安装
./make.sh install

4.5、拷贝配置文件

cp /usr/local/fastdfs/FastDFS/conf/* /etc/fdfs/

4.6、配置Tracker

#作为文件存储目录,可以自行定义
mkdir /home/fastdfs
vim /etc/fdfs/tracker.conf

tracker.conf

base_path=/home/fastdfs

4.7、配置Storage

#作为文件存储目录,可以自行定义
mkdir /home/fastdfs/fdfs_storage

vim /etc/fdfs/storage.conf

storage.conf

base_path=/home/fastdfs
store_path0=/home/fastdfs/fdfs_storage
tracker_server=.101.34.116.9:22122

4.8、启动

[root@VM-0-3-centos bin]# pwd
/usr/bin
[root@VM-0-3-centos bin]# fdfs_trackerd /etc/fdfs/tracker.conf restart
[root@VM-0-3-centos bin]# fdfs_storaged /etc/fdfs/storage.conf restart
[root@VM-0-3-centos bin]# ps -ajx|grep fdfs
    1 15717 15716 15716 ?           -1 Sl       0   0:00 fdfs_trackerd /etc/fdfs/tracker.conf restart
    1 17544 17543 17543 ?           -1 Sl       0   0:00 fdfs_storaged /etc/fdfs/storage.conf restart
11458 17573 17572 11458 pts/0    17572 R+       0   0:00 grep --color=auto fdfs
[root@VM-0-3-centos bin]# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1383/master         
tcp        0      0 0.0.0.0:22122           0.0.0.0:*               LISTEN      15717/fdfs_trackerd 
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1495/sshd           
tcp        0      0 0.0.0.0:23000           0.0.0.0:*               LISTEN      17544/fdfs_storaged 
tcp6       0      0 ::1:25                  :::*                    LISTEN      1383/master         
tcp6       0      0 :::22                   :::*                    LISTEN      1495/sshd

5、文件上传

5.1、导入依赖

<dependencies>
    <dependency>
        <groupId>net.oschina.zcx7878</groupId>
        <artifactId>fastdfs-client-java</artifactId>
        <version>1.27.0.0</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.8.0</version>
    </dependency>
</dependencies>

5.2、配置文件

##fastdfs-client.properties
fastdfs.connect_timeout_in_seconds = 5
fastdfs.network_timeout_in_seconds = 30
fastdfs.charset = UTF-8
fastdfs.http_anti_steal_token = false
fastdfs.http_secret_key = FastDFS1234567890
fastdfs.http_tracker_http_port = 80
fastdfs.tracker_servers = 101.34.116.9:22122

5.3、测试

public class FastDFSTest {
    @Test
    public void upload_file() throws IOException, MyException {
        // 加载配置文件
        ClientGlobal.initByProperties("fastdfs-client.properties");
        // 创建tracker客户端
        TrackerClient trackerClient=new TrackerClient();
        // 通过tracker客户端获取tracker的连接服务
        TrackerServer connection = trackerClient.getConnection();
        // 声明storage服务
        StorageServer storageServer=null;
        // 定义storage客户端
        StorageClient storageClient = new StorageClient(connection, storageServer);

        // 元数据
        NameValuePair[] nameValuePair = new NameValuePair[1];
        nameValuePair[0]=new NameValuePair("fileName","witch");
        // 上传文件
        String[] strings = storageClient.upload_file("C:\\Users\\yoya\\Pictures\\1555296384.jpeg", "jpeg", nameValuePair);
        System.out.println(Arrays.toString(strings));
        connection.close();
        // [group1, M00/00/00/rBEAA2EJE8qAGmD5AAOoqzLzJBg09.jpeg]
    }
}

6、文件查询

public class FastDFSTest {
    @Test
    public void select_file() throws IOException, MyException {
        // 加载配置文件
        ClientGlobal.initByProperties("fastdfs-client.properties");
        // 创建tracker客户端
        TrackerClient trackerClient=new TrackerClient();
        // 通过tracker客户端获取tracker的连接服务
        TrackerServer connection = trackerClient.getConnection();
        // 声明storage服务
        StorageServer storageServer=null;
        // 定义storage客户端
        StorageClient storageClient = new StorageClient(connection, storageServer);

        // 查询文件
        FileInfo fileInfo = storageClient.query_file_info("group1", "M00/00/00/rBEAA2EJE8qAGmD5AAOoqzLzJBg09.jpeg");
        System.out.println(fileInfo);
        connection.close();
        // source_ip_addr = 172.17.0.3, file_size = 239787, create_timestamp = 2021-08-03 18:00:42, crc32 = 854795288
    }
}

7、文件下载

public class FastDFSTest {
    @Test
    public void download_file() throws IOException, MyException {
        // 加载配置文件
        ClientGlobal.initByProperties("fastdfs-client.properties");
        // 创建tracker客户端
        TrackerClient trackerClient=new TrackerClient();
        // 通过tracker客户端获取tracker的连接服务
        TrackerServer connection = trackerClient.getConnection();
        // 声明storage服务
        StorageServer storageServer=null;
        // 定义storage客户端
        StorageClient storageClient = new StorageClient(connection, storageServer);

        // 查询文件
        byte[] bytes = storageClient.download_file("group1", "M00/00/00/rBEAA2EJE8qAGmD5AAOoqzLzJBg09.jpeg");
        FileOutputStream fileOutputStream = new FileOutputStream(new File("D:/123.jpeg"));
        fileOutputStream.write(bytes);
        fileOutputStream.close();
        connection.close();
        System.out.println("下载成功");
    }
}