[ 云计算 | AWS 实践 ] 基于 Amazon S3 协议搭建个人云存储服务

本文收录于【#云计算入门与实践 - AWS】专栏中,收录 AWS 入门与实践相关博文。
本文同步于个人公众号:【云计算洞察】
更多关于云计算技术内容敬请关注:CSDN【#云计算入门与实践 - AWS】专栏。
本系列已更新博文:
- [ 云计算 | AWS 实践 ] Java 应用中使用 Amazon S3 进行存储桶和对象操作完全指南
- [ 云计算 | AWS 实践 ] Java 如何重命名 Amazon S3 中的文件和文件夹
- [ 云计算 | AWS 实践 ] 使用 Java 列出存储桶中的所有 AWS S3 对象
- [ 云计算 | AWS 实践 ] 使用 Java 更新现有 Amazon S3 对象
- [ 云计算 | AWS 实践 ] 基于 Amazon S3 协议搭建个人云存储服务
文章目录
- 一、前言
- 二、关于 MinIO
- 2.1 什么是 MinIO
- 2.2 对象存储的工作原理
- 三、安装 MinIO
- 3.1 使用 Docker 安装 MinIO
- 3.2 测试访问 MinIO
- 四、使用 MinIO 相关配置及操作
- 4.1. MinIO 客户端相关配置操作
- 4.1.1 部署安装MinIO Client可执行程序
- 4.1.2 MinIO 客户端相关配置操作
- 4.2 MiniIO 控制台相关配置操作
- 五、使用 Java 操作 MinIO 对象(原生操作与亚马逊 Java SDK操作)
- 5.1 原生操作 MinIO
- 5.2 使用亚马逊 Java API 操作 MinIO
- 六、文末总结
一、前言
MinIO 是一个高性能的对象存储系统。它被设计为云原生存储系统的替代方案。事实上,其 API 与 Amazon S3 完全兼容;MinIO 也提供兼容阿里云等国内云厂商的 API,由于本文篇幅问题,在本博文中,只介绍亚马逊 AWS 与其关联的案例以及如何快速使用 MinIO。
二、关于 MinIO
2.1 什么是 MinIO
Minio 是 GlusterFS 创始人之一 Anand Babu Periasamy 发布新的开源项目。MinIO 从一开始就被设计为完全兼容 Amazon S3 存储 API 的替代方案。
传说是最兼容的 S3 替代方案,同时还提供可比的性能和可扩展性。
MinIO 还提供多种部署选项。它可以作为本机应用程序在大多数流行的架构上运行,也可以使用 Docker 或 Kubernetes 部署为容器化应用程序。
此外,MinIO 是开源软件。 组织可以根据 AGPLv3 许可证(许可协议点击这里)的条款免费使用它。请注意,除了在线文档和 MinIO 用户社区之外,此选项不提供任何支持。对于大型企业,还可以提供带有专门支持的付费订阅。
MinIO 的 GitHub 地址:https://github.com/minio/minio
由于其 S3 API 兼容性、在各种部署中运行的能力以及开源特性,MinIO 是一款出色的开发和测试以及 DevOps 工具场景。
2.2 对象存储的工作原理
对象存储的概念与标准 Linux 文件系统类似,但我们使用存储桶和对象来代替目录和文件.
存储桶可以像目录一样嵌套到层次结构中,而对象可以被认为只是字节的集合。这些集合可以是任意字节数组或普通文件,例如图像、PDF 等。
一个示例对象存储系统可能如下所示:
/
/images/imge1.pngimage2.jpg
/videos/video1.mp4
/users//bluetata/status-report.docx
就像目录和文件一样,存储桶和对象也可以拥有权限。 这允许对数据进行细粒度的访问控制,特别是在拥有许多用户的大型组织中。
三、安装 MinIO
3.1 使用 Docker 安装 MinIO
如前所述,MinIO 几乎适用于所有平台。有适用于 Windows、Linux 和 MacOS 的独立安装程序。然而,出于开发和测试目的,最简单的入门方法是使用容器化发行版。
MinIO 需要一个持久卷来存储配置和应用程序数据。但是,出于测试目的,可以通过简单地传递一个目录(/data在下面的示例中)来启动 MinIO 。该目录是在容器启动时在容器文件系统中创建的。但是容器退出后所有的数据都丢失了。如果打算持久化,进行挂载即可。
docker run \-p 9000:9000 \-p 9001:9001 \-e "MINIO_ROOT_USER=MINIO_ROOT_USER" \-e "MINIO_ROOT_PASSWORD=MINIO_ROOT_PASSWORD" \minio/minio server /data --console-address ":9001"
执行状态截图如下

