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

本文涉及的产品
对象存储 OSS,20GB 3个月
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
对象存储 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 的存储机制、多租户机制的实现原理做详细介绍,敬请期待!

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
5天前
|
文字识别 算法 API
视觉智能开放平台产品使用合集之保存视频图片,存到自己服务器,该如何操作
视觉智能开放平台是指提供一系列基于视觉识别技术的API和服务的平台,这些服务通常包括图像识别、人脸识别、物体检测、文字识别、场景理解等。企业或开发者可以通过调用这些API,快速将视觉智能功能集成到自己的应用或服务中,而无需从零开始研发相关算法和技术。以下是一些常见的视觉智能开放平台产品及其应用场景的概览。
|
6天前
|
数据安全/隐私保护
|
12天前
|
存储 运维 数据挖掘
服务器数据恢复—raid5热备盘同步失败导致阵列崩溃的数据恢复案例
某品牌DS5300存储,包含一个存储机头和多个磁盘柜,组建了多组RAID5磁盘阵列。 某个磁盘柜中的一组RAID5阵列由15块数据盘和1块热备硬盘组建。该磁盘柜中的某块硬盘离线,热备盘自动替换并开始同步数据,在热备硬盘同步数据的过程中,又有一块硬盘出现问题离线,数据同步失败,该RAID5阵列失效,卷无法挂载访问。
|
21天前
|
存储 数据挖掘
服务器数据恢复—EMC存储raid5磁盘阵列崩溃的数据恢复案例
一台EMC某型号存储由于存储中raid5阵列出现故障导致服务器崩溃,由于数据涉密,需要工程师到现场恢复数据。 服务器数据恢复工程师到现场后对数据进行检测,经过检测发现服务器崩溃是由于raid中某些硬盘掉线所导致。将所有磁盘编号后取出,硬件工程师对所有磁盘进行检测后没有发现有硬盘存在物理故障,也没有坏道。数据恢复工程师将所有磁盘以只读方式做扇区级的全盘镜像,镜像完成后将所有磁盘还原到原存储中,后续的数据分析和数据恢复操作都基于镜像文件进行,避免对原始磁盘数据造成二次破坏。
服务器数据恢复—EMC存储raid5磁盘阵列崩溃的数据恢复案例
|
25天前
|
存储 监控 数据挖掘
服务器数据恢复—raid5阵列两块硬盘离线后强制上线导致崩溃的数据恢复案例
服务器数据恢复环境: 某品牌2850服务器中有一组由6块SCSI硬盘组建的raid5磁盘阵列,linux操作系统+ext3文件系统。 服务器故障: 服务器运行过程中突然瘫痪。服务器管理员检查阵列后发现raid5阵列中有两块硬盘离线,将其中一块硬盘进行强制上线操作,但是服务器操作系统启动异常。这时,管理员意识到问题的严重性,马上将服务器关机,联系到我们数据恢复中心寻求帮助。
|
28天前
|
运维 数据挖掘
服务器数据恢复—某品牌X3650服务器硬盘离线崩溃的数据恢复案例
一台某品牌X3650M3服务器,服务器中有一组raid5磁盘阵列,上层采用zfs文件系统。 服务器未知原因崩溃,工作人员排查故障后发现服务器的raid5阵列中有两块硬盘离线导致该阵列不可用,服务器内的数据丢失。 数据恢复工程师在现场对故障服务器raid5阵列中的磁盘进行硬件故障检测,经过检测发现该raid5阵列中离线的两块硬盘均无硬件问题。
|
2月前
|
存储 SQL 数据挖掘
服务器数据恢复—误删除VMware虚拟机vmdk文件的数据恢复案例
服务器数据恢复环境: 某大厂PS4000服务器,服务器上部署VMware ESXi虚拟化平台。 服务器故障: 机房断电,重启后服务器中的某台虚拟机不能正常启动。管理员查看虚拟机配置文件,发现无法启动的虚拟机的配置文件除了磁盘文件以外其他配置文件全部丢失,xxx-flat.vmdk磁盘文件和xxx-000001-delta.vmdk快照文件还存在。联系VMware原厂工程师进行诊断,VMware原厂工程师尝试新建一个虚拟机,但发现存储空间不足,于是将故障虚拟机下的xxx-flat.vmdk磁盘文件删除了。VMware工程师重新建了一个虚拟机,分配了固定大小的虚拟磁盘,为虚拟机安装了Window
服务器数据恢复—误删除VMware虚拟机vmdk文件的数据恢复案例
|
2月前
|
存储 Oracle 关系型数据库
服务器数据恢复—EVA存储raid5阵列多块硬盘离线导致存储崩溃的数据恢复案例
服务器数据恢复环境: 1台某品牌EVA4400控制器+3台EVA4400扩展柜+28块FC硬盘。 服务器故障: 由于两块磁盘掉线导致存储中某些LUN不可用,某些LUN丢失,导致存储崩溃。
服务器数据恢复—EVA存储raid5阵列多块硬盘离线导致存储崩溃的数据恢复案例
|
2月前
|
Oracle 关系型数据库 Linux
服务器数据恢复—磁盘掉线但热备盘没有启用导致RAID5阵列崩溃的数据恢复案例
某公司的一台服务器中的raid5磁盘阵列有两块磁盘先后掉线,服务器崩溃。故障服务器的操作系统为linux,操作系统部署了oa,数据库为oracle。oracle数据库已经不再对该oa系统提供后续支持,用户要求尽可能恢复操作系统和数据。 经过北亚企安数据恢复工程师检测,发现热备盘完全无启用,所有硬盘不存在明显物理故障,无明显同步的表现。
服务器数据恢复—磁盘掉线但热备盘没有启用导致RAID5阵列崩溃的数据恢复案例
|
2月前
|
存储 安全 数据挖掘
服务器数据恢复—正常断电后重启的服务器中Raid5阵列崩溃的数据恢复案例
服务器数据恢复环境: 一台某品牌DL380 G4服务器,服务器通过该服务器品牌smart array控制器挂载了一台国产的磁盘阵列,磁盘阵列中有一组由14块SCSI硬盘组建的RAID5。服务器安装LINUX操作系统,搭建了NFS+FTP,作为内部文件服务器使用。 服务器故障: 搬迁机房后,工作人员将服务器和磁盘阵列打扫了一下,连接所有线缆后,将服务器和磁盘阵列开机,发现服务器无法识别RAID,提示未做初始化。 北亚企安数据恢复工程师到达现场后对服务器和磁盘阵列进行简单的初检,经过初检发现数据丢失的原因是raid信息丢失,该RAID的冗余采用双循环的校验方式。