极光笔记丨搭建UMS私有云文件服务器
作者:極光高級(jí)工程師—胡冠軍
一、背景
因UMS5.1版本當(dāng)中短信簽名,郵件支持上傳本地圖片/支持上傳附件的產(chǎn)品需求,以及后續(xù)可能存在的需要大量文件存儲(chǔ)的場(chǎng)景,所以需做一個(gè)私有云自己的文件服務(wù)器,并且該服務(wù)器也要兼容客戶文件服務(wù)器(注:客戶文件服務(wù)器一般都是兼容S3協(xié)議的)
二、調(diào)研文件服務(wù)器
經(jīng)過(guò)各種調(diào)研,選型和組內(nèi)討論,最終決定選擇minIO
1.minIO簡(jiǎn)介
minIO 是一個(gè)基于 Apache License v2.0 開源協(xié)議使用 Go 語(yǔ)言開發(fā)的對(duì)象存儲(chǔ)服務(wù)。它兼容亞馬遜 S3 云存儲(chǔ)服務(wù)接口,非常適合于存儲(chǔ)大容量非結(jié)構(gòu)化的數(shù)據(jù),例如圖片、視頻、日志文件、備份數(shù)據(jù)和容器/虛擬機(jī)鏡像等,而一個(gè)對(duì)象文件可以從幾kb到最大5T不等。minIO 是一個(gè)非常輕量的服務(wù),可以很簡(jiǎn)單的和其他應(yīng)用的結(jié)合,類似 NodeJS, Redis 或者 MySQL。
2.minIO優(yōu)勢(shì)
兼容 Amazon S3
minIO使用 Amazon S3 v2 / v4 API。
數(shù)據(jù)保護(hù)
minIO使用erasure code來(lái)防止硬件故障。即使損壞一半以上的硬盤,仍然可以從中恢復(fù)數(shù)據(jù)。
高度可用
minIO服務(wù)器可以容忍分布式系統(tǒng)中高達(dá)(N / 2)-1 節(jié)點(diǎn)故障。
Lambda 計(jì)算
minIO服務(wù)器通過(guò)其兼容 AWS SNS / SQS 的事件通知服務(wù)觸發(fā) Lambda 功能。支持的目標(biāo)是消息隊(duì)列,如 Kafka,AMQP,以及 Elasticsearch,Redis,MySQL 等數(shù)據(jù)庫(kù)。
加密和防篡改
minIO為加密數(shù)據(jù)提供了機(jī)密性,完整性和真實(shí)性保證,而且性能開銷微乎其微。使用 AES-256-GCM,ChaCha20-Poly1305 和 AES-CBC 支持服務(wù)器端和客戶端加密。
可對(duì)接后端存儲(chǔ)
除了minIO自己的文件系統(tǒng),還支持 DAS、 JBODs、NAS、Google 云存儲(chǔ)和 Azure Blob 存儲(chǔ)。
sdk 支持
基于minIO輕量的特點(diǎn),它得到類似 Java、Python 或 Go 等語(yǔ)言的 sdk 支持
一致性
minIO在分布式和單機(jī)模式下,所有讀寫操作都嚴(yán)格遵守read-after-write一致性模型。
3.minIO架構(gòu)圖
minIO采用去中心化的無(wú)共享架構(gòu),對(duì)象數(shù)據(jù)被打散存放在不同節(jié)點(diǎn)的多塊硬盤,對(duì)外提供統(tǒng)一命名空間訪問(wèn),并通過(guò)Web負(fù)載均衡器或DNS輪詢(DNS round-robin)在各服務(wù)器之間實(shí)現(xiàn)負(fù)載均衡。
4.minIO存儲(chǔ)機(jī)制
4.1 基本概念
硬盤(Drive):即存儲(chǔ)數(shù)據(jù)的磁盤,在 minIO 啟動(dòng)時(shí),以參數(shù)的方式傳入。
組( Set ):即一組 Drive 的集合,分布式部署根據(jù)集群規(guī)模自動(dòng)劃分一個(gè)或多個(gè) Set ,每個(gè) Set 中的 Drive 分布在不同位置。一個(gè)對(duì)象存儲(chǔ)在一個(gè) Set 上。
桶(Bucket):文件對(duì)象存儲(chǔ)的邏輯位置,對(duì)于客戶端而言,就相當(dāng)于一個(gè)存放文件的頂層文件夾。
4.2 糾刪碼
minIO 使用糾刪碼(erasure code)和校驗(yàn)和(check sum)來(lái)保護(hù)數(shù)據(jù)免受硬件故障和無(wú)聲數(shù)據(jù)損壞。即便您丟失一半數(shù)量(N/2)的硬盤,您仍然可以恢復(fù)數(shù)據(jù)。
什么是糾刪碼呢?它是一種恢復(fù)丟失和損壞數(shù)據(jù)的數(shù)學(xué)算法,minIO 采用Reed-Solomon Code實(shí)現(xiàn)糾刪碼,它將對(duì)象拆分成 N/2 數(shù)據(jù)塊和 N/2 奇偶校驗(yàn)塊。這就意味著如果是 12 塊盤,一個(gè)對(duì)象會(huì)被分成 6 個(gè)數(shù)據(jù)塊、6 個(gè)奇偶校驗(yàn)塊,您可以丟失任意 6 塊盤(不管其是存放的數(shù)據(jù)塊還是奇偶校驗(yàn)塊),您仍可以從剩下的盤中的數(shù)據(jù)進(jìn)行恢復(fù)。
4.3 Reed-Solomon Code數(shù)據(jù)恢復(fù)原理簡(jiǎn)析
RS編碼以word為編碼和解碼單位,大的數(shù)據(jù)塊拆分到字長(zhǎng)為w(取值一般為8或者16位)的word,然后對(duì)word進(jìn)行編解碼。數(shù)據(jù)塊的編碼原理與word編碼原理相同,后文中以word為例說(shuō)明,變量Di, Ci將代表一個(gè)word。把輸入數(shù)據(jù)視為向量D=(D1,D2,..., Dn), 編碼后數(shù)據(jù)視為向量(D1, D2,..., Dn, C1, C2,.., Cm),RS編碼可視為如下(圖1)所示矩陣運(yùn)算。圖1最左邊是編碼矩陣(或稱為生成矩陣、分布矩陣,Distribution Matrix),編碼矩陣需要滿足任意n*n子矩陣可逆。為方便數(shù)據(jù)存儲(chǔ),編碼矩陣上部是單位陣(n行n列),下部是m行n列矩陣。下部矩陣可以選擇范德蒙德矩陣或柯西矩陣。
RS最多能容忍m個(gè)數(shù)據(jù)塊被刪除。數(shù)據(jù)恢復(fù)的過(guò)程如下:
(1)假設(shè)D1、D4、C2丟失,從編碼矩陣中刪掉丟失的數(shù)據(jù)塊/編碼塊對(duì)應(yīng)的行。(圖2、3)
(2)由于B' 是可逆的,記B'的逆矩陣為 (B'^-1),則B' * (B'^-1) = I 單位矩陣。兩邊左乘B' 逆矩陣。(圖4、5)
(3)得到如下原始數(shù)據(jù)D的計(jì)算公式,如下圖:
(4)對(duì)D重新編碼,可得到丟失的編碼。
4.4 以糾刪碼模式運(yùn)行minIO
minIO會(huì)自動(dòng)生成12塊盤,命令如下:
4.5 存儲(chǔ)形式
數(shù)據(jù)對(duì)象在minIO集群中進(jìn)行存儲(chǔ)時(shí),先進(jìn)行糾刪分片,后打散存儲(chǔ)在各硬盤上。具體為:minIO自動(dòng)在集群內(nèi)生成若干糾刪組,每個(gè)糾刪組包含一組硬盤,其數(shù)量通常為4至16塊;對(duì)數(shù)據(jù)對(duì)象進(jìn)行分片,默認(rèn)策略是得到相同數(shù)量的數(shù)據(jù)分片和校驗(yàn)分片;而后通過(guò)哈希算法計(jì)算出該數(shù)據(jù)對(duì)象對(duì)應(yīng)的糾刪組,并將數(shù)據(jù)和校驗(yàn)分片存儲(chǔ)至糾刪組內(nèi)的硬盤上。
如上圖所示,假設(shè)某minIO集群內(nèi)糾刪組包含4塊硬盤,某數(shù)據(jù)對(duì)象名為MyObject,其隸屬存儲(chǔ)桶名為MyBucket,哈希計(jì)算得到對(duì)應(yīng)的糾刪組為Disk 1~4。那么在Disk 1~4的數(shù)據(jù)路徑下,都會(huì)生成MyBucket/MyObject子路徑,子路徑中包含2個(gè)文件,分別為存儲(chǔ)元數(shù)據(jù)信息的xl.json和MyObject對(duì)象在該盤上的第一個(gè)分片part.1。其中,xl表示minIO中數(shù)據(jù)對(duì)象的默認(rèn)存儲(chǔ)格式。
5.minIO golang SDK簡(jiǎn)單使用
以下上傳文件的例子可以直接運(yùn)行,文件會(huì)上傳到minIO官方服務(wù)器
三、minIO在UMS系統(tǒng)中的實(shí)際應(yīng)用
1.應(yīng)用系統(tǒng)架構(gòu)
整個(gè)架構(gòu)中,模塊之間使用http協(xié)議通信,并且每個(gè)模塊的作用如下:
(1)Web/API服務(wù)器的作用是提供UMS系統(tǒng)的認(rèn)證和鑒權(quán),即驗(yàn)證Web客戶端或者開發(fā)者API請(qǐng)求接口的合法性;
(2)文件管理服務(wù)器的作用是提供對(duì)外操作minIO服務(wù)器的接口,根據(jù)目前UMS系統(tǒng)的業(yè)務(wù)需求,只提供了獲取上傳文件presignedURL,設(shè)置過(guò)期時(shí)間, 設(shè)置對(duì)外訪問(wèn)策略,創(chuàng)建存儲(chǔ)桶,生成下載文件URL的功能;那么什么是presignedURL呢?它是對(duì)象所有者使用自己的安全憑證來(lái)創(chuàng)建預(yù)簽名的 URL,以授予有限時(shí)間內(nèi)的上傳或下載對(duì)象權(quán)限,從而與其他用戶共享對(duì)象,注:即使是私有對(duì)象使用presignedURL也可以共享給他人,并且presignedURL最大有效期為7天。
其中文件管理服務(wù)器獲取上傳文件presignedURL的方法直接使用了minIO官方API,當(dāng)然你也可以自己實(shí)現(xiàn)presignedURL方法,此外,由于下載presignedURL最大保留時(shí)間為7天,不符合UMS系統(tǒng)業(yè)務(wù)需求,所以,文件管理服務(wù)器自己實(shí)現(xiàn)了一個(gè)生成下載URL的方法,此鏈接的過(guò)期時(shí)間可任意設(shè)置,但前提要把存儲(chǔ)桶的對(duì)外訪問(wèn)策略設(shè)置為public。由此,客戶端就可以直接使用上傳presignedURL上文件到minIO服務(wù)器,使用下載鏈接直接下載文件即可。
(3)minIO集群作用是存儲(chǔ)實(shí)體文件,該集群采用去中心化無(wú)共享架構(gòu),各節(jié)點(diǎn)間為對(duì)等關(guān)系,連接至任一節(jié)點(diǎn)均可實(shí)現(xiàn)對(duì)集群的訪問(wèn),minIO集群前端增加了Nginx實(shí)現(xiàn)反向代理;minIO節(jié)點(diǎn)之間的通信使用的都是rpc。此外,管理minIO服務(wù)器除了上面提到的SDK以外,官方還提供了命令行和web頁(yè)面的形式,內(nèi)容分別如下:
把Nginx代理ip和端口號(hào)或者minIO集群中任意節(jié)點(diǎn)的ip和端口號(hào)輸入瀏覽器,輸入minIO的賬戶名和密碼即可登錄,界面如下:
2.具體交互邏輯
首先,客戶端要請(qǐng)求業(yè)務(wù)服務(wù)器(WebServer/APIServer)獲取上傳文件的憑證(presignedURL),然后,業(yè)務(wù)服務(wù)器響應(yīng)一個(gè)上傳文件URL和下載文件的URL,客戶端使用上傳URL上傳文件到文件服務(wù)器,使用下載URL作為請(qǐng)求后端的文件參數(shù),如發(fā)送郵件消息支持上傳本地圖片,上傳到后端的圖片即可使用文件下載URL作為參數(shù)。
該方案的優(yōu)點(diǎn)如下:
客戶端直接上傳文件到minIO服務(wù)器,不經(jīng)過(guò)業(yè)務(wù)服務(wù)器,減輕業(yè)務(wù)服務(wù)器的壓力,提高可用性
數(shù)據(jù)庫(kù)服務(wù)器只存儲(chǔ)文件的下載URL,減少數(shù)據(jù)庫(kù)的存儲(chǔ)量
支持上傳超大文件,比如3G以上等,硬件性能足夠的情況下,minIO服務(wù)器單個(gè)文件最大可達(dá)5T
上傳文件的數(shù)量沒(méi)有限制
可以解決同名文件覆蓋問(wèn)題
可以適配任何兼容S3協(xié)議的文件服務(wù)器,滿足不同客戶的要求
四、minIO分布式部署
1. minIO分布式部署架構(gòu)
1.1 架構(gòu)概述
minIO集群采用去中心化無(wú)共享架構(gòu),各節(jié)點(diǎn)間為對(duì)等關(guān)系,連接至任一節(jié)點(diǎn)均可實(shí)現(xiàn)對(duì)集群的訪問(wèn),這種節(jié)點(diǎn)間保持對(duì)等關(guān)系的設(shè)計(jì)并非最常見的分布式集群架構(gòu)。當(dāng)前大多數(shù)的分布式存儲(chǔ)集群,其節(jié)點(diǎn)往往可劃分為多類角色,例如負(fù)責(zé)連接并處理外部應(yīng)用請(qǐng)求的訪問(wèn)節(jié)點(diǎn)、負(fù)責(zé)存儲(chǔ)元數(shù)據(jù)的管理節(jié)點(diǎn)、實(shí)際的數(shù)據(jù)存儲(chǔ)節(jié)點(diǎn)等。minIO與之不同,minIO集群中的所有節(jié)點(diǎn)都同時(shí)承擔(dān)了多種角色,集元數(shù)據(jù)存儲(chǔ)、數(shù)據(jù)存儲(chǔ)、應(yīng)用訪問(wèn)等功能于一體,真正實(shí)現(xiàn)了去中心化和所有節(jié)點(diǎn)的完全對(duì)等。其優(yōu)勢(shì)在于有效地減少了集群內(nèi)的復(fù)雜調(diào)度過(guò)程以及因中心節(jié)點(diǎn)帶來(lái)的故障風(fēng)險(xiǎn)和性能瓶頸。
下圖minIO集群增加了Nginx代理:
部署minIO集群只需一條命令,但集群中每個(gè)節(jié)點(diǎn)都要執(zhí)行相同的命令
其中,官方推薦節(jié)點(diǎn)ip要連續(xù)。
1.2 minIO擴(kuò)容方案
首先,minIO的極簡(jiǎn)設(shè)計(jì)理念使得minIO分布式集群并不支持向集群中添加單個(gè)節(jié)點(diǎn)并進(jìn)行自動(dòng)調(diào)節(jié)的擴(kuò)容方式,這是因?yàn)榧尤雴蝹€(gè)節(jié)點(diǎn)后所引發(fā)的數(shù)據(jù)均衡以及糾刪組劃分等問(wèn)題會(huì)為整個(gè)集群帶來(lái)復(fù)雜的調(diào)度和處理過(guò)程,并不利于維護(hù)。因此,minIO提供了一種對(duì)等擴(kuò)容的方式,即要求增加的節(jié)點(diǎn)數(shù)和磁盤數(shù)均需與原集群保持對(duì)等。
例如原集群包含4個(gè)節(jié)點(diǎn)4塊磁盤,則在擴(kuò)容時(shí)必須同樣增加4個(gè)節(jié)點(diǎn)4塊磁盤(或?yàn)槠浔稊?shù)),以便系統(tǒng)維持相同的數(shù)據(jù)冗余SLA,從而極大地降低擴(kuò)容的復(fù)雜性。如上例,在擴(kuò)容后,minIO集群并不會(huì)對(duì)全部的8個(gè)節(jié)點(diǎn)進(jìn)行完全的數(shù)據(jù)均衡,而是將原本的4個(gè)節(jié)點(diǎn)視作一個(gè)區(qū)域,新加入的4節(jié)點(diǎn)視作另一區(qū)域,當(dāng)有新對(duì)象上傳時(shí),集群將依據(jù)各區(qū)域的可用空間比例確定存放區(qū)域,在各區(qū)域內(nèi)仍舊通過(guò)哈希算法確定對(duì)應(yīng)的糾刪組進(jìn)行最終的存放。此外,集群進(jìn)行一次對(duì)等擴(kuò)容后,還可依據(jù)擴(kuò)容規(guī)則繼續(xù)進(jìn)行對(duì)等擴(kuò)容,但出于安全性考慮,集群的最大節(jié)點(diǎn)數(shù)一般不得超過(guò)32個(gè)。
minIO支持通過(guò)命令,指定新的集群來(lái)擴(kuò)展現(xiàn)有集群(糾刪碼模式),命令行如下:
現(xiàn)在整個(gè)集群就擴(kuò)展了1024個(gè)磁盤,總磁盤變?yōu)?048個(gè),新的對(duì)象上傳請(qǐng)求會(huì)自動(dòng)分配到最少使用的集群上。通過(guò)以上擴(kuò)展策略,您就可以按需擴(kuò)展您的集群。重新配置后重啟集群,會(huì)立即在集群中生效,并對(duì)現(xiàn)有集群無(wú)影響。如上命令中,我們可以把原來(lái)的集群看做一個(gè)區(qū),新增集群看做另一個(gè)區(qū),新對(duì)象按每個(gè)區(qū)域中的可用空間比例放置在區(qū)域中。在每個(gè)區(qū)域內(nèi),基于確定性哈希算法確定位置。
注:您添加的每個(gè)區(qū)域必須具有與原始區(qū)域相同的磁盤數(shù)量(糾刪碼集)大小,以便維持相同的數(shù)據(jù)冗余SLA。例如,第一個(gè)區(qū)有8個(gè)磁盤,您可以將集群擴(kuò)展為16個(gè)、32個(gè)或1024個(gè)磁盤的區(qū)域,您只需確保部署的SLA是原始區(qū)域的倍數(shù)即可。
對(duì)等擴(kuò)容的優(yōu)點(diǎn)和缺點(diǎn)如下:
優(yōu)點(diǎn):在于配置操作簡(jiǎn)單易行,通過(guò)一條命令即可完成擴(kuò)容。
缺點(diǎn):①擴(kuò)容需重啟;②擴(kuò)容存在限制,集群節(jié)點(diǎn)數(shù)一般不超過(guò)32個(gè),這是由于MinIO集群通過(guò)分布式鎖保證強(qiáng)一致性,若集群節(jié)點(diǎn)數(shù)過(guò)大,維護(hù)強(qiáng)一致性將帶來(lái)性能問(wèn)題。
但對(duì)于初期存儲(chǔ)量不是很大,并且集群短暫停機(jī)重啟對(duì)業(yè)務(wù)影響不大的情況下,使用對(duì)等擴(kuò)容即可。
2. 注意事項(xiàng)
分布式minIO里所有的節(jié)點(diǎn)需要有同樣的access秘鑰和secret秘鑰,即:用戶名和密碼
分布式minIO存放數(shù)據(jù)的磁盤目錄必須是空目錄
分布式minIO官方建議生產(chǎn)環(huán)境最少4個(gè)節(jié)點(diǎn),因?yàn)橛蠳個(gè)節(jié)點(diǎn),得至少保證有N/2的節(jié)點(diǎn)才能可讀,保證至少N/2+1的節(jié)點(diǎn)才能可寫
分布式minIO節(jié)點(diǎn)時(shí)間要相同,機(jī)器配置也要都相同
分布式minIO會(huì)在每個(gè)磁盤都存一份數(shù)據(jù)文件保證數(shù)據(jù)的可靠性與安全性
3. 具體實(shí)施步驟
網(wǎng)上很多人部署minIO集群都是使用單個(gè)腳本,這在實(shí)際生產(chǎn)環(huán)境中很不友好,因?yàn)閙inIO要求集群中每個(gè)節(jié)點(diǎn)都要執(zhí)行相同的命令才能啟動(dòng)成功,所以最好的方式是使用ansible部署minIO集群。
3.1 安裝ansible
3.2 使用ansible部署minIO集群
Ansible編寫的核心代碼如下,具體細(xì)節(jié)讀者可自行百度
3.3 配置Nginx代理集群
Nginx配置文件內(nèi)容如下:
3.4 驗(yàn)證minIO集群是否部署成功
在瀏覽器上,輸入Nginx所在服務(wù)器的地址外加Nginx配置里的監(jiān)聽端口即可訪問(wèn)文件服務(wù)器web頁(yè)面,部署成功的效果如下:
五、結(jié)語(yǔ)
以上就是UMS私有云文件服務(wù)開發(fā)以及部署的主要內(nèi)容,該方案已經(jīng)得到實(shí)施驗(yàn)證,如果您想搭建兼容S3協(xié)議的文件服務(wù)器,那么該篇文章有參考價(jià)值,當(dāng)然由于時(shí)間倉(cāng)促并且初期文件存儲(chǔ)量不是很大,該方案也有需要優(yōu)化的地方,比如想實(shí)現(xiàn)動(dòng)態(tài)擴(kuò)容機(jī)制可以采用官方聯(lián)邦擴(kuò)容方式,不過(guò)這需要引入etcd,也需要更多的機(jī)器。總之,您還是需要根據(jù)具體業(yè)務(wù)場(chǎng)景來(lái)定,就像買鞋子不是越大越好,合腳的才是最好的。
關(guān)于極光
極光(Aurora Mobile,納斯達(dá)克股票代碼:JG)成立于2011年,是中國(guó)領(lǐng)先的移動(dòng)開發(fā)者服務(wù)提供商,專注于為開發(fā)者提供穩(wěn)定高效的消息推送、一鍵認(rèn)證以及流量變現(xiàn)等服務(wù),助力開發(fā)者的運(yùn)營(yíng)、增長(zhǎng)與變現(xiàn)。同時(shí),極光的行業(yè)應(yīng)用已經(jīng)拓展至市場(chǎng)洞察、金融風(fēng)控與商業(yè)地理服務(wù),助力各行各業(yè)優(yōu)化決策、提升效率。
點(diǎn)擊“閱讀原文”,進(jìn)入極光官網(wǎng)了解更多
總結(jié)
以上是生活随笔為你收集整理的极光笔记丨搭建UMS私有云文件服务器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: WPF 框架开发 加入 Internal
- 下一篇: 三人表决器实验报告总结_三人表决器实验报