分散ファイル・ストレージ・システム(fastdfs)

図1に示すように、分散ファイル・ストレージ・システム

あなたは上記の、そしてあなたが管理画像のファイルサーバーを必要とするどのサーバに画像を見つけることができないので、原因複数のサーバーに、写真をアップロードします。

[画像のダンプはチェーンが失敗し、発信局は、直接アップロード(IMG-gnnnI9Sn-1585211003406)(資産/ 1584107074588.png)ダウン画像を保存することが推奨され、セキュリティチェーン機構を有していてもよいです]

FastDFSファイルサーバです。

2、FastDFS

[画像のダンプはチェーンが失敗し、発信局は、直接アップロード(IMG-kqxVUROV-1585211003408)(資産/ 1584855017183.png)ダウン画像を保存することが推奨され、セキュリティチェーン機構を有していてもよいです]

1つのサポートアップロード - >私たちのリターンパスを与えます

2件のサポートダウンロード - >パスを使用してダウンロード

小さなファイル分散ファイル・ストレージ・システム

文書Gが小さなファイルよりも小さい場合、ファイルをせずに分割することができます

大きなファイルを分割する必要があります。

FastDFSは、分散ファイル・ストレージ・システムは、2つの部分から構成されています。

1トラッカー(追跡)

2記憶装置(メモリ)

あなたがFastDFSの容量を拡張したい場合は、非常に便利な、グループがライン上で直接追加しました

[画像のダンプはチェーンが失敗し、発信局は、直接アップロード(IMG-KvsPRBdO-1585211003425)(資産/ 1584107517026.png)ダウン画像を保存することが推奨され、セキュリティチェーン機構を有していてもよいです]

ビルドに3、FastDFS

サーバーコンテナに作成3.1、FastDFS

[画像のダンプはチェーンが失敗し、発信局は、直接アップロード(IMG-s7sigUDQ-1585211003426)(資産/ 1584846243919.png)ダウン画像を保存することが推奨され、セキュリティチェーン機構を有していてもよいです]

3.1.1準備トラッカーを

docker run -d --name tracker --net=host morunchang/fastdfs sh tracker.sh

3.1.2ストレージを準備

1つのパブリックアドレス:パブリックネットワークを使用して、開発

2プライベートアドレス:上のオンラインサービス、プライベートネットワークの使用

docker run -d --name storage --net=host -e TRACKER_IP=服务器公网:22122 -e GROUP_NAME=g1 morunchang/fastdfs sh storage.sh

あなたは使用することができdocker logs 容器名称、血管が正常に動作して表示するためのコマンドを。

同一グループ内のストレージ・ファイルがバックアップされます。

負荷分散を使用することができます異なるグループに位置しています。

[画像のダンプはチェーンが失敗し、発信局は、直接アップロード(IMG-cFrePqTe-1585211003427)(資産/ 1584108715256.png)ダウン画像を保存することが推奨され、セキュリティチェーン機構を有していてもよいです]

3.2、プロジェクトの依存関係を追加

[画像のダンプはチェーンが失敗し、発信局は、直接アップロード(IMG-b43sjZka-1585211003429)(資産/ 1584873611084.png)ダウン画像を保存することが推奨され、セキュリティチェーン機構を有していてもよいです]

<!--spring boot项目导入的依赖-->
<dependency>
    <groupId>com.github.tobato</groupId>
    <artifactId>fastdfs-client</artifactId>
    <version>1.26.7</version>
</dependency>
<!--测试类依赖-->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-test</artifactId>
	<scope>test</scope>
</dependency>

3.3、YMLプロフィール

fdfs:
  tracker-list:            #TrackerList参数,支持多个
  - 192.168.1.105:22122
  - 192.168.1.106:22122 

3.4テスト動作fastdfs

package com.zxm.test;

import com.github.tobato.fastdfs.domain.fdfs.StorageNode;
import com.github.tobato.fastdfs.domain.fdfs.StorageNodeInfo;
import com.github.tobato.fastdfs.domain.proto.storage.DownloadFileWriter;
import com.github.tobato.fastdfs.service.FastFileStorageClient;
import com.github.tobato.fastdfs.service.TrackerClient;
import com.zxm.utils.FastdfsUtil;
import lombok.SneakyThrows;
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.SpringRunner;

import java.io.File;
import java.io.FileInputStream;
import java.util.HashSet;

@SpringBootTest
@RunWith(SpringRunner.class)
public class FileUploadTest {

    @Autowired
    private FastFileStorageClient fastFileStorageClient;

    @Autowired
    private TrackerClient trackerClient;

    /**
     * 文件的上传
     */
    @SneakyThrows
    @Test
    public void updateLoadTest(){
        // 也可以上传视频。只需要填入视频路径,然后将fileExtName换为视频的后缀就行。
        File file = new File("C:/Users/86131/Pictures/Saved Pictures/1.jpg");
        String path = fastFileStorageClient.uploadFile(
                new FileInputStream(file),
                file.length(),
                "jpg",
                new HashSet<>(0)).getFullPath();
        System.out.println(path);
    }

