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