Minio架構簡介

簡介

Minio是一個go編寫基於Apache License v2.0開源協議的對象存儲系統,是爲海量數據存儲、人工智能、大數據分析而設計,它完全兼容Amazon S3接口,十分符合存儲大容量的非結構化數據從幾十kb到最大5T不等。是一個小而美的開源分佈式存儲軟件。

特點

簡單、可靠:Minio採用簡單可靠的集羣方案,摒棄複雜的大規模的集羣調度管理,減少風險與性能瓶頸,聚焦產品的核心功能,打造高可用的集羣、靈活的擴展能力以及超過的性能。建立衆多的中小規模、易管理的集羣,支持跨數據中心將多個集羣聚合成超大資源池,而非直接採用大規模、統一管理的分佈式集羣。

功能完善:Minio支持雲原生,能與Kubernetes、Docker、Swarm編排系統良好對接,實現靈活部署。且部署簡單,只有一個可執行文件,參數極少,一條命令即可啓動一個Minio系統。Minio爲了高性能採取無元數據數據庫設計,避免元數據庫成爲整個系統的性能瓶頸,並將故障限制在單個集羣之內,從而不會涉及其他集羣。Minio同時完全兼容S3接口,因此也可以作爲網關使用,對外提供S3訪問。同時使用Minio Erasure code和checksum 來防止硬件故障。即使損失一半以上的硬盤,但是仍然可以從中恢復。分佈式中也允許(N/2)-1個節點故障。

架構

去中心化架構

Minio採用去中心化的無共享架構,對象數據被打散存放在不同節點的多塊硬盤,對外提供統一命名空間訪問,並通過負載均衡或者DNS輪詢在各個服務器之間實現負載均衡

統一的命名空間

Minio有兩種集羣部署方式,一種是常見的本地分佈式集羣部署,一種是聯盟模式部署。本地分佈式集羣部署即在多個本地服務器節點部署Minio服務,並將其組成單套分佈式存儲集羣,並提供統一命名空間和標註的S3訪問接口。聯盟部署則是將多個本地Minio集羣在邏輯上組成了統一命名空間,實現近乎無線的擴展與海量的數據規模管理,這些集羣都可以在本地或者分佈在不同地域的數據中心。

分佈式鎖管理

與分佈式數據庫類似,Minio也會存在面臨數據一致性的問題:一個客戶端在讀取一個對象的同時,另一個客戶端可能正在修改或者刪除這個對象。爲了避免出現不一致的情況。Minio專門設計並實現了dsync分佈式鎖管理器,來控制數據一致性。

  • 任何一個節點的鎖請求都會廣播給集羣內的所有在線節點
  • 如果收到N/2+1個節點的同意,則獲取所成功
  • 沒有主節點,每個節點互相對等,節點間通過stale lock檢測機制,判斷節點的狀態及持有鎖情況
  • 由於設計簡單,比較粗糙。有一定的缺陷性,最多支持32個節點。無法避免鎖丟失的場景。不過基本滿足可用需求。
EC2 Instance Type Nodes Locks/server/sec Total Locks/sec CPU Usage
c3.8xlarge(32 vCPU) 8 (min=2601, max=2898) 21996 10%
c3.8xlarge(32 vCPU) 8 (min=4756, max=5227) 39932 20%
c3.8xlarge(32 vCPU) 8 (min=7979, max=8517) 65984 40%
c3.8xlarge(32 vCPU) 8 (min=9267, max=9469) 74944 50%

數據結構

Minio對象存儲系統把存儲資源組織爲租戶-桶-對象的形式

  • 對象:類似於hash表中的表xiang表項,名字是關鍵字,內容相當於值
  • :是若干個對象的邏輯抽象,是盛裝對象的容器
  • 租戶:用於隔離存儲資源。在租戶下可以建立桶、存儲對象
  • 用戶:在租戶下面創建的用於訪問不同桶的賬號。可以使用minio提供的mc命令設置不同用戶訪問各個桶的權限

統一域名訪問

Minio集羣擴展加入了新的集羣或者桶後,對象存儲的客戶端程序需要通過統一的域名/url來訪問數據對象,這個過程涉及了etcd與CoreDns

存儲機制

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

糾刪碼是一種恢復丟失和損壞數據的數學算法,目前糾刪碼技術在分佈式存儲系統中的應用分爲三類,陣列糾刪碼(Array code:RAID5、RAID6等)、RS(Reed-solomon)裏德-所羅門類糾刪碼和LDPC(LowDensity Parity Check Code)低密度奇偶檢驗糾刪碼。ErasureCode是一種編碼技術,它可以將份原始數據,增加M份數據,並能通過N+M份中的任意N分數據,還原原始數據。即如果有任意小於等於M份的數據丟失,仍然能通過剩下的數據還原。

Minio採用Reed-solomon code將對象拆分成N/2數據和N/2奇偶檢驗快,這就意味着如果是12塊盤,一個對象將會被分成6個數據塊、6個奇偶檢驗快,可以丟失任意6塊盤(不管存放的數據快還是奇偶檢驗快),讓然可以從剩下的盤中的數據恢復。

在一個N節點的分佈式Minio中,只要有N/2個節點在線,你的數據就是安全的。不過至少需要N/2+1個節點才能進行寫操作。

將一個文件上傳至Minio後,對應磁盤上的信息如下:

其中xl.json爲此對象的元數據文件。part.1爲此對象的第一個數據分片。(分佈式中每一個節點都會存在這兩個文件分別是數據塊和奇偶檢驗快)在讀取數據時Minio會對編碼快進行HighwayHash編碼,然後進行校驗,以確保每個編碼的正確性。基於Erasure Code和Bit Rot Protection的HighwayHash這兩個特性,所以Minio的數據可靠性很高。

lambda計算與持續備份

Minio支持lambda計算通知機制,即桶中的對象支持事件通知機制。當前支持的事件類型有:對象上傳、對象下載、對象刪除、對象複製等。當前支持事件接受系統有:redis、NATS、AMQP、Kafka、mysql、elasticsearch等。

對象通知機制增強了Minio的擴展性,可以讓用戶通過自行開發來實現某些Minio未實現的功能。比如基於元數據的檢索、與用戶業務相關的計算等。同時也可以通過這個機制進行快速有效的增量備份。

對象存儲網關

Minio除了可以作爲存儲系統服務外,還可以作爲網關,後端可以與NAS系統、HDFS系統等分佈式文件系統或者S3、OSS這樣的第三方存儲系統。有了Minio網關,就可以爲這些後端系統添加S3兼容的API,便於管理和移植,因爲S3API已經是對象存儲界事實的標註。

用戶通過統一的S3 API請求存儲資源,通過S3 API Router將各個請求路由到對應的ObjectLayer,每個ObjectLayer對應實現了各個存儲系統的對象操作的所有API。例如GCS(Google cloud storage)實現了ObjectLayer接口後,它對於後端存儲的操作就是通過GCS的SDK實現。當終端通過S3 API獲取存儲桶列表,那麼最終的實現會通過GCS的SDK訪問GCS服務獲取存儲桶列表,然後包裝成S3標準的結構返回給終端。

三人行, 必有我師; 知識共享, 天下爲公. 本文由東風微鳴技術博客 EWhisper.cn 編寫.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章