    /**
     * 文件的下载
     */
    @Test
    public void testDownload(){
        String path = "C:/Users/86131/Desktop/临时文件夹/d2.jpg";
        fastFileStorageClient.downloadFile("g1","M00/00/00/rBHR8l5h-T6AQTubAApSuL6VXKQ831.jpg", new DownloadFileWriter(path));
    }
    /**
     * 文件的删除
     * 删除之后,还可以访问,但是不能下载了。
     */
    @Test
    public void testDelete(){
        String fullPath = "g1/M00/00/00/rBHR8l5nSzeAS0pmAAVS7KokxMQ062.jpg";
        String groupName = FastdfsUtil.parseGroup(fullPath);
        System.out.println(groupName);
        String path = fullPath.replaceFirst(groupName+"/", "");
        System.out.println(path);
        fastFileStorageClient.deleteFile(groupName,path);
        System.out.println("删除完成");
//        或者直接使用下述方法就可删除。
//        fastFileStorageClient.deleteFile("g1","M00/00/00/rBHR8l5nSzeAS0pmAAVS7KokxMQ062.jpg");
    }

    @Test
    public void trackerTest(){
        /**
         * 文件下载时候用到。
         * fetchStorage对象中包含组名,storage的服务器ip,端口
         */
        StorageNodeInfo fetchStorage = trackerClient.getFetchStorage("g1", "M00/00/00/rBHR8l5nSzeAS0pmAAVS7KokxMQ062.jpg");
        /**
         * 文件上传时候用到
         * 得到当前注册到tracker上面的storege
         * 不同组可以使用负载均衡。
         */
        StorageNode storeStorage = trackerClient.getStoreStorage();
    }

}

3.5、コントローラアプリケーションfastDFS

package com.zxm.controller;

import com.github.tobato.fastdfs.service.FastFileStorageClient;
import lombok.SneakyThrows;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

/**
 * 负责文件上传的控制器
 */
@RestController
@RequestMapping("/admin/file")
public class FileController {
    @Autowired
    private FastFileStorageClient fastFileStorageClient;

    // http://47.94.225.69:8080  fastDFS自定义地址配置。
    // 此处使用@Value注解从yml配置文件中注入。
    @Value("${resources.url}")
    private String serverAddress; 

    /**
     * 上传一个图片
     * @param file
     * @return
     */
    @SneakyThrows
    @PostMapping("/upload/element")
    public ResponseEntity<String> uploadFile(@RequestParam("file") MultipartFile file){
        // 开始上传文件
        String fullPath = fastFileStorageClient.uploadFile(
                file.getInputStream(),
                file.getSize(),
                "jpg",
                null).getFullPath();
        return ResponseEntity.ok(serverAddress+"/"+fullPath);
    }
}
# fastdfs的自定义地址配置
resources:
  url: http://47.94.225.69:8080

原則分析fastdfs 4、

4.1、fastDFSファイルのアップロードプロセス

[画像のダンプはチェーンが失敗し、発信局は、直接アップロード(IMG-55GwGQnp-1585211003431)(資産/ 1584875740800.png)ダウン画像を保存することが推奨され、セキュリティチェーン機構を有していてもよいです]

トラッカーはまた、複数のストレージからの1つの操作を選択、負荷分散の効果を有します。

4.2、fastDFSファイルのダウンロードプロセス

[画像のダンプはチェーンが失敗し、発信局は、直接アップロード(IMG-TA857ey2-1585211003434)(資産/ 1584876101834.png)ダウン画像を保存することが推奨され、セキュリティチェーン機構を有していてもよいです]

5、FastDFS組み合わせとnginxの

ロード・バランシング・トラッカーを行うには5.1、

同時性の高い金額を運ぶためには、トラッカーのクラスタを行うことができます。nginxの負荷分散を使用する必要があります。

5.2、nginxのfastdfs-nginxの、プラグインモジュールの役割

トラッカーサーバー、ストレージ、ストレージ、ストレージサーバ上のが、ファイルのコピーを入力するには、同じグループの必要性の間でファイルサーバ、ストレージ、同期遅延の問題により、FastDFS

成功したファイルのアップロードIDがクライアントに返された後、ストレージサーバ11にファイルをアップロードするためにトラッカーサーバーを想定しています。この時点で、FastDFSストレージクラスタメカニズムは、ファイルのテイク12ストレージ・サーバー内のファイルIDた場合、ファイルはクライアントのコピーを完了していない場合は、ファイルにアクセスすることはできません、ストレージストレージサーバ12の同じセットにファイルを同期しますエラー。(ストレージサーバ11とストレージサーバ12は、同じストレージグループです)

しかし、ストレージサーバのストレージグループの間で、同期遅延の問題を同じファイルコピーにアクセスする必要があります

成功したファイルのアップロードIDがクライアントに返された後、ストレージサーバ11にファイルをアップロードするためにトラッカーサーバーを想定しています。この時点で、FastDFSストレージクラスタメカニズムは、ファイルのテイク12ストレージ・サーバー内のファイルIDた場合、ファイルはクライアントのコピーを完了していない場合は、ファイルにアクセスすることはできません、ストレージストレージサーバ12の同じセットにファイルを同期しますエラー。(ストレージサーバ11とストレージサーバ12は、同じストレージグループです)

ファイルは、ファイル取るソースサーバー(ストレージサーバ11)をアップロードするときfastdfs-nginxのモジュールの接続は、ファイルにリダイレクトすることができため、到達不能エラーによる遅延を回避ファイルのコピークライアントを。

公開された29元の記事 ウォンの賞賛0 ビュー2248

おすすめ

転載: blog.csdn.net/rootDream/article/details/105121617