一、背景
信也科技經過12多年的發展,已積累1億多的用户,每天都會產生百G級的用户圖片資料。2019年之前由於業務的迅速發展,用户的圖片資料為確保安全,採用加密、切片技術存儲在多個公有云上。公有云的穩定性大部分時候都宣稱能保證99.95%的服務可用性和99.9999999%的數據可靠性,直到某雲服務商發生了“數據丟失事件”,才意識到數據的可靠性完全不能依賴公有云。同時,信也科技是一家科技金融公司,對用户圖片資料的安全性有着金融級的要求,綜合多方面因素,我們需要建立一套私有的對象存儲了!
二、分佈式文件存儲選型
2.1 自研 or 開源
既然選擇建立一套自有對象存儲,就會面臨着自研 or 開源的選擇。如果自研一套分佈式文件存儲,我們需要相應的人才儲備,至少需要存儲架構師、存儲產品經理、存儲運維工程師、存儲開發工程師。基於公司的現狀,籌備這一套研發隊伍,無論是資金成本還是時間成本都無法滿足需求。鑑於此,只有選擇開源產品一條路可以走。
2.2 圖片資料使用場景
在對開源框架選型之前,需要先了解信也科技的用户圖片資料在業務中的使用場景。信也科技的圖片資料主要使用場景是對用户進行實名認證、OCR、人臉識別、活體檢測等用途。在助貸業務中,也會將用户資料授權給機構進行二次認證,同時也會給內部運營、客服進行人工審核、信息確認等用途。
2.3 開源框架選型
確立了開源的路線之後,下面要做的就是對開源產品的選型。在社區搜索會發現,目前有五個主流分佈式存儲技術,分為Cehp、GFS、HFDS、Swift、Lustre,其中GFS/HDFS/Lustre屬於文件存儲,Swift屬於對象存儲,而Ceph可支持塊存儲、對象存儲和文件存儲。詳細對比如下表:
| 分佈式存儲 | Ceph | GFS | HDFS | Swift | Lustre |
|---|---|---|---|---|---|
| 平台屬性 | 開源 | 閉源 | 開源 | 開源 | 開源 |
| 系統架構 | 去中心化架構 | 中心化架構 | 中心化架構 | 去中心化架構 | 中心化架構 |
| 數據存儲方式 | 塊、文件、對象 | 文件 | 文件 | 對象 | 文件 |
| 元數據節點數量 | 多個 | 1個 | 1個(主備) | 多個 | 1個 |
| 數據冗餘 | 多副本/糾刪碼 | 多副本/糾刪碼 | 多副本/糾刪碼 | 多副本/糾刪碼 | 無 |
| 數據一致性 | 強一致性 | 最終一致性 | 過程一致性 | 最終一致性 | 無 |
| 分塊大小 | 4MB | 64MB | 128MB | 視對象大小 | 1MB |
| 適用場景 | 頻繁讀寫場景 | 大文件連續讀寫 | 大數據場景 | 雲的對象存儲 | HPC超算 |
表1 Ceph、GFS、HDFS、Swift、Lustre的對比
由於信也科技的業務場景大多數都是小圖片的文件存儲,可以將選擇範圍直接縮小至適合小對象存儲的Ceph和Swift。另外,信也科技同時也是一家科技金融公司,對數據具有安全性、強一致性等需求,且對圖片資料需要頻繁讀寫的場景,最終確定選擇了Ceph。
三、雲存儲上的圖片處理解決方案
引入Ceph之後,將圖片處理分為了對象流服務,資料服務、對象存儲網關服務和離線圖片處理服務。為了保證數據的穩定性和高可用性,將公有云與私有云融合做成雙活機制,確保用户圖片資料的信息安全,所有用户的圖片經過RSA加密之後進行存儲,然後將公鑰下發到圖片使用方進行解密。
- 對象流讀取服務:傳輸對象流的服務,包括JPG、PNG、GIF、PDF、ZIP等格式,支持CDN緩存加速
- 對象流上傳服務:上傳圖片、文件等對象文件,防止上傳大對象,需要進行上行帶寬隔離。
- 資料服務:資料服務主要維護用户圖片資料的生命週期,包括存儲、查詢以及銷燬。
- 對象存儲網關服務:包括上傳對象進行公有云與私有云的雙備份存儲,對象流讀取的雙活邏輯,以及整個對象的生命週期管理和內容審核
- 離線圖片處理服務:處理圖片格式的轉換、明暗水印的處理、以及圖片的離線裁剪與縮放等多媒體功能。
3.1 公有云與私有云的融合雙活
由於在引入Ceph的過程中,考慮到整個技術團隊對Ceph的掌握能力處於初級階段,以及服務的整體穩定性,採用了公有云與私有云的雙活模式,通過雙寫公有云與私有云,並將鏈接的hash映射存儲至DB中,當公有云或私有云某一方出現故障的時候,能夠自動進行切換。
3.2 圖片加密處理
3.2.1 圖片水印
為了保證用户圖片資料的安全性,後台運營、客服人員查看圖片時,給圖片添加工號、登錄用户名等明暗水印,防止運營、客服人員將圖片外泄。
- 明水印
明水印是通過JDK自帶的Graphics2D實現的,其原理就是將圖片流轉換成java.awt.Image對象,然後通過java.awt.Graphics#drawImage(java.awt.Image, int, int, int, int, java.awt.image.ImageObserver)方法添加水印。
- 暗水印
暗水印是利用OpenCV包中的傅里葉變換實現的,原理如下:
利用OpenCV提供的傅里葉變換方法對圖片進行DFT轉換成頻域圖,然後合成含水印編碼的頻譜圖,然後再進行一次iDFT逆變換輸出含有暗水印的圖像。
3.2.2 圖片加密存儲
為了防止用户圖片資料的泄露,對用户上傳的資料圖片都進行了RSA加密再上傳至公有云與私有云。
四、展望
當前,信也科技金融業務仍然處於快速增長階段,日產生圖片量也在穩定增長,雖然通過公私雙活的方式解決了服務穩定性的問題,但同時也增加了高昂的服務成本。
未來我們的建設主要集中在2個方向:
- 提高私有云存儲Ceph的服務穩定性和數據可靠性,弱化雙活機制,逐步將流量切換至私有云存儲。
- 私有云存儲上構建豐富的多媒體處理功能,包括支持圖片、視頻、PDF文件等對象的多媒體處理。
作者介紹
Alfred Gao,信也科技佈道師,高級架構師,主要負責用户中心、安全中心、私有云存儲等業務的架構設計以及落地實施。