[TOC]linux
對象存儲服務(Object Storage Service,OSS)是一種海量、安全、低成本、高可靠的雲存儲服務,適合存聽任意類型的文件。容量和處理能力彈性擴展,多種存儲類型供選擇,全面優化存儲成本。git
在項目開發過程當中,咱們會產生大量的對象數據,包括:日誌文件,數據庫腳本文件、安裝包,容器鏡像,圖像、視頻等等,咱們不只僅是須要有一個集中的地方來存儲,還須要能基於 Web 的方式來訪問它們,以往咱們有如下幾種方法來解決:github
本篇文章主要介紹下其中的Minio方案算法
Minio是GlusterFS創始人之一Anand Babu Periasamy發佈新的開源項目。Minio兼容Amason的S3分佈式對象存儲項目,採用Golang實現,客戶端支持Java,Python,Javacript, Golang語言。docker
Minio是創建在雲原生的基礎上;有分佈式和共享存儲等功能;旨在多租戶環境中以可持續的方式進行擴展的對象存儲服務。它最適合存儲非結構化數據,如:照片、視頻、日誌文件、容器/虛擬機/映像等,單次存儲對象的大小最大可達5TBshell
左邊是 MINIO 集羣的示意圖,整個集羣是由多個角色徹底相同的節點所組成的。由於沒有特殊的節點,因此任何節點宕機都不會影響整個集羣節點之間的通訊。經過 rest 跟 RPC 去通訊的,主要是實現分佈式的鎖跟文件的一些操做數據庫
右邊這張圖是單個節點的示意圖,每一個節點都單獨對外提供兼容 S3 的服務json
以下圖,每一行是一個機器節點,這裏有32個集羣,每一個節點裏有一個小方塊,咱們稱之爲Drive,Drive可簡單地理解爲磁盤。一個節點有32個Drive,至關於32個磁盤。後端
Set是一組Drive的集合,全部紅色標識的Drive組成了一個Set。瀏覽器
一個對象存儲在一個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
目錄不存在,要新建一個`
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 的管理界面
單機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
默認的配置目錄是 ${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 命令將數據寫入磁盤
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服務端
命令行建立bucket
// 構造訪問對象 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)