분산 파일 저장 시스템 (fastdfs)

1, 분산 파일 저장 시스템

당신이 위, 다음 관리 사진의 파일 서버를 필요로하는 서버에 사진을 찾을 수 있도록 인해 하나 개 이상의 서버에 사진을 업로드합니다.

[이미지 소스 스테이션 보안 체인 메커니즘을 가질 수있다, 체인이 실패 덤프, 직접 업로드 아래 그림을 저장하는 것이 좋습니다 (IMG-gnnnI9Sn-1585211003406) (자산 / 1584107074588.png)]

FastDFS는 파일 서버입니다.

2, FastDFS

[이미지 소스 스테이션 보안 체인 메커니즘을 가질 수있다, 체인이 실패 덤프, 직접 업로드 아래 그림을 저장하는 것이 좋습니다 (IMG-kqxVUROV-1585211003408) (자산 / 1584855017183.png)]

1 개 지원 업로드는 -> 우리에게 반환 경로를 제공

2 개 지원 다운로드 -> 경로를 사용하여 다운로드

작은 파일을 분산 파일 저장 시스템 :

문서 G가 작은 파일보다 작은 파일이없이 분할 할 수 있습니다

필요 큰 파일을 분할합니다.

FastDFS는 분산 파일 스토리지 시스템은 두 부분으로 구성되어있다.

1 추적기 (추적)

2 저장 (메모리)

당신이 FastDFS의 용량을 확장하려는 경우 매우 편리 그룹은 라인에 직접 추가

[이미지 소스 스테이션 보안 체인 메커니즘을 가질 수있다, 체인이 실패 덤프, 직접 업로드 아래 그림을 저장하는 것이 좋습니다 (IMG-KvsPRBdO-1585211003425) (자산 / 1584107517026.png)]

빌드로 3, FastDFS

서버 컨테이너 FastDFS에서 만든 3.1

[이미지 소스 스테이션 보안 체인 메커니즘을 가질 수있다, 체인이 실패 덤프, 직접 업로드 아래 그림을 저장하는 것이 좋습니다 (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

4, 원리 분석 fastdfs

4.1, fastDFS 파일 업로드 과정

[이미지 소스 스테이션 보안 체인 메커니즘을 가질 수있다, 체인이 실패 덤프, 직접 업로드 아래 그림을 저장하는 것이 좋습니다 (IMG-55GwGQnp-1585211003431) (자산 / 1584875740800.png)]

추적기는 저장소들로부터 하나 개의 동작을 선택하고, 부하 분산의 효과를 갖는다.

4.2 fastDFS 파일 다운로드 프로세스

[이미지 소스 스테이션 보안 체인 메커니즘을 가질 수있다, 체인이 실패 덤프, 직접 업로드 아래 그림을 저장하는 것이 좋습니다 (IMG-TA857ey2-1585211003434) (자산 / 1584876101834.png)]

5 FastDFS 조합과의 Nginx

5.1,로드 밸런싱 추적을 할 수

동시성의 높은 금액을 수행하기 위해, 추적기 클러스터가 만들어 질 수있다. 필요성의 nginx로드 밸런싱을 사용합니다.

5.2의 nginx fastdfs-Nginx의 모듈의 역할 플러그인

스토리지, 스토리지 스토리지 서버에 트래커 서버, 파일 서버 스토리지에 의해하지만, 파일 복사, 동기화 지연의 문제를 입력하기 위해 같은 그룹의 필요 사이 FastDFS

파일 업로드에 성공한 ID가 클라이언트에 반환 된 후, 스토리지 서버 (11)에 파일을 업로드 할 트래커 서버를 가정합니다. 파일이 클라이언트의 복사본이 완료되지 않은 경우 파일 테이크 (12) 스토리지 서버의 파일 ID가 파일을 액세스 할 수 없습니다 경우이 점 FastDFS 스토리지에서 클러스터 메커니즘은 저장 스토리지 서버 (12)의 동일한 세트에 파일을 동기화합니다 오류가 발생했습니다. (저장 서버 (11) 및 스토리지 서버 (12)는 동일한 저장 기)

그러나 스토리지 서버의 저장소 그룹은 동일한 파일 복사에 대한 액세스를 동기화 지연의 문제를 필요로 사이

파일 업로드에 성공한 ID가 클라이언트에 반환 된 후, 스토리지 서버 (11)에 파일을 업로드 할 트래커 서버를 가정합니다. 파일이 클라이언트의 복사본이 완료되지 않은 경우 파일 테이크 (12) 스토리지 서버의 파일 ID가 파일을 액세스 할 수 없습니다 경우이 점 FastDFS 스토리지에서 클러스터 메커니즘은 저장 스토리지 서버 (12)의 동일한 세트에 파일을 동기화합니다 오류가 발생했습니다. (저장 서버 (11) 및 스토리지 서버 (12)는 동일한 저장 기)

파일이 파일을 가지고 원본 서버 (스토리지 서버 11)을 업로드 할 때 fastdfs-의 nginx 모듈 연결을 파일로 리디렉션 할 수 있습니다 인해 도달 할 수없는 오류로 인한 지연, 회피 파일 복사 클라이언트를.

게시 29 개 원래 기사 · 원의 칭찬 0 · 조회수 2248

추천

출처blog.csdn.net/rootDream/article/details/105121617