虽然容器化部署非常适合评估 MinIO,但需要注意一些限制。
具体来说,一些高级功能(例如版本控制、对象锁定和存储桶复制)将不起作用。这些功能需要MinIO的分布式部署,这在单服务器部署中是不可用的。
另外注意上述的命令已经设置了 MinIO 的用户名和密码。如果此处没有设置也可以按照后文客户端在设置一次。
3.2 测试访问 MinIO
可以直接访问:http://你的ip地址:9001/login 来访问你的 MinIO

四、使用 MinIO 相关配置及操作
可以通过多种不同的方式与 MinIO 服务器交互以及管理存储桶和对象。下面,我们就来一一讲解。
4.1. MinIO 客户端相关配置操作
4.1.1 部署安装MinIO Client可执行程序
首先要在自己的系统中部署 MinIO Client 可执行程序,不然所有的 mc 命令都会不识别,会出现如下错误:
-bash: mc: command not found
解决办法是:
wget https://dl.minio.io/client/mc/release/linux-amd64/mc
chmod +x mc
sudo mv mc /usr/local/bin
4.1.2 MinIO 客户端相关配置操作
MinIO 客户端 提供与 Linux 文件管理命令相同的命令,例如cp和ls等,但专为本地和远程存储系统而设计。它与 AWS S3 完全兼容,其语法模仿 AWS 客户端工具的语法。
使用 MinIO 客户端的第一步是将其配置为与云存储系统通信。让我们将其指向上面的容器化部署:
mc alias set docker_minio http://127.0.0.1:9000 MINIO_ROOT_USER MINIO_ROOT_PASSWORD
这个命令是使用 MinIO Client(mc)设置一个别名(alias)。具体来说,它创建了一个名为 docker_minio 的别名,连接到地址为 http://127.0.0.1:9000 的 MinIO 实例,并使用用户名 MINIO_ROOT_USER 和密码 MINIO_ROOT_PASSWORD 进行身份验证。
这里是单独的为客户端配置,如果已经按照上述的在安装过程中设置了用户名与密码,可以直接访问即可。
我们可以使用admin子命令验证连接:
[root@aliyun-bluetata-hub-01 user1]# mc admin info docker_minio
● 127.0.0.1:9000Uptime: 1 hourVersion: 2023-11-20T22:40:07ZNetwork: 1/1 OKDrives: 1/1 OKPool: 1Pools:1st, Erasure sets: 1, Drives per erasure set: 125 KiB Used, 1 Bucket, 1 Object
1 drive online, 0 drives offline
执行的截图如下:

现在,我们可以开始执行创建存储桶和对象等基本操作。许多 MinIO 客户端子命令模仿熟悉的 Linux 命令:
- cp:在文件系统之间复制文件或对象。
- ls:列出存储桶中的文件或对象。
- mb:创建存储桶(类似于 Linux 上的 mkdir)。
- mv:将文件或对象从一个文件系统移动/重新定位到另一个文件系统。
- rb:删除存储桶(类似于 Linux 上的 rmdir)。
- rm:删除文件或对象。
大多数子命令都适用于本地文件系统和云存储。例如,我们可以使用以下命令序列创建新的存储桶,将文件复制到该存储桶中,在存储桶之间移动对象,然后删除存储桶:
mc mb user1
mc cp ~/test.pdf prattm
mc mb user2
mc cp user1/test.pdf user2
mc rb user1
mc ls user2
[2023-11-22 21:39:10 MDT] 491K test.pdf
4.2 MiniIO 控制台相关配置操作
在 MinIO 部署中管理数据的另一种方法是使用基于 Web 的管理控制台。通过容器化部署,我们首先在 Web 浏览器中打开地址 http://127.0.0.1:9001。我们使用默认凭据登录MINIO_ROOT_USER/ MINIO_ROOT_PASSWORD。
如果你是远程服务器,那么 ip 就换成你的远程服务器公网 ip 即可。
我们可以创建我们的第一个存储桶:

进入到创建存储桶页面后,直接输入所要创建的名称后,点击创建存储桶。

在这之前我们有讲过:并非所有选项(例如版本控制)都适用于我们的容器化部署。
现在,我们可以导航到对象浏览器并单击我们的新存储桶。首先,我们可以使用创建新路径按钮创建子存储桶:

另外我们还可以将文件作为新对象上传到存储桶中:

上传成功后,后台服务器存储文件的位置:

