最新要闻
- 荷兰DUV光刻机一律管制出口?一文看懂|环球快播
- 埃安6月销量45013辆创历史新高 今年已卖出比亚迪一个月销量
- 特斯拉加入价格乱战!买这两款车最高优惠4.5万元
- 国内高端手机市场除了苹果iPhone 还能有谁?! 焦点要闻
- 2023年全国铁路暑期运输启动:满血复活 暴涨超70%
- 灭霸演员是谁_ 芝士回答
- 世界短讯!心爱的小乌龟死了:主人把它做成《七龙珠》龟仙人手办!
- 担心的事情发生了!泰国女游客卷入电动步道腿被夹断
- 火车站保洁阿姨不慎弄脏乘客衣服跪地道歉 公司回应:已和解 世界观焦点
- 蔚来智能系统Banyan 2.0正式发布:超120项功能 号称全场景领先
- 天天快播:一键打开动态日历 锁定2023下半年这些大事!
- 本田飞度彻底无语!新款马自达昂克赛拉官降3万:8.99万起_今头条
- 小米下一代旗舰还用1英寸主摄!1.33英寸还得等|快报
- 天天头条:今天起全国汽车实施国6排放标准6b阶段!对老车年检有何影响?官方解答
- 天津关于调整2023年住房公积金缴存额的通知政策解读
- 环球讯息:你敢吃吗?知了肉初上市400元一斤:号称高蛋白
广告
手机
![光庭信息跌4.57% 2021上市超募11亿2022扣非降74% 时快讯](http://www.jxyuging.com/uploadfile/2022/0610/20220610012348753.jpg)
光庭信息跌4.57% 2021上市超募11亿2022扣非降74% 时快讯
![搜狐汽车全球快讯 | 大众汽车最新专利曝光:仪表支持拆卸 可用手机、平板替代-环球关注](http://hnimg.zgyouth.cc/2022/0610/20220610115002743.jpg)
搜狐汽车全球快讯 | 大众汽车最新专利曝光:仪表支持拆卸 可用手机、平板替代-环球关注
- 光庭信息跌4.57% 2021上市超募11亿2022扣非降74% 时快讯
- 搜狐汽车全球快讯 | 大众汽车最新专利曝光:仪表支持拆卸 可用手机、平板替代-环球关注
- 视点!美国首位女总统即将诞生?拜登恐怕要提前下岗,美政坛迎来变局?
- 当前速递!用理想仪器实现更好的颗粒 德国新帕泰克亮相CPHI & PMEC China获好评
- 微粒贷怎么申请开通 开通方法如下
- 焦点简讯:心疼!这位40岁的云南缉毒警,已是满头白发
家电
全球观热点:MinIO-对象存储简单使用
MinIO
1. 基础概念
- Object:存储到minio的基本对象,如文件,字节流,Anything...
- Bucket:用来存储Object的逻辑空间。每个Bucket之间的数据是相互隔离的。对于客户端而言,就相当于一个存放文件的顶层文件夹。
- Driver:即存储数据的磁盘,在minio启动时,以参数的方式传入。MinIO中所有的对象都会存储在Drive里。
- Set:即一组Drive的集合,分布式部署根据集群规模自动划分一个或者set,每个set中的drive分布在不同的位置。一个对象存储在一个Set上。
- 一个对象存储在一个Set上
- 一个集群划分为多个set
- 一个Set包含的Drive数量是固定的,默认由系统根据集群规模自动计算得出
- 一个Set中的Drive尽可能分布在不同的节点上
2. 纠删码 EC(Erasure Code)
MinIO使用纠删码机制来保证高可靠性,使用highwayhash 来处理数据损坏 (2 Protection)。纠删码,可以通过数学计算,把丢失的数据进行还原,它可以将n份原始数据,增加m份数据,并能通过n+m份中的任意n份数据,还原为原始数据。即如果有任意小于等于m份的数据失效,仍能通过剩下的数据还原出来。
3. 单机部署
中文文档的docker部署有问题,没有暴露控制台的端口。
单机部署的命令
(资料图片)
基于centos7的部署
# 下载wget https://dl.min.io/server/minio/release/linux-amd64/archive/minio-20230616024106.0.0.x86_64.rpm -O minio.rpmsudo dnf install minio.rpm# 指定 控制台的root用户名和密码export MINIO_ROOT_USER=admin123export MINIO_ROOT_PASSWORD=admin123# 指定 控制台暴露的端口,默认使用动态的端口,并指定数据存放的目录./minio server --console-address ":50000" /data/minio-data# 如果上述命令运行成功,可以通过控制台端口50000访问minio后台,证明运行时没问题的,就停掉。然后用下面的命令后台运行minionohup ./minio server --console-address ":50000" /data/minio-data &
控制台上传一个文件可以在服务器对应的目录中找到文件,服务正常运行。
基于docker的部署
docker 部署命令
docker pull docker://minio/minio### 新版docker run --name minio \-p 9000:9000 \-p 9999:9999 \-d --restart=always \-e "MINIO_ROOT_USER=admin123" \-e "MINIO_ROOT_PASSWORD=admin123" \-v /home/smy/minio-data/data:/data \-v /home/smy/minio-data/config:/root/.minio \minio/minio server /data \--console-address "0.0.0.0:9999"
4. SpringBoot整合minio
遇到的问题
解决方法:
修改minio的依赖的okhttp的依赖版本
io.minio minio 8.2.1 com.squareup.okhttp3 okhttp org.jetbrains.kotlin kotlin-stdlib com.squareup.okhttp3 okhttp 3.14.9 org.jetbrains.kotlin kotlin-stdlib 1.3.70
https://juejin.cn/post/7209110611858309179
5. JAVA API 操作 MinIO
官方文档
主要包括桶操作和文件操作:
- 客户端的创建
- 桶 增删改查
- 文件 上传 下载 删除(过期删除)
minio上传的大小限制,分片上传最小5MB,最大5GB;整个上传最大5TB。并且当不提供objectSize的时候,必须提供partSize(适合上传文件大小未知的场景)。
putObject 上传文件后的返回对象
6. 工具类
配置类
package org.example.config;/** * @author myS * @description: MinioConfig * @date 2023/6/21 17:21 */public class MinioConfig { // 端点 单节点 public static String END_POINT = "http://192.168.1.244:9000"; // accessKey public static String ACCESS_KEY = "admin123"; // secretKey public static String SECRET_KEY = "admin123"; // bucketName 默认操作的bucket public static String BUCKET_NAME = "default";}
工具类
结合实际业务做拓展
package org.example.utils;import io.minio.*;import io.minio.messages.*;import org.example.config.MinioConfig;import javax.annotation.Nonnull;import java.io.InputStream;import java.time.ZonedDateTime;import java.util.ArrayList;import java.util.LinkedList;import java.util.List;/** * @author myS * @description: MinioUtils * @date 2023/6/21 17:20 */public class MinioUtils { public static MinioClient minioClient = null; static { minioClient = MinioClient.builder() .endpoint(MinioConfig.END_POINT) .credentials(MinioConfig.ACCESS_KEY, MinioConfig.SECRET_KEY) .build(); } // 1 桶操作 /** * 1 根据 bucketName 判断 bucket 是否存在 * @param bucketName * @return */ public static boolean bucketExists(@Nonnull String bucketName) { try { return minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build()); } catch (Exception e) { e.printStackTrace(); return false; } } /** * 2 创建bucket, 使用时不需要提前判断 bucket 是否存在 * @param bucketName * @return */ public static boolean makeBucket(@Nonnull String bucketName) { try { // 当bucket不存在的时候,创建这个bucket if (bucketExists(bucketName)) { minioClient.makeBucket(MakeBucketArgs.builder() .bucket(bucketName) .build()); } return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 3 根据bucketName删除一个bucket * @param bucketName * @return */ public static boolean removeBucket(@Nonnull String bucketName) { try { minioClient.removeBucket(RemoveBucketArgs.builder() .bucket(bucketName) .build()); return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 4 获取所有的 bucket, 使用时需要判断返回值是否为null,再进行后续操作 * @return */ public static List getAllBuckets() { try { List buckets = minioClient.listBuckets(); return buckets; } catch (Exception e) { e.printStackTrace(); return null; } } /** * 5 设置 bucket 的声明周期,设置对象过期时间 * @param bucketName 指定bucket,默认是对指定的这一个桶生效 * @param expiredDays 过期时间 单位:天 * @return */ public static boolean setBucketLifecycle (@Nonnull String bucketName, @Nonnull Integer expiredDays) { // 创建一个带过期时间规则的配置config List rules = new LinkedList<>(); rules.add( new LifecycleRule( Status.ENABLED, null, new Expiration((ZonedDateTime) null, expiredDays, null), new RuleFilter("search"), // bucket下一级的目录 "expiredRule_1", null, null, null)); LifecycleConfiguration config = new LifecycleConfiguration(rules); // 根据 config的配置,创建一个名称为 my-bucketname 的 bucket try { minioClient.setBucketLifecycle( SetBucketLifecycleArgs.builder().bucket(bucketName).config(config).build()); return true; } catch (Exception e) { e.printStackTrace(); return false; } } // 二 文件操作 /** * 上传文件并返回是否上传成功 * @param bucketName * @param inputStream 待上传文件的输入流 * @return */ public static boolean upload (@Nonnull InputStream inputStream, @Nonnull String bucketName, @Nonnull String objectName) { try { ObjectWriteResponse objectWriteResponse = minioClient.putObject( PutObjectArgs.builder() .bucket(bucketName) .stream(inputStream, -1, 1024 * 1024 * 10L) // 分片上传 10M .object(objectName) .build()); System.out.println(objectWriteResponse.region()); return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 根据bucket和objectName返回一个minio中的对象的输入流 * 因为可能为null,所以使用前需要先判null,避免发生其他错误 * @param bucketName * @param objectName * @return */ public static InputStream download (@Nonnull String bucketName, @Nonnull String objectName) { try { return minioClient.getObject(GetObjectArgs.builder() .bucket(bucketName) .object(objectName) .build()); } catch (Exception e) { e.printStackTrace(); return null; } } /** * 删除指定bucket下的名为objectName的对象 * @param bucketName * @param objectName * @return */ public static boolean removeObject(@Nonnull String bucketName, @Nonnull String objectName) { try { minioClient.removeObject(RemoveObjectArgs.builder() .bucket(bucketName) .object(objectName) .build()); return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 获取 当前bucket下的所有对象(只会列出一层) * @param bucketName * @return */ public static List getAllObjects (@Nonnull String bucketName) { List allObjects = new ArrayList<>(); try{ Iterable> results = minioClient.listObjects(ListObjectsArgs.builder() .bucket(bucketName) .build()); results.forEach(item -> { Item item1 = null; try { item1 = item.get(); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); } allObjects.add(item1.objectName()); }); } catch (Exception e) { e.printStackTrace(); } return allObjects; }}
工具类测试类
package org.example;import io.minio.MinioClient;import io.minio.messages.Bucket;import org.example.utils.MinioUtils;import org.junit.Assert;import org.junit.Test;import java.io.*;import java.nio.file.Files;import java.util.List;import java.util.Objects;import java.util.stream.Stream;/** * @author myS * @description: TODO * @date 2023/6/21 21:47 */public class MinioTest {// public static MinioClient minioClient = MinioUtils.minioClient; /** * 测试 getAllBuckets 只能列出最外层的bucket,里层嵌套的bucket不能列出 * logs * my-bucketname * test */ @Test public void testList () { List test = MinioUtils.getAllBuckets(); test.forEach(item -> { System.out.println(item.name()); }); } /** * 因为 inputStream 无法获取到 源文件的名字,所以需要指定一个 objectName, * 这个参数如果以 / 开头,就会新建一层目录; * 如果不以 / 开头,就会直接在 bucketName 下上传文件 * 如果文件名和目录名 重复,后面的会覆盖前面的,前面的会在删除后面的之后显示出来 **** * @throws FileNotFoundException */ @Test public void testUpload () throws FileNotFoundException { File file = new File("C:\\Users\\10170\\Desktop\\desktop\\cnblog\\待整理.md"); InputStream inputStream = new FileInputStream(file); // 上传的文件路径: test/hdhd boolean upload = MinioUtils.upload(inputStream,"test","/hdhd"); System.out.println(upload); // 上传的文件路径: test/hdhd/待整理.md boolean upload1 = MinioUtils.upload(inputStream,"test","/hdhd/"+file.getName()); System.out.println(upload1); } /** * 测试 minio 的下载函数 * 函数返回一个输入流,表示从文件写入内存中,用完close释放 * 服务器程序拿到这个输入流之后,可以通过网络返回给前端 * @throws IOException */ @Test public void testDownload () throws IOException { InputStream stream = MinioUtils.download("logs", "b50aa3fcb9fa4f64a4e295b7a996aa9a/events.json"); // stream 判 null if (Objects.isNull(stream)) { System.out.println("文件流为null!!!!! 下载失败"); return ; } // 读取流 并下载 File targetFile = new File("events.json"); FileOutputStream fileOutputStream = new FileOutputStream(targetFile); byte[] bytes = new byte[1024]; int length; while ((length = stream.read(bytes)) > 0) { fileOutputStream.write(bytes, 0, length); } fileOutputStream.close(); stream.close(); } /** * 删除 minio 文件对象测试 */ @Test public void testRemove() { boolean result = MinioUtils.removeObject("test", "hdhd/待整理.md"); Assert.assertTrue(result); } @Test public void getAllObjects(){ List test = MinioUtils.getAllObjects("logs"); test.forEach(System.out::println); }}
关键词:
-
-
-
-
全球观热点:MinIO-对象存储简单使用
JS必学的11个工具方法(避免重复造轮子) 世界快看
IDA的使用2_全球新视野
荷兰DUV光刻机一律管制出口?一文看懂|环球快播
埃安6月销量45013辆创历史新高 今年已卖出比亚迪一个月销量
特斯拉加入价格乱战!买这两款车最高优惠4.5万元
国内高端手机市场除了苹果iPhone 还能有谁?! 焦点要闻
2023年全国铁路暑期运输启动:满血复活 暴涨超70%
焦点热议:使用Gitee或GitHub托管Maven仓库JAR包的便捷方法
灭霸演员是谁_ 芝士回答
世界短讯!心爱的小乌龟死了:主人把它做成《七龙珠》龟仙人手办!
担心的事情发生了!泰国女游客卷入电动步道腿被夹断
火车站保洁阿姨不慎弄脏乘客衣服跪地道歉 公司回应:已和解 世界观焦点
蔚来智能系统Banyan 2.0正式发布:超120项功能 号称全场景领先
天天快播:一键打开动态日历 锁定2023下半年这些大事!
本田飞度彻底无语!新款马自达昂克赛拉官降3万:8.99万起_今头条
小米下一代旗舰还用1英寸主摄!1.33英寸还得等|快报
天天头条:今天起全国汽车实施国6排放标准6b阶段!对老车年检有何影响?官方解答
Web安全-渗透测试-waf绕过02
每日快讯!微服务设计:集成
vue中封装服务器地址/接口与设置请求头
天津关于调整2023年住房公积金缴存额的通知政策解读
环球讯息:你敢吃吗?知了肉初上市400元一斤:号称高蛋白
不用求助“拍瓜师”!西瓜甜不甜:看这里就知道
QQ空间《抢车位》游戏改名了 还把特斯拉Model X名字拼错_每日快看
中国包揽全球液晶电视面板TOP5 牢牢掌控话语权 日韩份额仅剩1成-全球热闻
男子围观火灾拍视频结果着火的是自家 还讨论是谁家倒霉:网友直呼尴尬 当前看点
关于Linux-Kernel-Live-patching-的效果演示-kpatch auto-配置-今日聚焦
世界视讯!win10投影仪连接电脑后画面不显示怎么办
无惧高通华为压制!苹果5G也站起来了:跟诺基亚签许可_天天实时
焦点日报:中国豪华车市场格局改写!理想汽车6月交付32575辆 首次突破三万辆:要超过BBA
五菱再出神车!缤果6月爆卖1.9万台:上市三月销量已超6万
关于lvm磁盘管理-单个磁盘分区PV的扩容 全球聚看点
一天吃透Redis面试八股文
如何使用libavfilter库给输入文件input.yuv添加视频滤镜?
Linux主流架构运维工作简单剖析 今日热搜
视讯!年货再出新花样 透视玩家现原形
14岁女孩500元卖头发被商贩剪坏 网友吐槽太坑:应先通女孩父母 每日动态
努比亚官宣新旗舰:镜头超越一英寸 7月见|全球聚看点
天天视点!别喝工业勾兑啤酒了:熊猫精酿12°P啤酒2.6元新低 好喝不上头
环球快消息!随笔[七律]
【见·闻】巴西精品咖啡市场从业者非常看好中国市场发展前景-百事通
撤销日本福岛核污染地区食品进口限制?欧盟回应很合理 美国早撤销 世界通讯
即时看!交付12万台电池零起火!极氪汽车6月交付10620辆 极氪001蝉联30万元以上纯电车型销冠
大额券手慢无:361°板鞋/运动鞋/休闲鞋74元抄底(多款式)
联合电子X-Pin电机批量生产 X-Pin绕组技术比对解读
燃烧烈爱无删减在线_燃烧烈爱-全球热推荐
当前要闻:电话号码过户要预存1万元话费?中国移动回应来了
我国CR450动车组研制取得阶段性成果:时速453km性能指标良好-焦点讯息
观天下!大猩猩性别歧视 英国小报遭头版制裁
2023年6月随笔暨半年总结 世界今亮点
cad如何调比例尺寸_cad比例怎么调整原图纸比例 环球热点
复读14年的高考钉子户认清事实:考了594分没能力上清华 没浪费教育资源
泰坦号潜艇失事前水下短信通信记录曝光:报警前8小时就已出现问题
简讯:如何做屋顶的防水层呢(如何做屋顶的防水层)
ASP.NET Core Web API之Token验证 天天快看
讯息:# 02. 数据分组整合之unique+groupby
天天快播:IDApython的学习
胖手指戴哪种戒指图片_胖手指
环球微动态丨山东大学拟聘用2名硕士为寓管:一人毕业于哈工大 另一人是海归
跑单王1年送25000单外卖:从外卖小白到外卖王者只用了一个月时间
Intel 13代酷睿最低端U300 CPU首次现身:1个大核、4个小核|速讯
当前看点!因为四个字 Kindle彻底告别中国!说真的 我有点难过
AMD锐龙5 5600X3D处理器确认:美国独享
起亚k2怎么样专家点评(起亚k2怎么样)-热消息
大话墨香online(大话墨香)
决算是什么意思通俗易懂_决算是什么意思_全球观点
特斯拉CEO马斯克被曝患有抑郁症 其服用氯胺酮以此“治疗”
演员马丽迎来了自己41岁生日 晒出美丽照片为自己庆生
微软巴西透露Xbox Series X|S总销量已超2100万台 与总部说法一致
《主播女孩重度依赖》开发商宣布全球累计销量突破百万 将举办庆祝直播
胖东来老板称企业家要活得像人 引发网友广泛热议
天天观速讯丨我在树莓派上跑通了bert模型,使用numpy实现bert模型,使用hugging face 或pytorch训练模型,保存参数为numpy格式,然
开源通用高性能的分布式id序列组件
【当前独家】时文选粹摘抄100字_时文选粹 摘抄
2023上半年票房冠军公布:《满江红》 由沈腾主演_天天亮点
千万别搜索“李斯特菌” 搜完我把冰箱里食物扔了|天天实时
3年过去 骁龙888处理器的库存还没清完:三星被逼重发Galaxy S21 FE
k8s安装环境准备:Virtualbox安装CentOS;复制多个CentOS虚拟机
1999元 LG新款27寸显示器开售:2K 165Hz IPS屏
世界聚焦:Kindle真的要拿来盖泡面了!官方店铺正式停运
超越南方!大数据看这一个6月北方有多热:专家科普原因
世界球精选!Java-语法基础
大数据面试题集锦-Hadoop面试题(三)-MapReduce-每日看点
素描鼻子的画法(素描鼻子)
【金融街发布】外汇局:一季度我国外债规模有所回升 结构保持基本稳定
马斯克:决斗可能约在斗兽场 需要锻炼一下我的耐力
世界今头条!湖南遇特大暴雨:市民街头抱团互救 防灾减灾进行时
当前时讯:中国创纪录一箭41星揭秘:印度一箭104星弱爆了
小学毕业典礼多名学生疑因天热晕倒 学校:当天多云 孩子因低血糖出现状况|速看料
3499元 优派新款便携显示器上架:4K OLED屏-环球快报
快讯:科普书单·新书|动物园开饭啦
北方热过南方 高温屡破纪录!大数据看这个6月北方有多热-新动态
月销2.1万辆 大众速腾彻底爆发 反超丰田卡罗拉
焦点要闻:胖东来老板称企业家要活得像人:要对得起自己的人生
夏季用电高峰来袭 你家能不断电 北斗立大功了
18叶双环扇叶:云米电风扇79元起大促(90元大额券)
佳能晒出EOS系列里程碑:累积产量已达1.1亿台
记录--让整个网站界面无滚动条
保利联合:上半年净利润预计盈利5560万元–7522万元