1. 程式人生 > >物件儲存服務-Minio

物件儲存服務-Minio

# Mino [TOC] **物件儲存服務(Object Storage Service,OSS**)是一種海量、安全、低成本、高可靠的雲端儲存服務,適合存放任意型別的檔案。容量和處理能力彈性擴充套件,多種儲存型別供選擇,全面優化儲存成本。 ## 物件儲存服務 在專案開發過程中,我們會產生大量的物件資料,包括:日誌檔案,資料庫指令碼檔案、安裝包,容器映象,影象、視訊等等,我們不僅僅是需要有一個集中的地方來儲存,還需要能基於 Web 的方式來訪問它們,以往我們有以下幾種方法來解決: - 阿里雲、Azure 等雲服務商提供的SaaS 級別的 OSS 服務 - 自己搭建 NAS 網路儲存通過 Samba 服務來訪問 - 自己搭建 FTP 伺服器來儲存 ![image.png](https://cdn.nlark.com/yuque/0/2021/png/5374140/1616687824999-55666588-2d09-46e9-bcfb-6de25befec39.png#align=left&display=inline&height=320&margin=%5Bobject%20Object%5D&name=image.png&originHeight=320&originWidth=626&size=91754&status=done&style=none&width=626) 本篇文章主要介紹下其中的Minio方案 ## Minio ![](https://cdn.nlark.com/yuque/0/2021/jpeg/5374140/1616841442916-a0aebceb-8506-441f-bc1b-2aa4b6e81318.jpeg#align=left&display=inline&height=128&margin=%5Bobject%20Object%5D&originHeight=400&originWidth=1200&size=0&status=done&style=none&width=385) Minio是GlusterFS創始人之一Anand Babu Periasamy釋出新的開源專案。Minio相容Amason的S3分散式物件儲存專案,採用Golang實現,客戶端支援Java,Python,Javacript, Golang語言。 Minio是建立在雲原生的基礎上;有分散式和共享儲存等功能;旨在多租戶環境中以可持續的方式進行擴充套件的物件儲存服務。它最適合儲存非結構化資料,如:照片、視訊、日誌檔案、容器/虛擬機器/映像等,單次儲存物件的大小最大可達5TB ### 參考 - [https://min.io/](https://min.io/) - [http://www.minio.org.cn/](http://www.minio.org.cn/) - [minio/minio-service: Collection of MinIO server scripts for upstart, systemd, sysvinit, launchd. (github.com)](https://github.com/minio/minio-service) ### Minio 架構 ![image.png](https://cdn.nlark.com/yuque/0/2021/png/5374140/1616687945743-43cf8f65-e12b-427d-85f5-22e731990a65.png#align=left&display=inline&height=452&margin=%5Bobject%20Object%5D&name=image.png&originHeight=452&originWidth=740&size=137885&status=done&style=none&width=740) **左邊是 MINIO 叢集的示意圖**,整個叢集是由多個角色完全相同的節點所組成的。因為沒有特殊的節點,所以任何節點宕機都不會影響整個叢集節點之間的通訊。通過 rest 跟 RPC 去通訊的,主要是實現分散式的鎖跟檔案的一些操作 **右邊這張圖是單個節點的示意圖**,每個節點都單獨對外提供相容 S3 的服務 ### 為什麼要用 Minio - 1、Minio 有良好的儲存機制 - 2、Minio 有很好糾刪碼的演算法與擦除編碼演算法 - 3、擁有RS code 編碼資料恢復原理 - 4、公司做強做大時,資料的擁有重要性,對資料治理與大資料分析做準備。 - 5、搭建自己的一套檔案系統服務,對檔案資料進行安全保護。 - 6、擁有自己的平臺,不限於其他方限制。 #### 儲存機制 - Minio使用糾刪碼erasure code和校驗和checksum來保護資料免受硬體故障和無聲資料損壞。 即便丟失一半數量(N/2)的硬碟,仍然可以恢復資料。 #### 糾刪碼 - 糾刪碼是一種恢復丟失和損壞資料的數學演算法,目前,糾刪碼技術在分散式儲存系統中的應用主要有三類,陣列糾刪碼(Array Code: RAID5、RAID6 等)、RS(Reed-Solomon)裡德-所羅門類糾刪碼和 LDPC(LowDensity Parity Check Code)低密度奇偶校驗糾刪碼。Erasure Code 是一種編碼技術,它可以將 n 份原始資料,增加 m 份資料,並能通過 n+m 份中的任意 n 份資料,還原為原始資料。即如果有任意小於等於 m 份的資料失效,仍然能通過剩下的資料還原出來 ### MinIO概念 如下圖,**每一行是一個機器節點**,這裡有32個叢集,**每個節點裡有一個小方塊,我們稱之為Drive,Drive可簡單地理解為磁碟**。一個節點有32個Drive,相當於32個磁碟。 **Set是一組Drive的集合**,所有紅色標識的Drive組成了一個Set。 ![image.png](https://cdn.nlark.com/yuque/0/2021/png/5374140/1616688028544-2d4661ff-7d44-427e-a7b2-4e98922fbaec.png#align=left&display=inline&height=298&margin=%5Bobject%20Object%5D&name=image.png&originHeight=298&originWidth=299&size=58821&status=done&style=none&width=299) 一個物件儲存在一個Set上; 一個叢集劃分為多個Set 一個Set包含的Drive數量是固定的, 預設由系統根據叢集規模自動計算得出 MINIO_ERASURE_SET_DRIVE_COUNT 一個SET中的Drive儘可能分佈在不同的節點上 ### 部署 Minio 提供了兩種部署方式:單機部署和分散式,兩種部署方式都非常簡單,其中分散式部署還提供了糾刪碼功能來降低資料丟失的風險 #### 單機部署: `wget `[`https://dl.min.io/server/minio/release/linux-amd64/minio`](https://dl.min.io/server/minio/release/linux-amd64/minio)` chmod +x minio ./minio server /data``  #``若``/data``目錄不存在,要新建一個` #### Docker 部署Minio ``` shell mkdir /data/minio-data&&mkdir /data/minio-config # 建立一個數據儲存目錄 docker run -p 9000:9000 --name minio \ -d --restart=always \ -e "MINIO_ACCESS_KEY=admin" \ -e "MINIO_SECRET_KEY=admin123456" \ -v /data/minio-data:/data \ -v /data/minio-config:/root/.minio \ minio/minio server /data ``` [http://localhost:9000/](http://localhost:9000/) 即可登陸Minio 的管理介面 ![image.png](https://cdn.nlark.com/yuque/0/2021/png/5374140/1616688607585-b362ae32-41e7-40b0-a653-391015b514c3.png#align=left&display=inline&height=295&margin=%5Bobject%20Object%5D&name=image.png&originHeight=295&originWidth=1303&size=22817&status=done&style=none&width=1303) ### 分散式Minio ![image.png](https://cdn.nlark.com/yuque/0/2021/png/5374140/1616688683921-36c53272-58fe-43e1-98ef-060e091fdac2.png#align=left&display=inline&height=557&margin=%5Bobject%20Object%5D&name=image.png&originHeight=557&originWidth=1008&size=135743&status=done&style=none&width=1008) 單機Minio服務存在單點故障,相反,如果是一個有 m 臺伺服器, n 塊硬碟的分散式Minio,只要有 m/2 臺伺服器或者 m*n/2 及更多硬碟線上,你的資料就是安全的。 例如,一個16節點的Minio叢集,每個節點200塊硬碟,就算8臺伺服器宕機,即大概有1600塊硬碟,這個叢集仍然是可讀的,不過你需要9臺伺服器線上才能寫資料。 `export MINIO_ACCESS_KEY=` `export MINIO_SECRET_KEY=` `minio server `[`http://host`](http://host)`{1...n}/export{1...m} `[`http://host`](http://host)`{1...o}/export{1...m}` 當然如果我們只有一臺機器,但是想用糾刪碼的功能,也可以直接配置使用多個本地盤 `minio server /data1 /data2 /data3 ... /data8` ### Minio配置 預設的配置目錄是 ${HOME}/.minio,你可以使用--config-dir命令列選項重寫之。MinIO server在首次啟動時會生成一個新的config.json,裡面帶有自動生成的訪問憑據。 `minio server --config-dir /etc/minio /data` - **證書目錄** TLS證書存在${HOME}/.minio/certs目錄下,你需要將證書放在該目錄下來啟用HTTPS  - **憑據** 只能通過環境變數MINIO_ROOT_USER 和 MINIO_ROOT_PASSWORD 更改MinIO的admin憑據和root憑據。使用這兩個值的組合,MinIO加密儲存在後端的配置 `export MINIO_ROOT_USER=minio` `export MINIO_ROOT_PASSWORD=minio13` `minio server /data` ### 如何儲存和訪問物件 將物件資料儲存到 Minio 中有以下幾種方式: • 通過 MINIO CLIENT • 通過 MINIO SDK 目前支援的語言包括:Go,Java,Node.js,Python,.NET • 通過瀏覽器訪問 Web 管理介面,在管理介面中上傳和下載物件 • 如果你有儲存目錄 minio-data 的賬號和訪問許可權,可以直接使用 SCP 命令將資料寫入磁碟 #### MinIO Client (mc) ``` shell wget https://dl.min.io/client/mc/release/linux-amd64/mc chmod +x mc ``` MinIO Client (mc)為ls,cat,cp,mirror,diff,find等UNIX命令提供了一種替代方案。它支援檔案系統和相容Amazon S3的雲端儲存服務(AWS Signature v2和v4)。 ##### 命令使用 ``` ls 列出檔案和資料夾。 mb 建立一個儲存桶或一個資料夾。 cat 顯示檔案和物件內容。 pipe 將一個STDIN重定向到一個物件或者檔案或者STDOUT。 share 生成用於共享的URL。 cp 拷貝檔案和物件。 mirror 給儲存桶和資料夾做映象。 find 基於引數查詢檔案。 diff 對兩個資料夾或者儲存桶比較差異。 rm 刪除檔案和物件。 events 管理物件通知。 watch 監聽檔案和物件的事件。 policy 管理訪問策略。 session 為cp命令管理儲存的會話。 config 管理mc配置檔案。 update 檢查軟體更新。 version 輸出版本資訊。 ``` **列出Mino服務端** ![image.png](https://cdn.nlark.com/yuque/0/2021/png/5374140/1616840462896-f6c5a2bd-562c-49c9-8d95-bc3f530ae95c.png#align=left&display=inline&height=379&margin=%5Bobject%20Object%5D&name=image.png&originHeight=379&originWidth=493&size=37287&status=done&style=none&width=493) **命令列建立bucket** ![image.png](https://cdn.nlark.com/yuque/0/2021/png/5374140/1616840502464-6155acbc-4744-4434-9a62-5ee3a346eeb5.png#align=left&display=inline&height=166&margin=%5Bobject%20Object%5D&name=image.png&originHeight=166&originWidth=477&size=26220&status=done&style=none&width=477) ![image.png](https://cdn.nlark.com/yuque/0/2021/png/5374140/1616840510944-6e6085fd-2253-49bd-ac92-2cf932de3949.png#align=left&display=inline&height=414&margin=%5Bobject%20Object%5D&name=image.png&originHeight=414&originWidth=607&size=32039&status=done&style=none&width=607) #### 通過程式碼儲存物件 ``` shell // 構造訪問物件 var minio = new MinioClient("localhost:9000","accessKey","secretKey"); // 輸出所有的 Buckets var rs = minio.ListBucketsAsync(); foreach (varbucket in rs.Result.Buckets) { Console.Out.WriteLine(bucket.Name + " " + bucket.CreationDateDateTime); } // 儲存物件 var bucketName = "logs"; var objectName = "logs.zip"; var filePath = "c:\\logs.zip"; var contentType = "application/zip"; minio.PutObjectAsync(bucketName, objectName, filePath, contentType); // 獲取物件 var find = minio.GetObjectAsync(bucketName, objectName) ```