隨著京東業務的發展,數據規模越來越大。開源平臺如Hadoop可以滿足離線大數據的存儲與處理。然而,對內基礎平臺與對外云服務需要更加多樣的存儲抽象和不同的存儲產品。當前面臨的需求場景可以概括為幾類:
1.公司內部的在線小文件存儲。例如商品圖片、交易訂單、庫房訂單等數據。這些文件大小通常為幾KB或幾十KB,每天新增幾千萬條。這些數據對公司非常重要,語義上要求非常強的可靠性與一致性。
2.面向公有云的對象存儲服務。我們面向京東的合作伙伴、第三方開發者等客戶提供類似Amazon S3與Google Cloud Storage的對象存儲服務。
3.針對虛擬機的持久塊設備存儲服務。無論私有云還是公有云的虛擬機實例,均需持久磁盤的存儲抽象。同行的相關工作包括AWS的Elastic Block Store與Google Cloud的Persistent Disks.
面對多樣的存儲需求,京東云平臺的愿景是:“One team, one storage infrastructure.”于是京東組建了一支團隊,正致力于自主研發統一的數據中心存儲基礎架構,提供多種存儲抽象,有效滿足上述三類實際業務需求。
分別對應第一節所述三類業務需求,京東云存儲平臺向上實現了三類使用抽象:Private Client Libraries, Public RESTful API, Block Storage Abstraction. 后兩類的功能定義與業界相關產品非常類似,因此本文僅介紹第一種。
針對公司線上服務,京東提供了私有云客戶端開發庫,其抽象方式為Container/Key/File。其中Container為命名空間的單位,通常對應用于一個使用實例或者業務單元,整個集群支持上億個Container。在一個Container內部,由Key映射至File,Key數目沒有上限,File大小也沒有限制 – 可以從幾個Byte到1TB。另外,Key可以由用戶給定或者由存儲系統自己生成;File除了支持創建、刪除、讀取、替換等操作外,還支持Append即追加操作,這對大文件上傳是非常方便的。
京東云存儲平臺采用的技術策略是:統一的系統架構,不同的復制協議與存儲引擎。
具體而言,對于系統元數據管理、小文件存儲、大文件存儲、定長塊設備文件存儲,京東有針對性地利用訪問模式并實現不同的底層存儲引擎與復制協議,以做到系統性能、可靠性、一致性、易維護性等多方面因素之間的最優權衡。
以公司內部在線小文件存儲為例。無論商品圖片、交易訂單、庫房訂單,這些電商數據需要非常強的可靠性,可用性,與一致性。常見開源分布式系統所采用的最終一致性(Eventual Consistency)是無法被公司內部服務所接受的。因此京東在CAP定理中選擇C+A,即通過非常強的復制協議來實現存儲一致性與可用性,犧牲了對網絡劃分(Network Partition)的容忍。一方面,Network Partition在單個數據中心里面并不常發生;即使發生,前臺的在線服務已經受到影響,可以接受此時存儲系統出現“寫操作不可用”。
京東采用了小團隊作戰,各個子系統并行開發并快速迭代的工程方式。整個系統主要采用Go與C編程語言來開發,其中C負責底層存儲引擎開發,Go負責整體的系統框架實現。
大規模存儲系統的思考:拿來主義還是自主研發?很多公司,尤其是到了一定規模之后的互聯網公司都會面臨一個問題:是使用開源軟件還是自主研發分布式存儲?我們建議視情況而定。如果數據規模很大且重要性極高,需求強烈且明確,那么自主研發的成本是完全可以接受的。另外一方面,要盡可能讓一個團隊開發統一存儲平臺來滿足多樣性需求,而非多個團隊并行研發多個產品,這從技術團隊打造與系統長期優化的角度都是性價比最高的選擇。