一般来说,MinIO 管理控制台的功能与命令行客户端的功能相同。然而,它确实有一些细微的差别。
首先,客户端不可能像命令行客户端那样在存储桶之间移动对象。
另外,命令行客户端还有许多子命令在管理控制台中并不存在。例如,diff、du 和 pipe 子命令都模仿了标准的 Linux 命令,在管理控制台中没有相应的命令。
五、使用 Java 操作 MinIO 对象(原生操作与亚马逊 Java SDK操作)
5.1 原生操作 MinIO
我们将介绍的使用 MinIO 的最后一种方法是使用 Java SDK。首先,我们在应用程序中包含所需的依赖项:
<dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.5.2</version>
</dependency>
使用 Java SDK 的第一步是创建客户端实例:
MinioClient minioClient =MinioClient.builder().endpoint("http://127.0.0.1:9000").credentials("minioadmin", "minioadmin").build();
此客户端可以使用命令行工具和管理控制台执行我们之前看到的所有相同操作。例如我们可以创建一个Bucket:
minioClient.makeBucket(MakeBucketArgs.builder().bucket("user1").build());
然后,我们可以将文件作为对象上传到该存储桶中:
minioClient.putObject(PutObjectArgs.builder().bucket("user1").object("Resume.pdf").stream(new FileInputStream("/tmp/Resume.pdf").build());
最后,让我们看看如何从存储桶中获取对象:
try (InputStream stream =minioClient.getObject(GetObjectArgs.builder().bucket("user2").object("Resume.pdf").build())) {// Read the stream
}
5.2 使用亚马逊 Java API 操作 MinIO
同样的在使用之前先要引入依赖包
<dependency><groupId>software.amazon.awssdk</groupId><artifactId>s3</artifactId><version>2.21.0</version>
</dependency>
下面直接贴出使用 Amazon JDK 操作对象的相关代码:
public class S3Test {public static void main(String[] args) throws Exception{AmazonS3 s3Client= S3Utils.getS3Client("MINIO_ROOT_USER","MINIO_ROOT_PASSWORD","http://172.0.0.1:9000");List<Bucket> bucketList=s3Client.listBuckets();List<Bucket> myBuckets=bucketList.stream().filter(bucket -> bucket.getName().equals("bucket01")).collect(Collectors.toList());if(myBuckets.size() < 1){s3Client.createBucket("bucket01");}putObject(s3Client);S3Object s3Object = s3Client.getObject("bucket01","test2.jpg");downLoadObject(s3Object);System.out.println(bucketList);ListObjectsV2Result result = s3Client.listObjectsV2("bucket01");List<S3ObjectSummary> objects = result.getObjectSummaries();for (S3ObjectSummary os : objects) {System.out.println("含有的文件:" + os.getKey());}// 共享文件generatePresignedUrl(s3Client,"bucket01", "test2.jpg");}public static void putObject(AmazonS3 s3Client) throws Exception{File localFile=new File("D:\\bluetata\\test1.txt");ObjectMetadata metadata = new ObjectMetadata();metadata.setContentType("text/plain");//metadata.setContentLength(5);String s3FileFullPath = UUID.randomUUID()+"a.txt";PutObjectResult putResult = s3Client.putObject("bucket01", s3FileFullPath, new FileInputStream(localFile), metadata);System.out.println(putResult);}public static void downLoadObject(S3Object s3Object) throws Exception{File targetFile=new File("D:\\bluetata\\test2.jpg");OutputStream out=new FileOutputStream(targetFile);try(BufferedInputStream bufferedInputStream = new BufferedInputStream(s3Object.getObjectContent())){int len ;byte[] buffer = new byte[1024];while((len=bufferedInputStream.read(buffer))!=-1){out.write(buffer, 0, len);}out.flush();}catch (IOException e){GlobalException.throwException(e.getMessage());}out.close();}public static String generatePresignedUrl(AmazonS3 s3Client,String bucketName, String key){GeneratePresignedUrlRequest urlRequest = new GeneratePresignedUrlRequest(bucketName, key);Date expirationDate = null;try {expirationDate = new SimpleDateFormat("yyyy-MM-dd").parse("2021-09-19");} catch (Exception e) {e.printStackTrace();}//设置过期时间urlRequest.setExpiration(expirationDate);URL url =s3Client.generatePresignedUrl(urlRequest);System.out.println(url);return url.getPath();}}
六、文末总结
文章探讨了 MinIO 这一高性能对象存储系统的重要性和功能。它具备兼容 Amazon S3 API、多种部署选项以及开源特性等优势,适用于各种场景,从开发测试到 DevOps 工具应用。
文中详细介绍了 MinIO 的安装、配置和操作方式,涵盖了使用 Docker 安装、命令行客户端操作、控制台管理、以及使用 Java 原生操作和亚马逊 Java SDK 操作 MinIO 对象的方法。这些方法不仅帮助用户理解 MinIO 的基本操作,还展示了其与其他系统的兼容性和灵活性,使其成为一个强大而多功能的存储解决方案。
[ 本文作者 ] bluetata
[ 原文链接 ] https://bluetata.blog.csdn.net/article/details/134566027
[ 最后更新 ] 11/23/2023 2:15
[ 版权声明 ] 如果您在非 CSDN 网站内看到这一行,
说明网络爬虫可能在本人还没有完整发布的时候就抓走了我的文章,
可能导致内容不完整,请去上述的原文链接查看原文。
相关文章:
[ 云计算 | AWS 实践 ] 基于 Amazon S3 协议搭建个人云存储服务
本文收录于【#云计算入门与实践 - AWS】专栏中,收录 AWS 入门与实践相关博文。 本文同步于个人公众号:【云计算洞察】 更多关于云计算技术内容敬请关注:CSDN【#云计算入门与实践 - AWS】专栏。 本系列已更新博文: [ 云计算 | …...
第二十章:多线程
进程 线程的特点 1.进程是资源分配的最小单位,线程是最小的执行单位 2.一个进程可以有多个线程 3.线程共享进程资源 package twentyth; public class ThreadTest extends Thread { public void run() { for (int i 1; i < 10; i) {//继承重…...
CentOS 7启动时报“Started Crash recovery kernel arming.....shutdown....”问题处理过程
有台虚拟机由于CPU负载过高而宕机,宕机重启后停在“Started Crash recovery kernel arming…shutdown…”阶段,如下所示: 重置虚拟机,进入grub菜单,按e编辑启动选项,在linux16 行末,加上&…...
Android 13 - Media框架(14)- OpenMax(二)
这一节我们将来解析 media.codec 这个 HIDL service 究竟提供了什么服务,服务是如何启动的。 1、main 函数 我们先来看 frameworks/av/services/mediacodec/main_codecservice.cpp: int main(int argc __unused, char** argv) {strcpy(argv[0], "…...
【Python大数据笔记_day11_Hadoop进阶之MR和YARNZooKeeper】
MR 单词统计流程 已知文件内容: hadoop hive hadoop spark hive flink hive linux hive mysql input结果: k1(行偏移量) v1(每行文本内容)0 hadoop hive hadoop spark hive 30 flink hive linux hive mysql map结果:k2(split切割后的单词) v2(拼接…...
飞桨——总结PPOCRLabel中遇到的坑
操作系统:win10 python环境:python3.9 paddleocr项目版本:2.7 1.报错:ModuleNotFoundError: No module named Polygon(已解决) 已解决所以没有复现报错内容 尝试方法一:直接使用pip命令安装&…...
LeetCode(30)长度最小的子数组【滑动窗口】【中等】
目录 1.题目2.答案3.提交结果截图 链接: 长度最小的子数组 1.题目 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl1, ..., numsr-1, numsr] ,并返回其长度。如果…...
Niushop 开源商城 v5.1.7:支持PC、手机、小程序和APP多端电商的源码
Niushop 系统是一款基于 ThinkPHP6 开发的电商系统,提供了丰富的功能和完善的商品机制。该系统支持普通商品和虚拟商品,并且针对虚拟商品还提供了完善的核销机制。同时,它也支持新时代的商业模式,如拼团、分销和多门店砍价等营销活…...
Navmesh 寻路
用cocos2dx引擎简单实现了一下navmesh的多边形划分,然后基于划分多边形的a*寻路。以及路径拐点优化算法 用cocos主要是方便使用一些渲染接口和定时器。重点是实现的原理。 首先画了一个带有孔洞的多边形 //多边形的顶点数据Vec2(100, 100),Vec2(300, 200),Vec2(50…...
YOLOv5 分类模型 数据集加载 3
YOLOv5 分类模型 数据集加载 3 自定义类别 flyfish YOLOv5 分类模型 数据集加载 1 样本处理 YOLOv5 分类模型 数据集加载 2 切片处理 YOLOv5 分类模型的预处理(1) Resize 和 CenterCrop YOLOv5 分类模型的预处理(2)ToTensor 和 …...
『亚马逊云科技产品测评』活动征文|AWS 存储产品类别及其适用场景详细说明
授权声明:本篇文章授权活动官方亚马逊云科技文章转发、改写权,包括不限于在 Developer Centre, 知乎,自媒体平台,第三方开发者媒体等亚马逊云科技官方渠道 目录 前言、AWS 存储产品类别 1、Amazon Elastic Block Store (EBS) …...
Mac | Vmware Fusion | 分辨率自动还原问题解决
1. 问题 Mac的Vmware Fusion在使用Windows10虚拟机时,默认显示器配置如下: 开机进入系统并变更默认分辨率后,只要被 ⌘Tab 切换分辨率就会还原到默认,非常影响体验。 2. 解决方式 调整 设置 -> 显示器 -> 虚拟机分辨率…...
SQL知多少?这篇文章让你从小白到入门
个人网站 本文首发公众号小肖学数据分析 SQL(Structured Query Language)是一种用于管理和处理关系型数据库的编程语言。 对于想要成为数据分析师、数据库管理员或者Web开发人员的小白来说,学习SQL是一个很好的起点。 本文将为你提供一个…...
centos7安装MySQL—以MySQL5.7.30为例
centos7安装MySQL—以MySQL5.7.30为例 本文以MySQL5.7.30为例。 官网下载 进入MySQL官网:https://www.mysql.com/ 点击DOWNLOADS 点击链接; 点击如上链接: 选择对应版本: 点击下载。 安装 将下载后的安装包上传到/usr/local下…...
3.计算机网络补充
2.5 HTTPS 数字签名:发送端将消息使⽤ hash 函数⽣成摘要,并使⽤私钥加密后得到“数字签名”,并将其附在消息之后。接收端使⽤公钥对“数字签名”解密,确认发送端身份,之后对消息使⽤ hash 函数处理并与接收到的摘要对…...
【云原生】Spring Cloud Alibaba 之 Gateway 服务网关实战开发
目录 一、什么是网关 ⛅网关的实现原理 二、Gateway 与 Zuul 的区别? 三、Gateway 服务网关 快速入门 ⛄需求 ⏳项目搭建 ✅启动测试 四、Gateway 断言工厂 五、Gateway 过滤器 ⛽过滤器工厂 ♨️全局过滤器 六、源码地址 ⛵小结 一、什么是网关 Spri…...
opencv-直方图均衡化
直方图均衡化是一种用于增强图像对比度的图像处理技术。它通过调整图像的灰度级别分布,使得图像中各个灰度级别的像素分布更均匀,从而提高图像的对比度。 在OpenCV中,你可以使用cv2.equalizeHist()函数来进行直方图均衡化。 以下是一个简单…...
npm install安装报错
npm WARN notsup Not compatible with your version of node/npm: v-click-outside-x3.7.1 npm ERR! Error while executing: npm ERR! /usr/bin/git ls-remote -h -t ssh://gitgithub.com/itargaryen/simple-hotkeys.git 解决办法1:(没有解决我的问题…...
Spring Boot创建和使用(重要)
Spring的诞生是为了简化Java程序开发的! Spring Boot的诞生是为了简化Spring程序开发的! Spring Boot就是Spring框架的脚手架,为了快速开发Spring框架而诞生的!! Spring Boot的优点: 快速集成框架&#x…...
python 基于gdal,richdem,pysheds实现 实现洼填、D8流向,汇流累计量计算,河网连接,分水岭及其水文分析与斜坡单元生成
python gdal实现水文分析算法及其斜坡单元生成 实现洼填、D8流向,汇流累计量计算,河网连接,分水岭 # utf-8 import richdem as rdre from River import * from pysheds.grid import Grid import time from time import time,sleep import numpy as np from osgeo import g…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
Mac flutter环境搭建
一、下载flutter sdk 制作 Android 应用 | Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 1、查看mac电脑处理器选择sdk 2、解压 unzip ~/Downloads/flutter_macos_arm64_3.32.2-stable.zip \ -d ~/development/ 3、添加环境变量 命令行打开配置环境变量文件 ope…...
验证redis数据结构
一、功能验证 1.验证redis的数据结构(如字符串、列表、哈希、集合、有序集合等)是否按照预期工作。 2、常见的数据结构验证方法: ①字符串(string) 测试基本操作 set、get、incr、decr 验证字符串的长度和内容是否正…...
计算机系统结构复习-名词解释2
1.定向:在某条指令产生计算结果之前,其他指令并不真正立即需要该计算结果,如果能够将该计算结果从其产生的地方直接送到其他指令中需要它的地方,那么就可以避免停顿。 2.多级存储层次:由若干个采用不同实现技术的存储…...
构建Docker镜像的Dockerfile文件详解
文章目录 前言Dockerfile 案例docker build1. 基本构建2. 指定 Dockerfile 路径3. 设置构建时变量4. 不使用缓存5. 删除中间容器6. 拉取最新基础镜像7. 静默输出完整示例 docker runDockerFile 入门syntax指定构造器FROM基础镜像RUN命令注释COPY复制ENV设置环境变量EXPOSE暴露端…...
