對象存儲服務-Minio

Mino

[TOC]linux

對象存儲服務(Object Storage Service,OSS)是一種海量、安全、低成本、高可靠的雲存儲服務,適合存聽任意類型的文件。容量和處理能力彈性擴展,多種存儲類型供選擇,全面優化存儲成本。git

對象存儲服務

在項目開發過程當中,咱們會產生大量的對象數據,包括:日誌文件,數據庫腳本文件、安裝包,容器鏡像,圖像、視頻等等,咱們不只僅是須要有一個集中的地方來存儲,還須要能基於 Web 的方式來訪問它們,以往咱們有如下幾種方法來解決:github

  • 阿里雲、Azure 等雲服務商提供的SaaS 級別的 OSS 服務
  • 本身搭建 NAS 網絡存儲經過 Samba 服務來訪問
  • 本身搭建 FTP 服務器來存儲

image.png

本篇文章主要介紹下其中的Minio方案算法

Minio

image.png
Minio是GlusterFS創始人之一Anand Babu Periasamy發佈新的開源項目。Minio兼容Amason的S3分佈式對象存儲項目,採用Golang實現,客戶端支持Java,Python,Javacript, Golang語言。docker

Minio是創建在雲原生的基礎上;有分佈式和共享存儲等功能;旨在多租戶環境中以可持續的方式進行擴展的對象存儲服務。它最適合存儲非結構化數據,如:照片、視頻、日誌文件、容器/虛擬機/映像等,單次存儲對象的大小最大可達5TBshell

參考

Minio 架構

image.png

左邊是 MINIO 集羣的示意圖,整個集羣是由多個角色徹底相同的節點所組成的。由於沒有特殊的節點,因此任何節點宕機都不會影響整個集羣節點之間的通訊。經過 rest 跟 RPC 去通訊的,主要是實現分佈式的鎖跟文件的一些操做數據庫

右邊這張圖是單個節點的示意圖,每一個節點都單獨對外提供兼容 S3 的服務json

爲何要用 Minio

  • 一、Minio 有良好的存儲機制
  • 二、Minio 有很好糾刪碼的算法與擦除編碼算法
  • 三、擁有RS code 編碼數據恢復原理
  • 四、公司作強作大時,數據的擁有重要性,對數據治理與大數據分析作準備。
  • 五、搭建本身的一套文件系統服務,對文件數據進行安全保護。
  • 六、擁有本身的平臺,不限於其餘方限制。

存儲機制

  • Minio使用糾刪碼erasure code和校驗和checksum來保護數據免受硬件故障和無聲數據損壞。 即使丟失一半數量(N/2)的硬盤,仍然能夠恢復數據。

糾刪碼

  • 糾刪碼是一種恢復丟失和損壞數據的數學算法,目前,糾刪碼技術在分佈式存儲系統中的應用主要有三類,陣列糾刪碼(Array Code: RAID五、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
一個對象存儲在一個Set上; 一個集羣劃分爲多個Set
一個Set包含的Drive數量是固定的, 默認由系統根據集羣規模自動計算得出 MINIO_ERASURE_SET_DRIVE_COUNT
一個SET中的Drive儘量分佈在不一樣的節點上

部署

Minio 提供了兩種部署方式:單機部署和分佈式,兩種部署方式都很是簡單,其中分佈式部署還提供了糾刪碼功能來下降數據丟失的風險

單機部署:

wget https://dl.min.io/server/minio/release/linux-amd64/minio`
chmod +x minio
./minio server /data  #/data目錄不存在,要新建一個`

Docker 部署Minio

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/ 便可登錄Minio 的管理界面

image.png

分佈式Minio

image.png
單機Minio服務存在單點故障,相反,若是是一個有 m 臺服務器, n 塊硬盤的分佈式Minio,只要有 m/2 臺服務器或者 m*n/2 及更多硬盤在線,你的數據就是安全的。

例如,一個16節點的Minio集羣,每一個節點200塊硬盤,就算8臺服務器宕機,即大概有1600塊硬盤,這個集羣仍然是可讀的,不過你須要9臺服務器在線才能寫數據。

export MINIO_ACCESS_KEY=<ACCESS_KEY>
export MINIO_SECRET_KEY=<SECRET_KEY>
minio server http://host{1...n}/export{1...m} 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)

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

命令行建立bucket

image.png

image.png

經過代碼存儲對象

// 構造訪問對象
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)
相關文章
相關標籤/搜索