Minio分布式文件系统学习笔记
docker 單機安裝
服務端
docker run -p 9000:9000 -p 50000:50000 --name minio \ -d --restart=always \ -e "MINIO_ROOT_USER=admin" \ -e "MINIO_ROOT_PASSWORD=xie@1234" \ -v /opt/software/minio/data:/data \ -v /opt/software/config:/root/.minio \ minio/minio server --console-address ":50000" /data客戶端
wget http://dl.minio.org.cn/client/mc/release/linux-amd64/mc # 執行權限 chmod +x mc ./mc --help mv mc /usr/local/sbin/參考 : https://juejin.cn/post/6988340287559073799
分布式文件系統應用場景
- 互聯網海量非結構化數據的存儲需求
- 電商網站:海量商品圖片
- 視頻網站:海量視頻文件
- 網盤 : 海量文件
- 社交網站:海量圖片
介紹
MinIO 是一個基于Apache License v2.0開源協議的對象存儲服務。它兼容亞馬遜S3云存儲服務接口,非 常適合于存儲大容量非結構化的數據,例如圖片、視頻、日志文件、備份數據和容器/虛擬機鏡像等,而 一個對象文件可以是任意大小,從幾kb到最大5T不等。 MinIO是一個非常輕量的服務,可以很簡單的和其他應用的結合,類似 NodeJS, Redis 或者 MySQL。
Minio優點
- 部署簡單: 一個single二進制文件即是一切,還可支持各種平臺。
- minio支持海量存儲,可按zone擴展(原zone不受任何影響),支持單個對象最大5TB;
- 兼容Amazon S3接口,充分考慮開發人員的需求和體驗;
- 低冗余且磁盤損壞高容忍,標準且最高的數據冗余系數為2(即存儲一個1M的數據對象,實際占用
磁盤空間為2M)。但在任意n/2塊disk損壞的情況下依然可以讀出數據(n為一個糾刪碼集合(Erasure
Coding Set)中的disk數量)。并且這種損壞恢復是基于單個對象的,而不是基于整個存儲卷的。
讀寫性能優異
MinIO的基礎概念
- Object:存儲到 Minio 的基本對象,如文件、字節流,Anything…
- Bucket:用來存儲 Object 的邏輯空間。每個 Bucket 之間的數據是相互隔離的。對于客戶端而言,就相當于一個存放文件的頂層文件夾。
- Drive:即存儲數據的磁盤,在 MinIO 啟動時,以參數的方式傳入。Minio 中所有的對象數據都會存儲在 Drive 里。
- Set :即一組 Drive 的集合,分布式部署根據集群規模自動劃分一個或多個 Set ,每個 Set 中的Drive 分布在不同位置。一個對象存儲在一個 Set 上(For example: {1…64} is divided into 4sets each of size 16.)
- 一個對象存儲在一個Set上
- 一個集群劃分為多個Set
- 一個Set包含的Drive數量是固定的,默認由系統根據集群規模自動計算得出
- 一個SET中的Drive盡可能分布在不同的節點上
命令
- ls 列出文件和文件夾。
- mb 創建一個存儲桶或一個文件夾。
- cat 顯示文件和對象內容。
- pipe 將一個STDIN重定向到一個對象或者文件或者STDOUT。
- share 生成用于共享的URL。
- cp 拷貝文件和對象。
- mirror 給存儲桶和文件夾做鏡像。
- find 基于參數查找文件。
- diff 對兩個文件夾或者存儲桶比較差異。
- rm 刪除文件和對象。
- events 管理對象通知。
- watch 監視文件和對象的事件。
- policy 管理訪問策略。
- config 管理mc配置文件。
- update 檢查軟件更新。
- version 輸出版本信息。
配置mc操作minio服務
# 查詢mc host配置 mc config host ls # 添加minio服務 mc config host add minio-server http://192.168.62.130:9000 admin xie@1234 # 刪除host mc config host remove minio-server上傳下載
# 查詢minio服務上的所有buckets(文件和文件夾) mc ls minio-server # 下載文件 mc cp minio-server/temp/xzb/1.jpg /tmp/ #刪除文件 mc rm minio-server/temp/xzb/1.jpg #上傳文件 mc cp abc.text minio-server/xzb/Bucket管理
# 創建bucket mc mb minio-server/bucket01 # 刪除bucket mc rb minio-server/bucket02 # bucket不為空,可以強制刪除 慎用 mc rb --force minio-server/bucket01 #查詢bucket03磁盤使用情況 mc du minio-server/bucket03mc admin使用
MinIO Client(mc)提供了“ admin”子命令來對您的MinIO部署執行管理任務。
service 服務重啟并停止所有MinIO服務器 update 更新更新所有MinIO服務器 info 信息顯示MinIO服務器信息 user 用戶管理用戶 group 小組管理小組 policy MinIO服務器中定義的策略管理策略 config 配置管理MinIO服務器配置 heal 修復MinIO服務器上的磁盤,存儲桶和對象 profile 概要文件生成概要文件數據以進行調試 top 頂部提供MinIO的頂部統計信息 trace 跟蹤顯示MinIO服務器的http跟蹤 console 控制臺顯示MinIO服務器的控制臺日志 prometheus Prometheus管理Prometheus配置 kms kms執行KMS管理操作用戶管理
mc admin user --help #新建用戶 mc admin user add minio-server xzb mc admin user add minio-server xzb 12345678 #查看用戶 mc admin user list minio-server #禁用用戶 mc admin user disable minio-server xzb #啟用用戶 mc admin user disable minio-server xzb #查看用戶信息 mc admin user info minio-server xzb #刪除用戶 mc admin user remove minio-server xzb策略管理
policy命令,用于添加,刪除,列出策略,獲取有關策略的信息并為MinIO服務器上的用戶設置策略。
mc admin policy --help #列出MinIO上的所有固定策略 mc admin policy list minio-server # 查看plicy信息 mc admin policy info minio-server readwrite添加新的策略
編寫策略文件 /opt/software/minio/xzbTemp.json
{"Version": "2012-10-17","Statement": [{"Effect": "Allow","Action": ["s3:GetBucketLocation","s3:GetObject"],"Resource": ["arn:aws:s3:::xzbTemp"]}, {"Effect": "Allow","Action": ["s3:*"],"Resource": ["arn:aws:s3:::xzbTemp/*"]}] }xzbTemp.json添加到策略數據庫
#添加新的策略, bucket01 這個桶資源xzb可以授權使用
mc admin policy add minio-server bucket01 /opt/software/minio/xzbTemp.json
mc admin policy list minio-server
mc admin user add minio-server xzb 12345678
#設置用戶的訪問策略
mc admin policy set minio-server bucket01 user=xzb
Minio Java Client使用
MinIO Java Client SDK提供簡單的API來訪問任何與Amazon S3兼容的對象存儲服務。
官方demo: https://github.com/minio/minio-java
官方文檔:https://docs.min.io/docs/java-client-api-reference.html
文件上傳
public class FileUploader {public static void main(String[] args)throws IOException, NoSuchAlgorithmException, InvalidKeyException {try {// Create a minioClient with the MinIO server playground, its access keyand secret key.MinioClient minioClient =MinioClient.builder().endpoint("http://192.168.62.130:9000").credentials("admin", "xie@1234").build();// 創建bucketString bucketName = "bucket01";Boolean exists =minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());if (!exists) {// 不存在,創建bucketminioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());}// 上傳文件minioClient.uploadObject(UploadObjectArgs.builder().bucket(bucketName).object("1.txt") // 上傳對象名稱.filename("D:\1.txt") // 上傳的本地文件.build());System.out.println("上傳文件成功");}catch (MinioException e) {System.out.println("Error occurred: " + e);System.out.println("HTTP trace: " + e.httpTrace());}} }文件下載
public class DownLoadDemo {public static void main(String[] args) {// Create a minioClient with the MinIO server playground, its access keyand secret key.MinioClient minioClient =MinioClient.builder().endpoint("http://192.168.62.130:9000").credentials("admin", "xie@1234").build();// Download object given the bucket, object name and output file nametry {minioClient.downloadObject(DownloadObjectArgs.builder().bucket("bucket01").object("temp/1.jpg").filename("1.jpg").build());}catch (Exception e) {e.printStackTrace();}} }3.3 Spring boot整合minio
構建MinioClient對象,并交給spring管理
//yml
minio:
endpoint: http://192.168.62.130:9000
accesskey: admin
secretKey: xie@1234
實現文件上傳,下載,刪除操作
@RestController @Slf4j public class MinioController {@Autowiredprivate MinioClient minioClient;@Value("${minio.bucketName}")private String bucketName;@GetMapping("/list")public List<Object> list() throws Exception {//獲取bucket列表Iterable<Result<Item>> myObjects = minioClient.listObjects(ListObjectsArgs.builder().bucket(bucketName).build());Iterator<Result<Item>> iterator = myObjects.iterator();List<Object> items = new ArrayList<>();String format = "{'fileName':'%s','fileSize':'%s'}";while (iterator.hasNext()) {Item item = iterator.next().get();items.add(JSON.parse(String.format(format, item.objectName(),formatFileSize(item.size()))));}return items;}@PostMapping("/upload")public Res upload(@RequestParam(name = "file", required = false)MultipartFile[] file) {if (file == null || file.length == 0) {return Res.error("上傳文件不能為空");}List<String> orgfileNameList = new ArrayList<>(file.length);for (MultipartFile multipartFile : file) {String orgfileName = multipartFile.getOriginalFilename();orgfileNameList.add(orgfileName);try {//文件上傳InputStream in = multipartFile.getInputStream();minioClient.putObject(PutObjectArgs.builder().bucket(bucketName).object(orgfileName).stream(in, multipartFile.getSize(), -1).contentType(multipartFile.getContentType()).build());in.close();}catch (Exception e) {log.error(e.getMessage());return Res.error("上傳失敗");}}Map<String, Object> data = new HashMap<String, Object>();data.put("bucketName", bucketName);data.put("fileName", orgfileNameList);return Res.ok("上傳成功",data);}@RequestMapping("/download/{fileName}")public void download(HttpServletResponse response, @PathVariable("fileName")String fileName) {InputStream in = null;try {// 獲取對象信息StatObjectResponse stat = minioClient.statObject(StatObjectArgs.builder().bucket(bucketName).object(fileName).build());response.setContentType(stat.contentType());response.setHeader("Content-Disposition", "attachment;filename=" +URLEncoder.encode(fileName, "UTF-8"));//文件下載in = minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(fileName).build());IOUtils.copy(in, response.getOutputStream());}catch (Exception e) {log.error(e.getMessage());}finally {if (in != null) {try {in.close();}catch (IOException e) {log.error(e.getMessage());}}}}@DeleteMapping("/delete/{fileName}")public Res delete(@PathVariable("fileName") String fileName) {try {minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(fileName).build());}catch (Exception e) {log.error(e.getMessage());return Res.error("刪除失敗");}return Res.ok("刪除成功",null);}private static String formatFileSize(long fileS) {DecimalFormat df = new DecimalFormat("#.00");String fileSizeString = "";String wrongSize = "0B";if (fileS == 0) {return wrongSize;}if (fileS < 1024) {fileSizeString = df.format((double) fileS) + " B";} else if (fileS < 1048576) {fileSizeString = df.format((double) fileS / 1024) + " KB";} else if (fileS < 1073741824) {fileSizeString = df.format((double) fileS / 1048576) + " MB";} else {fileSizeString = df.format((double) fileS / 1073741824) + " GB";}return fileSizeString;} }總結
以上是生活随笔為你收集整理的Minio分布式文件系统学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql的yearweek 和 wee
- 下一篇: 2003iso序列号