开源对象存储MinIO技术白皮书
MinIO創(chuàng)始者是Anand Babu Periasamy, Harshavardhana(戒日王)等人, Anand是GlusterFS的初始開發(fā)者、Gluster公司的創(chuàng)始人與CTO,Harshavardhana曾經(jīng)是GlusterFS的開發(fā)人員,直到2011年紅帽收購了Gluster公司。MinIO在設(shè)計上汲取了GlusterFS的相關(guān)經(jīng)驗與教訓,系統(tǒng)復雜度上作了大量簡化。
?
一、MinIO簡介
01.概述
? ? ?MinIO對象存儲系統(tǒng)是為海量數(shù)據(jù)存儲、人工智能、大數(shù)據(jù)分析而設(shè)計,基于Apache License v2.0開源協(xié)議的對象存儲系統(tǒng),它完全兼容Amazon S3接口,單個對象最大可達5TB,適合存儲海量圖片、視頻、日志文件、備份數(shù)據(jù)和容器/虛擬機鏡像等。MinIO主要采用Golang語言實現(xiàn),整個系統(tǒng)都運行在操作系統(tǒng)的用戶態(tài)空間,客戶端與存儲服務器之間采用http/https通信協(xié)議。
02.設(shè)計哲學
? ? ?極簡理念——采用盡可以簡單可靠的集群管理方案,摒棄復雜的大規(guī)模集群調(diào)度管理,減少風險因素與性能瓶頸,聚焦產(chǎn)品的核心功能,打造高可靠的集群、靈活的擴展能力以及超高的性能;
? ? 積木式擴展——建立眾多的中小規(guī)模、易管理的集群,支持跨數(shù)據(jù)中心將多個集群聚合成超大資源池,而非直接采用大規(guī)模、統(tǒng)一管理的分布式集群。
03.設(shè)計原則
?
04.產(chǎn)品特點
?
05.高級特性
?
二、技術(shù)架構(gòu)
01 數(shù)據(jù)組織結(jié)構(gòu)
? ? ? ?NAS系統(tǒng)把整個存儲資源組織為目錄樹的形式。與此不同,對象存儲系統(tǒng)把存儲資源組織為租戶-桶-對象的形式。數(shù)據(jù)結(jié)構(gòu)組織見下圖:
對象:類似于hash表中的表項:它的名字相當于關(guān)鍵字,它的內(nèi)容相當于“值”。
桶:是若干個對象的邏輯抽象,是盛裝對象的容器。
租戶:用于隔離存儲資源。在租戶之下可以建立桶、存儲對象。
用戶:在租戶下面創(chuàng)建的用于訪問不同桶的賬號。可以使用MinIO提供的mc命令設(shè)置不用用戶訪問各個桶的權(quán)限。
?
02 數(shù)據(jù)分布與均衡
1 去中心化架構(gòu)
? ? MinIO采用去中心化的無共享架構(gòu),對象數(shù)據(jù)被打散存放在不同節(jié)點的多塊硬盤,對外提供統(tǒng)一命名空間訪問,并通過Web負載均衡器或DNS輪詢(DNS round-robin)在各服務器之間實現(xiàn)負載均衡。?
?
2 統(tǒng)一命名空間
? ? ? MinIO對象存儲系統(tǒng)主要有兩種部署方式,一種是常見的本地分布式集群部署,一種是聯(lián)盟模式部署。本地分布式集群部署方式即在多個本地服務器節(jié)點部署MinIO軟件,并將其組件成單套分布式存儲集群,并提供統(tǒng)一命名空間和標準S3訪問接口。聯(lián)盟部署模式即將多個MinIO集群在邏輯上組成了統(tǒng)一命名空間,實現(xiàn)近乎無限的擴展與海量的數(shù)據(jù)規(guī)模管理,這些集群可以都在本地,或分布在不同地域的數(shù)據(jù)中心。
? ? ? ?如下圖所示,4個服務器節(jié)點組成一個MinIO集群,每個服務器節(jié)點中會選擇相同數(shù)據(jù)的硬盤創(chuàng)建一個糾刪組,某個桶的數(shù)據(jù)會根據(jù)MinIO的分布式算法,切片分散存儲到對應的糾刪組中(詳見糾刪碼相關(guān)內(nèi)容)。
?
3 分布式鎖管理
? ? ? ?與分布式數(shù)據(jù)庫相類似,MinIO對象存儲系統(tǒng)也面臨數(shù)據(jù)一致性問題:一個客戶端程序在讀取一個對象的同時,另一個客戶端程序可能正在修改或者刪除這個對象。為了避免出現(xiàn)數(shù)據(jù)不一致情況,MinIO相關(guān)開發(fā)人員為MinIO對象存儲專門設(shè)計并實現(xiàn)了dsync分布式鎖管理器。它采用如下分布式鎖管理機制:
l ?任何一個節(jié)點的鎖請求都會廣播給集群內(nèi)所有在線節(jié)點;
l ?如果n/2 + 1個節(jié)點回應“是”,則成功獲得鎖;
l ?客戶端獲得鎖以后可保留任意時間,不需要時自己釋放即可。釋放操作也會廣播給所有的節(jié)點,從而恢復鎖的可用狀態(tài)。寫鎖僅能被一個寫入者獲得。
?
設(shè)計目標
?要求設(shè)計簡單,因為簡單的設(shè)計,可以避免程序中很多非常棘手的條件分支的支持。
?不存在主節(jié)點,因為一旦在設(shè)計上引入主節(jié)點,那么如果主節(jié)點宕機,整個鎖管理器機制即將失效,這對MinIO對象存儲系統(tǒng)影響非常嚴重,是不可接受的。
?系統(tǒng)必須是彈性的,即使存在多個失效的節(jié)點,只要它們的個數(shù)小于n/2, 整個鎖管理系統(tǒng)是可以正常工作的。
?完全可以替代Golang標準庫中的sync.RWMutex互斥鎖。這樣可以簡化MinIO對象存儲系統(tǒng)的編程。
?當失效節(jié)點重啟以后,其它節(jié)點重新連接。
?
不使用zookeeper/raft等技術(shù)的原因
? ? ? ?zookeeper/raft功能豐富,而MinIO對象儲存的使用用例其實很有限。在MinIO中使用zookeeper/raft,會使整個系統(tǒng)增加不必要的復雜性。
?
優(yōu)勢
?實際操作極其簡單,有效代碼不足一千行,易理解,易維護。
?超高的性能。詳細數(shù)據(jù)請參考文獻[12]
?
4 云網(wǎng)關(guān)模式
? ? ? ?MinIO存儲系統(tǒng)的后端可以是磁盤,也可以作為云網(wǎng)關(guān),對接第三方的NAS系統(tǒng)、分布式文件系統(tǒng)或公有云存儲資源,并為業(yè)務系統(tǒng)轉(zhuǎn)換提供標準的對象訪問接口。
? ? ?目前MinIO支持Google 云存儲、HDFS、阿里巴巴OSS、亞馬遜S3, 微軟Azure Blob 存儲等第三方存儲資源。
?
03 元數(shù)據(jù)
1 架構(gòu)
? ? ? MinIO對象存儲系統(tǒng)無元數(shù)據(jù)數(shù)據(jù)庫,所有的操作都是對象級別的粒度的。這種做法的優(yōu)勢是:
? 個別對象的失效,不會溢出為更大級別的系統(tǒng)失效。
?便于實現(xiàn)“強一致性”這個特性。此特性對于機器學習與大數(shù)據(jù)處理非常重要。
?
2 管理
? ? ? 元數(shù)據(jù)與數(shù)據(jù)一起存放在磁盤上:數(shù)據(jù)部分糾刪分片以后存儲在磁盤上,元數(shù)據(jù)以明文形式存放在元數(shù)據(jù)文件里(xl.json)。假定對象名字為obj-with-metadata, 它所在的桶的名字是bucket_name, ?disk是該對象所在糾刪組的任一個磁盤的路徑,如下目錄:
disk/bucket_name/obj-with-metadata?
記錄了這個對象在此磁盤上的信息。其中的內(nèi)容如下:
?
? ? ? 其中的xl.json即是此對象的元數(shù)據(jù)文件。part.1 即此對象的第一個數(shù)據(jù)分片。對象的元數(shù)據(jù)文件xl.json的內(nèi)容是如下這種形式的json字符串:
字段說明
?
1 format字段
? ? ?該字段指明了這個對象的格式是xl。MinIO內(nèi)部存儲數(shù)據(jù)主要有兩種數(shù)據(jù)格式:xl與fs。使用如下命令啟動的MinIO使用的存儲格式是fs:
?
? ? ? ?這種模式主要用于測試, 對象存儲很多API都是并沒有真正實現(xiàn)的樁函數(shù)。在生產(chǎn)環(huán)境所用的部署方式(本地分布式集群部署、聯(lián)盟模式部署、云網(wǎng)關(guān)模式部署)中,存儲格式都是xl。
?
2 stat字段
? ? ??記錄了此對象的狀態(tài),包括大小與修改時間,如下圖:
3 erasure字段
? ? ? 這個字段記錄此對象與糾刪碼有關(guān)的信息,如下圖:
??其中的algorithm指明了此對象采用的是Klaus Post實現(xiàn)的糾刪碼,生成矩陣是范德蒙矩陣。
??data,parity指明了糾刪組中數(shù)據(jù)盤、校驗盤的個數(shù)。
??blockSize 指明了對象被分塊的大小,默認是5M(請參見上一節(jié)“數(shù)據(jù)分布與均衡”)。
?index指明了當前磁盤在糾刪組中的序號。
??distribution:每個糾刪組的數(shù)據(jù)盤、校驗盤的個數(shù)是固定的,但是不同的對象的分片寫入這個糾刪組的不同磁盤的順序是不同的。這里記錄了分布順序。
??checksum:它下面的字段個數(shù)跟此對象的分片數(shù)量有關(guān)。在舊版本的MinIO對象存儲系統(tǒng),每一個分片經(jīng)過hash函數(shù)計算出的checksum會記錄在元數(shù)據(jù)文件的這個位置。最新版的MinIO會把checksum直接計入分片文件(即part.1等文件)的前32個字節(jié)。
? ? ? 此字段之下algorithm的值是”highwayhash256S”表明checksum值是寫入分片文件的。
? ? ??
4 minio字段
? ? ? ?這個字段記錄了存儲此對象的minio的版本。
?
5 meta字段
? ? ? Content-type, etag兩個字段是MinIO對象存儲系統(tǒng)自動生成的。
? ? ? 用戶在使用Python等語言的寫作的訪問MinIO的程序中,如果上傳對象時候指定了幾個自定義屬性,比如:
author屬性值為Zhangsan
Nation屬性值為Cn
Type屬性值為love
那么對象元數(shù)據(jù)文件的meta字段就會出現(xiàn)如下幾個子字段:
X-Amz-Meta-Author
X-Amz-Meta-Nation
X-Amz-Meta-Type
6 parts字段
? ? ? ?記錄各個分片的信息:
?
04 集群擴展
1 擴展方式
? ? ? ?MinIO支持聯(lián)盟部署模式,即將多個MinIO集群組成一個統(tǒng)一命名空間(一個ETCD集群,若干個CoreDNS服務)。其中ETCD集群相當于整個對象存儲系統(tǒng)的配置數(shù)據(jù)庫,很多重要的信息,如桶IP地址等存儲于其中。這種模式的MinIO的架構(gòu)如下圖:
聯(lián)盟模式多集群部署
?
? ? ? ?同樣,MinIO在擴展時也采用相同機制,而不是傳統(tǒng)分布式存儲的添加節(jié)點方式。MinIO主要通過添加新的集群來擴大整個系統(tǒng),可用空間大幅增加且仍然保持統(tǒng)一命名空間。通過這種方式,MinIO對象存儲系統(tǒng)幾乎可以無限的擴展總體性能和容量。
?
2 統(tǒng)一域名訪問
? ? MinIO集群擴展加入新了集群或桶后,對象存儲的客戶端程序需要通過統(tǒng)一域名/url(如bucket1.domain.com)來訪問數(shù)據(jù)對象,這個過程涉及到了CoreDNS系統(tǒng)。
CoreDNS實現(xiàn)單一域名/URL訪問
?
MinIO對象存儲的某個客戶端(比如mc),首先向某個MinIO服務發(fā)送創(chuàng)建桶的請求。MinIO服務把這個桶所在的MinIO集群的外部網(wǎng)址(一般為一個Nginx的IP地址,或者MinIO集群的每一臺服務器的IP地址),寫入到etcd集群中。
假定域名為domain.com,桶名為buc-1,集群的服務器IP地址為192.168.1.108、192.168.1.109,那么寫入etcd集群的共有兩條數(shù)據(jù).第一條數(shù)據(jù)的key,value二元組為:
第二條數(shù)據(jù)的key,value二元組為:
CoreDNS通過etcd系統(tǒng)獲知”bucket1.domain.com”這個url所對應的兩個IP地址為192.168.1.108, 192.168.1.109。對象存儲的客戶端主機設(shè)置如上所配置的CoreDNS服務之后,客戶端程序就可以通過域名”bucket1.domain.com”來找到訪問這個桶。
?
3 優(yōu)勢特性
單一的、超大的命名空間需要花費大量的創(chuàng)建、維護與停機時間,復雜的部署管理,進而帶來更嚴重的次生故障。MinIO的設(shè)計理念就是化整為零,簡化集群擴展,減小單個集群的體量,輕量化單個集群的運維,從而使得超大規(guī)模的存儲管理與維護變得更加容易。
??集群的節(jié)點完全對等,沒有主節(jié)點,多個節(jié)點可以并發(fā)提供對象訪問服務;
??創(chuàng)建桶的時候,可以指定數(shù)據(jù)中心/地域,以匹配對應的業(yè)務訪問;
??無論添加多少個集群,原有集群的性能幾乎是不變的;
??集群不會過大(32個節(jié)點),可實現(xiàn)可靠的分布式鎖管理器,進而保證更新、刪除等操作的強一致性。傳統(tǒng)的架構(gòu)允許集群擴容到數(shù)百上千節(jié)點,此情況下的強一致性容易產(chǎn)生性能問題;
??故障的影響范圍小,限制在單個集群內(nèi)部。
?
05 糾刪碼
? ? ? 在同一集群內(nèi),MinIO會自動生成若干糾刪組,用于存放桶數(shù)據(jù)。一個糾刪組中的一定數(shù)量的磁盤發(fā)生的故障(故障磁盤的數(shù)量小于等于校驗盤的數(shù)量),通過糾刪碼算法可以恢復出正確的數(shù)據(jù)。MinIO集成了Reed-Solomon糾刪碼庫,MinIO存儲對象數(shù)據(jù)時,首先把它生成若干等長的片段(對于大對象,默認按5MB切片),然后每一個片段會糾刪算法分成若干分片,包括數(shù)據(jù)分片與校驗分片,每個分片放置在一個糾刪組的某個節(jié)點上。對象的每一個數(shù)據(jù)分片、校驗分片都被“防比特位衰減”算法所保護。
?
?
對于一個對象,MinIO是如何定位它所在的糾刪組呢?
? ? ?假定所有的糾刪組都有一個序號(從0開始,直至糾刪組個數(shù)減1)。MinIO會根據(jù)對象名(類似于文件系統(tǒng)的全路徑名),使用crc32哈希算法計算出一個整數(shù)。然后使用這個整數(shù)除以糾刪組的個數(shù),得到一個余數(shù)。這個余數(shù),可以作為糾刪組的序號,這樣就確定了這個對象所在的糾刪組。MinIO采用CRC32哈希算法,與GlusterFs的Davies-Meyer哈希算法(性能、沖突概率與md4, md5相近)不一樣的是, CRC32算法的哈希值分布較不均勻,但運算速度極快,高出md4數(shù)倍。相對于容量均衡,MinIO更看重數(shù)據(jù)的寫入速度。
?
06 數(shù)據(jù)修復
比特位衰減(Bitrot)是指存在存儲介質(zhì)中的數(shù)據(jù)發(fā)生了緩慢的變化,如向存儲介質(zhì)寫入一段比特流,一段時間后再讀出來,二者并不一致。比特位衰減的原因大致有:磁記錄磨損、磁盤幻象寫(phantom writes)、磁盤指向錯誤(misdirectedreads/writes)、宇宙射線的輻射等。MinIO對象存儲系統(tǒng)從設(shè)計之初即考慮到修復靜默錯誤,從被修復的目標來說,按照大小可以分為以下三種類型的修復:某個對象、某個桶、整個集群。
在控制臺上執(zhí)行mc命令即開始進行數(shù)據(jù)修復。該命令一方面向minio發(fā)送數(shù)據(jù)修復的HTTP請求,另一方面不斷地接收minio服務進程返回的修復進度信息,而后輸出到控制臺,直到修復工作完畢。
如前文所述,每個對象都被分成多個分片,然后存儲于多臺主機的磁盤上。數(shù)據(jù)修復可以分為正常、深度兩種模式,正常模式下只是簡單地檢查分片狀態(tài)信息,深度模式下會使用hash算法來校驗分片的內(nèi)容,找出比特位錯誤,同時也更耗費資源。
MinIO具體修復流程如下:
??mc命令作為MinIO對象存儲的客戶端軟件、管理工具,它內(nèi)部鏈接了minio軟件(代碼網(wǎng)址:https://github.com/minio/minio/)的madmin軟件模塊,通過調(diào)用madmin中的修復函數(shù),mc包裝了mc命令的命令行參數(shù),然后向minio服務進程發(fā)送HTTP消息。
?
?mc發(fā)送一個修復請求,在minio中被類healSequence所描述。每一個healSequence可以啟動、停止、查詢狀態(tài)。minio服務程序收到新的任務的時候,會檢查是否跟原有的healSequence有重疊的任務,如果有重疊,則啟動的修復任務失敗。如果minio服務沒有發(fā)現(xiàn)錯誤,則使用深度優(yōu)先搜索的算法,按照磁盤元數(shù)據(jù)信息、桶、對象的順序,不斷地給后臺修復線程推送任務。
?
?minio后臺修復線程修復對象的流程算法:對于對象的每一個block(默認大小為5M),從糾刪組的各個主機讀取各個分片,如果有錯誤的分片,就需要修復,有兩種可能:校驗分片錯誤——minio使用各個數(shù)據(jù)分片重新計算缺失的校驗片。數(shù)據(jù)分片錯誤——使用糾刪算法恢復數(shù)據(jù)(需要計算逆矩陣)。
?
?
07 lambda計算
? ? ? ?MinIO對象存儲軟件支持lambda計算通知機制,即桶中的對象支持事件通知機制。MinIO當前支持的事件類型有:對象上傳、對象下載、對象刪除、對象復制等。MinIO對象存儲軟件當前支持的事件接受系統(tǒng)有:Redis,NATS, AMQP, MQTT,Apache Kafka, MySql, PostgreSQL, Elasticsearch等。
? ? ? ?對象通知機制,極大地增強了MinIO對象存儲的擴展性,可以讓用戶通過自行開發(fā)來實現(xiàn)某些MinIO對象存儲不便實現(xiàn)的功能,比如基于元數(shù)據(jù)進行的各種檢索、各種跟用戶的業(yè)務有關(guān)的計算。既方便了用戶,又有助于MinIO對象存儲的生態(tài)建設(shè)。
? ? ? ?對象通知機制,使用極為簡單,用戶只需在MinIO進行少許配置即可。請參考文獻[15]。
?
08 持續(xù)備份
? ?? 傳統(tǒng)的復制的一大問題是不能有效地擴展,很難超過幾百TB。在當今的時代,為了支持災難恢復,任何單位都需要一個備份策略。而且這個備份策略需要跨越不同的地理位置、不同的數(shù)據(jù)中心、多種多樣的云環(huán)境。
? ? MinIO的持續(xù)備份是為跨數(shù)據(jù)中心的大型部署而設(shè)計的。通過使用lambda計算通知機制,它可以快速、有效地計算處需要增量備份的內(nèi)容,這遠比傳統(tǒng)的批處理模式優(yōu)秀。持續(xù)備份使得未備份的數(shù)據(jù)盡可能的少,這意味著發(fā)生災難或者嚴重錯誤時候,丟失的數(shù)據(jù)盡可能的少,很好地保護了用戶的數(shù)據(jù)資產(chǎn)。
?
9 軟件模塊
? ? ?MinIO對象存儲系統(tǒng)主要由以下軟件模塊部分組成:存儲服務器軟件minio,存儲客戶端軟件mc,多種語言的客戶端SDK。minio分為上下兩層,上層負責minio的系統(tǒng)管理與對外接口,下層實現(xiàn)具體的邏輯。
?
1 cmd模塊
? 這是minio的上層,也就是源代碼中的cmd子目錄,參見: https://github.com/minio/minio/tree/master/cmd。這一部分主要負責minio的命令行參數(shù)解析、初始化系統(tǒng)、格式化磁盤、管理內(nèi)嵌的web服務器、S3 API的解析與邏輯處理。
?
2 各個軟件包
? ? ?這個是minio底層邏輯實現(xiàn),也就是源代碼目錄中的pkg子目錄。其中一些軟件包(比如madmin), 可被其它組織(或個人)在編寫輔助minio的軟件的時候所重復使用。
??madmin:使用這個軟件包可以自己使用Golang語言撰寫MinIO集群的管理程序,比如獲取服務的狀態(tài)(磁盤、cpu等信息)、重啟某個機器服務、啟動修復某個桶的任務、重新配置系統(tǒng)、獲取剖析信息等等。
? S3 select:如果對象存儲系統(tǒng)中有很多超大型的對象,比如大小是幾個GB甚至幾個TB的對象。如果應用程序(比如spark分析程序),要把符合條件的若干個對象都讀過去,然后再做分析,會及其的慢,浪費很多帶寬(畢竟對象中可能只有很少的一部分是對某個分析程序有用的)。因此Amazon引入了S3 Select 的功能。通俗地說,就是把select 類型的sql語句在某個對象上執(zhí)行,從對象中取出一部分內(nèi)容返回給應用。MinIO提供了S3 Select 功能。相對于S3 Select, MinIO要求對象的內(nèi)容必須是CSV、 JSON,或者 Parquet格式。S3Select API實現(xiàn)中使用的語法分析器是 Alec Thomas寫的如下項目:
https://github.com/alecthomas/participle
這個實現(xiàn)的分析算法是帶有棧的ll(k)分析算法。
?
三 性能測試
? ? ?MinIO已經(jīng)為高性能做過高度優(yōu)化,尤其是部分關(guān)鍵的算法已經(jīng)使用SIMD指令對Intel(AVX2/AVX512)、Arm(NEON)的cpu做過特殊優(yōu)化,主要包括:
1) 糾刪碼部分用到的伽羅瓦域的運算:加法、乘法、乘方等等;
2) 監(jiān)測比特位衰減(bitrot)的哈希函數(shù),如HighwayHash。
另外每一個MinIO集群都是無中心的,其中的每一個節(jié)點都是對等的,從而在性能上,不會存在單點瓶頸,也不會有單點故障。
? ? 如下的硬件配置之下:Intel Skylake CPU, NVMe磁盤,以及Mellanox CX5 dual 100-GbE網(wǎng)卡。下圖是MinIO inc的測試結(jié)果:
?
四 設(shè)計討論
為什么MinIO單集群不支持擴展?
?傳統(tǒng)的擴展方式的劣勢
? ? ?通過增加節(jié)點來擴展單集群,一般需要進行數(shù)據(jù)均衡,否則群集內(nèi)各存儲節(jié)點會因負載不均而出現(xiàn)新的瓶頸。除了數(shù)據(jù)均衡操作的時機這個問題以外,在均衡過程中一般需要從存儲使用率高的節(jié)點向使用率低的節(jié)點遷移數(shù)據(jù)。當集群擴容之后,大量已經(jīng)寫入的文件落點會出現(xiàn)改變,文件需要遷移到真實的落點。當存儲系統(tǒng)容量比較大時,則會發(fā)生大量的文件/對象進行遷移,遷移過程可能由于占用大量資源而導致上層應用性能下降。而且當文件/對象遷移過程中,機器故障可能會導致一些意想不到的情況,尤其是有大量業(yè)務的時候。當然針對此類問題,Gluterfs之類的文件系統(tǒng)有一些比較復雜的處理辦法。
?
?使用場景
? ? ? 人工智能、大數(shù)據(jù)分析、視頻監(jiān)控等典型使用場景中,對象存儲系統(tǒng)中存儲的數(shù)據(jù)往往寫入以后一般不再修改。如果現(xiàn)有MinIO集群存儲空間使用完畢,重新添加新集群,然后繼續(xù)寫入新集群即可。MinIO對象存儲的客戶端應用,從業(yè)務層面自行決定那些對象存在于哪個集群里面,使用起來并不麻煩。
? ? 單集群不可擴展,也就是說系統(tǒng)不需要處理擴展和數(shù)據(jù)均衡,不僅有效降低系統(tǒng)復雜性,而且可以使得系統(tǒng)部署規(guī)劃具有很好的可預測性。
? ?對于海量對象存儲應用場景,數(shù)據(jù)通常具有典型的生命周期特征,根據(jù)實際需求設(shè)計好單集群規(guī)模,按聯(lián)合方式擴展,整個系統(tǒng)具有非常好的可維護性。
?
?MinIO方案的優(yōu)勢
? ? ?不支持對單個集群進行擴展,MinIO對象存儲系統(tǒng)的這種設(shè)計,使得系統(tǒng)的很多模塊更加簡單(比如從一個對象轉(zhuǎn)換到它所在的糾刪組,只用簡單的哈希即可。)降低了整個系統(tǒng)出錯的概率,使得MinIO對象存儲系統(tǒng)更加可靠、穩(wěn)定。
詳細的討論參見文獻[14]
?
MinIO是否有類似于GlusterFs 的translator類機制?
? ? 沒有,GlusterFs是使用c語言實現(xiàn)的,而c語言是比較低級的語言,本身沒有模塊機制。Golang語言自身有強大的模塊機制,所以也就不需要類似于translator之類的機制。
?
MinIO的糾刪碼機制,為何沒有采用柯西矩陣?
?
? ? 就Reed-Solomon糾刪碼的生成矩陣來說,Klaus的糾刪碼庫里面可以選擇柯西生成矩陣。不過當前MinIO軟件使用的仍然是范德蒙矩陣的Reed-Solomon糾刪算法。這是因為:雖然柯西矩陣的生成相比范德蒙矩陣更快,不過MinIO編碼矩陣的生成是只進行一次的操作(程序運行中,生成的這個矩陣會被保存起來)。使用柯西矩陣對數(shù)據(jù)的吞吐量并沒有什么影響。
?
五 對象存儲產(chǎn)品選型討論
? ? ? 開源對象存儲軟件以MinIO,Ceph為典型代表。為幫助相關(guān)人員在選擇對象存儲系統(tǒng)之時選擇合適的產(chǎn)品,此處對二者的特點、特性做一定討論。
01 MinIO優(yōu)勢
1 部署極其簡單
? ? ?MinIO系統(tǒng)的服務程序僅有minio一個可執(zhí)行文件,基本不依賴其它共享庫或者rpm/apt包。minio的配置項很少(大部分都是內(nèi)核之類系統(tǒng)級的設(shè)置),甚至不配置也可以正常運行起來。百度、google、bing等搜索引擎上基本沒有關(guān)于MinIO部署問題的網(wǎng)頁,可見在實踐中,很少有使用者遇到這方面的問題。
? ? ??相比之下,Ceph系統(tǒng)的模塊,相關(guān)的rpm、apt包眾多,配置項非常多,難以部署,難調(diào)優(yōu)。某些Linux發(fā)行版的Ceph安裝包甚至有bug,需要使用者手動改動Ceph的python腳本,才能安裝完畢。
?
2 二次開發(fā)容易
? ? ?MinIO對象存儲系統(tǒng)除了極少數(shù)代碼使用匯編實現(xiàn)以外,全部使用Golang語言實現(xiàn)。Ceph系統(tǒng)是使用業(yè)界聞名的難學難用的c++語言編寫的。Golang語言由于產(chǎn)生較晚,吸收了很多語言尤其是c++的教訓,語言特性比較現(xiàn)代化。相對而言,MinIO系統(tǒng)的維護、二次開發(fā)比較容易。
?
3 網(wǎng)管模式支持多種其他存儲
? ? ?通過網(wǎng)關(guān)模式,MinIO對象存儲后端,可以對接各種現(xiàn)有的常見其它存儲類型,比如的NAS系統(tǒng),微軟Azure Blob 存儲、Google 云存儲、HDFS、阿里巴巴OSS、亞馬遜S3等,非常有利于企業(yè)復用現(xiàn)有資源,有利于企業(yè)低成本(硬件成本約等于零,部署MinIO對象存儲軟件即可)地從現(xiàn)有系統(tǒng)平滑升級到對象存儲。
?
02 Ceph優(yōu)勢?
?數(shù)據(jù)冗余策略更加豐富
? ? ?Ceph同時支持副本、糾刪碼,而MinIO只支持糾刪碼。對于個別的對于數(shù)據(jù)可靠性要求極高的單位,Ceph對象存儲更加合適。
?社區(qū)目前更成熟
?
03 其他對比
1 廠商支持
? ? ?國內(nèi)使用Ceph的廠商、基于Ceph進行自研的存儲廠商都比較多,在使用過程中遇到的問題(有些時候,甚至需要修改、增強乃至重新實現(xiàn)Ceph本身的功能),可以向相關(guān)廠商尋求支持。國際方面,Ceph早已被紅帽收購,而紅帽近期又被IBM收購。
? ? MinIO開發(fā)與支持的廠商只有MinIO公司。由于架構(gòu)比較先進,語言高級,MinIO本身的程序比較容易讀懂、修改。招聘Golang程序員來 維護MinIO所花費的成本,顯然低于招聘c++程序員來維護Ceph。?
?
2 多語言客戶端SDK
? ? 二者均有常見編程語言的客戶端,比如:python, java等。MinIO對象存儲軟件的開發(fā)SDK另外支持純函數(shù)式的語言Haskell。
?
3 技術(shù)文檔??
? ? ?內(nèi)部實現(xiàn)的文檔MinIO基本不存在。想要了解內(nèi)部實現(xiàn)乃至參與開發(fā)的技術(shù)人員,只能到如下社區(qū):
http://minio.slack.com/ ,與MinIO的開發(fā)人員直接交流,或者自己閱讀代碼。Ceph的各種實現(xiàn)文檔、算法說明文檔非常豐富。這方面Ceph要比MinIO成熟很多。
?
04 結(jié)論
? ? 由以上討論,可見作為對象存儲軟件來說,MinIO, Ceph都非常優(yōu)秀,各自有各自的優(yōu)勢。準備使用對象存儲軟件的用戶,應該根據(jù)自己單位的需求、技術(shù)儲備等實際情況,選擇適當?shù)能浖?/p>
?
六 參考硬件
?
? ? ?MinIO是符合軟件定義存儲SDS理念的,兼容主流X86服務器以及ARM/飛騰平臺,同時也可以移植到諸如申威(Alpha架構(gòu))和龍芯(Mips架構(gòu))等硬件平臺。
? ? 下面這些符合工業(yè)標準的、廣泛采用的服務器是經(jīng)過MinIO inc.優(yōu)化測試過的、MinIO對象存儲軟件表現(xiàn)優(yōu)異的服務器:
?
參考文獻
1https://github.com/krishnasrinivas/wikinotes/wiki/minio-scaling
2https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/dev/Welcome.html
3Klaus Post官網(wǎng):https://klauspost.com/
4https://github.com/klauspost/reedsolomon?
5https://developer.ibm.com/articles/cl-cloudstorage/
6https://github.com/minio/dsync
7https://github.com/minio/dsync/pull/22#issue-176751755
8https://github.com/minio/minio/blob/master/cmd/xl-sets.go?
9https://min.io/resources/docs/MinIO-throughput-benchmarks-on-NVMe-SSD.pdf?
10https://github.com/minio/minio/blob/master/cmd/admin-heal-ops.go
11https://github.com/klauspost/reedsolomon/blob/master/options.go
12https://github.com/minio/dsync
13https://min.io/resources/docs/CPG-MinIO-implementation-guide.pdf?
14https://github.com/minio/minio/issues/7986
15https://docs.min.io/docs/minio-bucket-notification-guide.html
(TaoCloud團隊原創(chuàng) 《MinIO技術(shù)白皮書》微信公眾號版)
總結(jié)
以上是生活随笔為你收集整理的开源对象存储MinIO技术白皮书的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux下c开发 之 线程通信(转)
- 下一篇: MPEG2、H.263、H.264协议效