崩溃!前同事把文件直接存到了服务器上

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储OSS,敏感数据保护2.0 200GB 1年
对象存储 OSS,恶意文件检测 1000次 1年
简介: 崩溃!前同事把文件直接存到了服务器上

前言

这两天,小面接手了一个前同事维护的项目,当看到系统里将上传的文件直接存放在单个服务器目录时,小面眼前一黑,目前存放在该目录的文件总量已有近千 G,如果服务部署到其它服务器,那还需要将该目录文件同步复制到服务器,唯一庆幸的是当前目录的文件没有丢失和损坏。

众所周知,将文件存储在单台服务器上存在性能瓶颈,容灾、垂直扩展性差等诸多问题。如果某天存储文件的服务突然 down 了怎么办?可能有人会说定时将文件系统备份,例如云服务器都有定时自动备份功能,当宕机的时候,迅速切换到另一台,但是这样需要人工来干预,且存在时延问题,线上系统会有几分钟的不可用。

另外,当存储的文件超过数百 T 的时候怎么办?单台服务器的网络性能也存在瓶颈等问题。

因此,系统在设计时就应该考虑引入分布式文件系统。

分布式存储系统,是将数据分散存储在多台服务器上,利用多台服务器分担存储负荷以及网络流量,它不但提高了系统的可靠性、可用性和存取效率,还易于扩展。

目前商用的文件存储服务有很多,比如阿里云 OSS、腾讯云、华为云等等,对于许多中小型企业来说,如果不考虑上云,或者为了节约成本,也可以选择开源的分布式存储中间件自行部署,例如 FastDfs,HDFS, MinIO 等。

MinIO

MinIO offers high-performance, S3 compatible object storage. Native to Kubernetes, MinIO is the only object storage suite available on every public cloud, every Kubernetes distribution, the private cloud and the edge. MinIO is software-defined and is 100% open source under GNU AGPL v3.


在MinIO 官网,介绍其能提供高性能、S3 兼容的对象存储。是 Kubernetes 的原生产品,是唯一一个可在每个公共云、每个 Kubernetes 发行版、私有云和边缘上使用的对象存储套件。MinIO 是软件定义的,在 GNU AGPL v3 下是 100%开源的。

安装

独立安装

独立的 MinIO 部署由具有一个或多个磁盘的单个 minio 服务器进程组成。独立部署最适合本地开发环境。

  1. 安装 minio server

linux 环境下, 64-bit Intel

curl https://dl.minio.org.cn/server/minio/release/linux-amd64/minio \
  --create-dirs \
  -o $HOME/minio-binaries/minio
chmod +x $HOME/minio-binaries/minio
export PATH=$PATH:$HOME/minio-binaries/
minio --help

64-bit PPC

curl https://dl.minio.org.cn/server/minio/release/linux-ppc64le/minio \
  --create-dirs \
  -o $HOME/minio-binaries/minio
chmod +x $HOME/minio-binaries/minio
export PATH=$PATH:$HOME/minio-binaries/
minio --help
  1. 添加 TLS/SSL 证书(可选)

通过指定 MinIO 证书目录的私钥 (.key) 和公共证书 (.crt), 启用与 MinIO 服务器的 TLS/SSL 连接:

  • 对于 Linux/MacOS:${HOME}/.minio/certs
  • 对于 Windows:%%USERPROFILE%%.minio\certs

如果 MinIO 服务器在证书目录中检测到所需的证书,则会自动启用 TLS/SSL 连接。

  1. 启动 minio server

按照以下命令启动服务器, 以下示例是假定当前主机至少有四个磁盘。

export MINIO_ROOT_USER=minio-admin
export MINIO_ROOT_PASSWORD=minio-secret-key-CHANGE-ME
export MINIO_KMS_SECRET_KEY=my-minio-encryption-key:bXltaW5pb2VuY3J5cHRpb25rZXljaGFuZ2VtZTEyMwo=
minio server /mnt/disk{1...4}/data
  1. 连接到 minio server

使用 MinIO Client (mc) 命令从本机连接到运行 minio 服务器的主机。

mc alias set mylocalminio 192.0.2.10:9000 minioadmin minio-secret-key-CHANGE-ME

ip 和端口需要替换为实际环境变量。

最终可以登录 admin 管理后台管理文件:


集群安装

集群环境的安装方式可以参考官网文档: 集群安装

Springboot 集成 minio

1.maven 导入依赖

在项目的 pom.xml 添加依赖

<dependency>
      <groupId>io.minio</groupId>
      <artifactId>minio</artifactId>
      <version>8.3.0</version>
    </dependency>

2.配置参数

在 application-*.yml 文件中添加 minio 配置参数。

minio:
  endpoint: https://xxx.com
  accessKey: admin
  secretKey: admin
  upload-expiry: 432000

3.读取连接参数

新建 Minio 配置类,实例化 MinioClient。

@Configuration
@ConfigurationProperties("spring.minio")
@Data
public class MinioConfig {
    private String endpoint;
    private String accessKey;
    private String secretKey;
    private int uploadExpiry;
    @Bean
    public MinioClient minioClient(){
        return MinioClient.builder()
                .endpoint(this.getEndpoint())
                .credentials(this.getAccessKey(),this.getSecretKey())
                .build();
    }
}

4.生成加签 URL, 供前端上传文件

前端页面上传文件时,首先提供要上传的文件信息,调用接口生成预置上传文件地址。

private String generatePresignedUploadUrl(String bucketName, String filePath, Map<String, String> extendData) {
        HashMap<String, String> extraHeaders = new HashMap<>();
        extraHeaders.put("Content-Type", "application/octet-stream");
        extraHeaders.put("Content-Disposition", "attachment");
        try {
            String url = minioClient.getPresignedObjectUrl(
                    GetPresignedObjectUrlArgs.builder()
                            .method(Method.PUT)
                            .bucket(bucketName)
                            .object(filePath)
                            .extraHeaders(extraHeaders)
                            .expiry(minioConfig.getUploadExpiry())
                            .extraQueryParams(extendData)
                            .build()
            );
            return url;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

5.生成下载文件地址

private String getPresignedDownloadUrl(String bucketName, String storageFullPath) {
    //生成url
    try {
        String url = minioClient.getPresignedObjectUrl(
                GetPresignedObjectUrlArgs.builder()
                        .method(Method.GET)
                        .bucket(bucketName)
                        .object(storageFullPath)
                        .expiry(minioConfig.getUploadExpiry())
                        .build()
        );
        return url;
    } catch (Exception e) {
        log.error("获取加签URL出错:{}", e.getMessage());
        throw new RuntimeException(e);
    }
}

6.前端根据上传文件地址直传文件

<script type="text/javascript">
    $(function () {
      // 地址通过上文接口方法获取
      var putFileUrl = "https://xxx.com/1.png?respongse-content-type**";
      // 提交
      $("#uploadForm").on("submit", function (event) {
        // this为当前form对象
        var form = this;
        $.ajax({
          url: putFileUrl,
          type: "put",
          // 文件对象
          data:  $('#file')[0].files[0],
          dataType: "JSON",
          // 异步
          async: true,
          processData: false,
          contentType: false,
          error: function (xhr, status, error) {
            alert("上传失败!");
          },
          success: function (result) {
            alert("上传成功!");
          },
        });
        return false;
      });
    });
</script>

7.上传下载效果展示


获取上传文件地址


获取下载地址

小结

本文简单介绍了 minio 的安装,以及 java 对 minio 的使用方法。后续会进一步针对 minio 的存储机制、多租户机制的实现原理做详细介绍,敬请期待!

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
2月前
|
机器学习/深度学习 存储 监控
内部文件审计:企业文件服务器审计对网络安全提升有哪些帮助?
企业文件服务器审计是保障信息安全、确保合规的关键措施。DataSecurity Plus 是由卓豪ManageEngine推出的审计工具,提供全面的文件访问监控、实时异常告警、用户行为分析及合规报告生成功能,助力企业防范数据泄露风险,满足GDPR、等保等多项合规要求,为企业的稳健发展保驾护航。
|
2月前
|
安全 Linux Shell
使用SCP命令在CentOS 7上向目标服务器传输文件
以上步骤是在CentOS 7系统上使用SCP命令进行文件传输的基础,操作简洁,易于理解。务必在执行命令前确认好各项参数,尤其是目录路径和文件名,以避免不必要的传输错误。
203 17
|
2月前
|
自然语言处理 Unix Linux
解决服务器中Jupyter笔记本的文件名字符编码问题
通过上述步骤,可以有效解决Jupyter笔记本的文件名字符编码问题,确保所有文件能在服务器上正常访问并交互,避免因编码问题引起的混淆和数据丢失。在处理任何编码问题时,务必谨慎并确保备份,因为文件名变更是
97 17
|
2月前
|
安全 Linux 网络安全
Python极速搭建局域网文件共享服务器:一行命令实现HTTPS安全传输
本文介绍如何利用Python的http.server模块,通过一行命令快速搭建支持HTTPS的安全文件下载服务器,无需第三方工具,3分钟部署,保障局域网文件共享的隐私与安全。
407 0
|
5月前
|
Python
使用Python实现multipart/form-data文件接收的http服务器
至此,使用Python实现一个可以接收 'multipart/form-data' 文件的HTTP服务器的步骤就讲解完毕了。希望通过我的讲解,你可以更好地理解其中的逻辑,另外,你也可以尝试在实际项目中运用这方面的知识。
246 69
|
10月前
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
201 9
|
6月前
|
前端开发 Cloud Native Java
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
|
8月前
|
存储 安全 网络安全
服务器感染了.baxia勒索病毒,如何确保数据文件完整恢复?
近年来,勒索病毒如.baxia不断演变,利用漏洞、社交工程等手段加密文件,威胁范围扩大。加密货币的兴起使其支付方式更匿名,追踪困难。技术支持尤为重要,添加技术服务号(shuju315),专业团队提供数据恢复方案。面对复杂解密要求,包括赎金支付、个人信息提供和执行特定操作,需保持冷静并寻求帮助。防御措施包括加强安全意识、定期备份数据、安装杀毒软件、避免未知文件、更新系统及制定应急响应计划。
319 11
|
11月前
|
前端开发 Docker 容器
主机host服务器和Docker容器之间的文件互传方法汇总
Docker 成为前端工具,可实现跨设备兼容。本文介绍主机与 Docker 容器/镜像间文件传输的三种方法:1. 构建镜像时使用 `COPY` 或 `ADD` 指令;2. 启动容器时使用 `-v` 挂载卷;3. 运行时使用 `docker cp` 命令。每种方法适用于不同场景,如静态文件打包、开发时文件同步及临时文件传输。注意权限问题、容器停止后的文件传输及性能影响。
2724 0
|
11月前
|
Python
Flask学习笔记(三):基于Flask框架上传特征值(相关数据)到服务器端并保存为txt文件
这篇博客文章是关于如何使用Flask框架上传特征值数据到服务器端,并将其保存为txt文件的教程。
148 0
Flask学习笔记(三):基于Flask框架上传特征值(相关数据)到服务器端并保存为txt文件

热门文章

最新文章