從 CephFS 到 JuiceFS:同程旅行億級文件存儲平臺構建之路

隨著公司業務的快速發展,同程旅行的非結構化的數據突破 10 億,在 2022 年,同程首先完成了對象存儲服務的建設。當時,分布式文件系統方面,同程使用的是 CephFS,隨著數據量的持續增長,CephFS 的高復雜性和運維難度逐漸成為瓶頸。考慮到可觀測性、穩定性和管理效率等維度,同程最終決定轉向 JuiceFS。

目前,同程已在 JuiceFS 上構建了一個企業級存儲平臺,平臺規模涵蓋了超過 20 個文件系統和 2000 多個客戶端掛載點,能夠高效管理億級文件和百 TiB 級別的數據量。值得一提的是,整個存儲平臺的日常運維工作僅需一人。該平臺主要應用于多個場景,包括 AI 應用、容器云環境以及應用級共享存儲需求。

01 文件系統選型:從 CephFS 到 JuiceFS

在使用 JuiceFS 之前,同程內部使用的是 Ceph 來提供對象存儲和分布式文件存儲服務。然而,Ceph 的技術棧復雜度較高,掌握難度大,對使用經驗和運維經驗都有較高要求。同時,在可運維性和生態建設方面也存在一定不足,對日常穩定性保障構成了較大挑戰。

相比之下,JuiceFS 具有諸多優勢。JuiceFS 設計上實現了元數據和數據分離,這與我們內部已有的成熟對象存儲系統和分布式數據庫系統高度契合。憑借已有的技術經驗,能夠自主進行問題排查和性能分析。此外,JuiceFS 的工具鏈和生態建設相對成熟,具備良好的 POSIX 兼容性和云原生支持。特別是其 CSI 功能,提供了多種掛載模式,使我們能夠靈活選擇。中文的用戶社區也使得我們在使用過程中的溝通更為順暢。

選擇 JuiceFS 的另一個原因是它能夠與我們現有的技術棧良好融合。簡要介紹一下我們現有的基礎系統:我們自建了一個基于開源 Seaweed 構建的 S3 集群,并搭建了 S3 代理,兼容 Seaweed、Ceph 以及騰訊 COS 等公有云S3服務。S3 集群具備主從機制,可以在代理層實現從主集群切換到從集群。此外,我們的 DCDB 是一個內部使用的分布式數據庫系統,語法兼容 MySQL,基于百度的 BaikalDB 構建。

02 JuiceFS 在同程旅行的平臺化建設

在平臺化建設過程中,系統的可觀測性、應用接入與部署以及數據安全性是至關重要的要素。為了確保平臺的高效運行,我們在多個維度上進行了精心設計和優化,以實現全面的監控和高效的服務管理。

在可觀測方面,我們構建了一系列監控大盤,以全面監控關鍵指標。同時,我們接入了公司內部的監控告警系統,為容量、接口耗時等重要指標配置了告警規則。為了更高效地接入內部監控系統,我們開發了一個掛載點自動發現程序。該程序從元數據引擎中獲取當前的客戶端列表,并實時將客戶端列表的更改信息推送給我們內部的監控采集系統。

在應用接入與部署方面,我們提供了一系列易用工具,以支持應用的快速接入和部署。這些工具不僅簡化了操作流程,還降低了運維難度。此外,我們高度重視數據安全性,對重要的文件系統都實現了全面備份,以確保數據的完整性和可用性。

在監控告警的具體內容方面,我們主要關注服務端的情況,特別是元數據與 S3 服務的平均時延、請求成功率以及異常情況等關鍵指標。這些指標對于評估系統性能和穩定性至關重要。

高可用 JuiceFS 服務集群:單中心閉環

它解決的一個典型場景是 Kubernets 單中心集群。 Kubernets 本身并非跨中心集群,而是每個中心都部署獨立集群,即單中心閉環架構。在這種架構下 Kubernets 的各類資源和服務依賴通常限制在同一數據中心內,以避免跨數據中心通信帶來的延遲、帶寬消耗和網絡復雜性。JuiceFS 在 Kubernets 中,主要解決的是持久化的需求,而不是數據共享的需求。

另外,一些對于性能要求較高的應用,流量也需要保持在同一數據中心內,以避免跨中心傳輸帶來的延遲和帶寬消耗。因此,在這些場景中,會采用單中心閉環的方案,將 JuiceFS 相關服務在每個 IDC 部署為獨立集群,以確保數據存儲和計算任務在同一中心內進行,最大化性能并降低延遲。

這種方式適用于內部 Kubernets 集群等場景,主要解決有狀態應用的持久化存儲問題。同時,通過將流量閉環在同一 IDC 內,避免了跨機房傳輸帶來的性能瓶頸,從而保證系統的穩定性和性能。

高可用 JuiceFS 服務集群:跨中心閉環

這種部署方式主要應對的是那些本身跨機房部署且存在共享數據需求的應用場景。這類應用不僅需要訪問同一個文件系統,而且對高可用性的要求也相對較高。若某個機房的服務出現故障,不可能要求所有應用都切換到其他中心,因此,我們采用了跨中心部署的后端服務集群方案。

在此方案中,對象存儲,如 S3 集群以及 DCDB 等關鍵組件均實現了跨中心部署。具體而言,S3 的 Master 節點會在每個 IDC 都部署一個,以確保服務的全局可達性。同時,數據副本也會存儲在多個中心,以提高數據的可靠性和容錯性。DCDB 同樣采用了跨中心部署策略,其服務在每個中心都有部署,數據副本則通過其內置的復制機制在多個中心間同步。

為了優化流量路徑并減少跨中心傳輸帶來的延遲和成本,我們在正常情況下將客戶端請求限制在本地機房,流量通過負載均衡轉發到本機房的 S3 服務節點。這不僅保證了性能,還減少了不必要的跨機房流量。由于跨中心集群內部的數據同步和復制需求,集群內部仍然會有跨中心流量。

在出現故障的情況下,例如某個中心的 S3 服務出現問題,我們可以將流量入口切換到其他中心。這一故障切換機制進一步保障了集群的高可用性。

03 落地 JuiceFS 收益

JuiceFS 的架構與我們內部已有的對象存儲系統和分布式數據庫系統高度兼容,使得集成過程非常順利,整個項目僅投入了 2 人力,從選型到原理研究,再到最終落地的實施,僅用了半年的時間完成了從 CephFS 到 JuiceFS 的切換。基于 JuiceFS,我們成功構建了一個企業級存儲平臺,顯著提升了存儲系統的可觀測性、穩定性與管理效率。

從 CephFS 切換到 JuiceFS 后的主要收益:

  • 擴展性和靈活性
    • 可以無縫擴展存儲容量,并輕松應對數據量的快速增長,無需停機或影響現有業務。
    • 更好地適配云計算和容器化環境,便于企業在多云或混合云環境中運行。
  • 簡化運維
    • 完善的可觀測性功能,方便集成到企業內部系統。
    • 運維簡單,能更好的支持穩定性保障工作。
  • 數據安全和可靠性
    • 更強的數據容錯能力,能夠自動進行故障恢復,確保數據的高可用性。
    • 提供強大的備份和災難恢復能力,保證數據長期安全可靠。

目前,JuiceFS 已在多個場景中提供了強大的存儲解決方案,滿足了不同應用的需求:

  • 容器云平臺:作為基礎架構,JuiceFS 有效支持了云中心的持久化存儲,尤其是通過容器存儲接口(CSI)實現了有狀態應用的數據持久化功能,解決了容器化環境中對持久存儲的核心需求。
  • 大數據與 AI 平臺:在大數據和 AI 應用中,JuiceFS 為海量數據存儲提供了高效的支持,特別是在模型訓練和數據處理過程中,顯著提升了存儲性能,解決了對大規模數據存儲的需求。
  • 應用共享文件場景:JuiceFS 使多個應用實例能夠便捷地共享文件資源,替代了傳統的數據傳輸方案(如 SFTP),優化了應用間的數據交換和資源共享。
  • 數據冷備:盡管對象存儲被廣泛采用,但一些用戶仍然偏好文件系統接口,JuiceFS 正是為這些場景提供了可靠的數據備份解決方案,確保了數據的長期可靠性與可訪問性。

04 JuiceFS 使用中的挑戰與優化實踐

讀寫性能優化

首要挑戰來自于一個關鍵業務場景——商品庫業務。在該場景中,寫服務負責數據的全量和增量更新,而讀服務需要在更新完成后(通常為 10 分鐘內)迅速加載數據。

在此過程中,我們觀察到了一系列性能上的挑戰。特別是在數據加載階段,會產生大量的目錄列表讀取和文件操作,峰值帶寬需求高達 20Gbps,同時元數據操作量也達到了 4 萬次的高峰。為了應對這些挑戰,我們對后端服務進行了針對性的優化,涵蓋了資源存儲和元數據管理兩大方面。

在 S3 存儲方面,我們進行了大量的鏈路對比測試。通過對比經過四層負載均衡(tvs)與直接連接 S3 的性能差異,我們發現了一些隱藏的鏈路節點存在較大的延時損耗。特別是在高帶寬場景下,四層負載均衡的性能瓶頸尤為明顯。為了解決這個問題,我們將負載均衡器升級到了采用高性能 DPDK 技術的版本,從而顯著提升了鏈路性能。

元數據方面,我們深入調研了部署方案和元數據引擎的性能邊界。盡管我們對 DCDB 進行了多項優化,如事務處理等,但由于其基于 Raft 協議,存在多次 RPC 請求的問題,即使經過極致優化,也只能達到毫秒級響應。對于跨中心集群部署而言,網絡消耗和成本也是不可忽視的問題。因此,我們最終確定了將流量閉環在單個中心的方案,并選擇了 Redis 作為元數據引擎,以確保元數據操作在 1 毫秒以內完成。

此外,通過將原始文件系統按照頂層目錄拆分為多個子文件系統,我們成功地將整體流量分散到各個JuiceFS服務中。在進行了上述優化后,我們已經能夠滿足業務的性能要求。

我們還深入業務邏輯,協助業務方優化了代碼流程,進一步降低了請求量,為系統創造了更多的性能提升空間。

低版本 FUSE 緩存同步 bug

這個bug的現象是當我們在一臺機器上刪除目錄后再創建同名目錄時,其他機器上看到的卻是之前刪除的目錄內容。經過深入分析,我們發現這是 Linux 內核 2.6 版本中的一個已知 bug。該 bug 導致在刪除目錄后,Linux 的目錄項緩存和 inode 緩存未能及時更新,從而在其他機器上產生了錯誤的目錄視圖。幸運的是,在 Linux 內核 3.10 版本及更高版本中,這個 bug 已經被修復。因此,我們建議大家在使用 JuiceFS 時,盡量使用 3.10 版本及以上的 Linux 內核,以避免類似的性能問題和 bug。

寫入阻塞問題的排查與解決方案

在進行寫入壓測過程中發現偶爾應用寫入會卡住,一段時間后應用寫入報錯 input/output error,查看掛載進程日志是訪問 S3 403 鑒權失敗

首先,由于問題偶發,我們可以排除密鑰錯誤的可能性。通過直連 S3 測試,我們確認問題與中間鏈路節點有關,特別是與 Nginx 的交互存在問題。

為了深入了解問題根源,我們在 S3 端增加了日志記錄,并發現 S3 在進行簽名時使用了“Expect: 100-continue”請求頭。這里需要解釋一下,HTTP 協議中,“Expect: 100-continue”是一種機制,用于在上傳大文件時,先發送 HTTP 請求頭給服務器,服務器若接受,則返回 100 狀態碼,客戶端再發送HTTP請求體。然而,在我們的案例中,打印日志發現 403 的請求不帶有 Expect 頭,但 S3 簽名串用到了 “Expect:100-continue” 這引發了我們的進一步調查。

通過排查 JuiceFS 代碼及 S3 SDK 發現是 S3 SDK 處理重試時,如果上傳請求體大于 2M 時,會默認加上 “Expect:100-Continue”。然而,Nginx 在處理此類請求時,雖然遵循 HTTP 規范返回了 100 狀態碼,但在后續向 S3 轉發請求時,卻未保留該頭部,S3 在收到請求后校驗簽名,由于沒有收到 Expect 請求頭,會使用默認的 “Expect:100-continue”,最終由于 Expect 請求頭的值大小寫不一致,導致簽名校驗失敗,導致 juicefs mount 進程會重試阻塞。

針對此問題,我們提出了兩種修復方案:

  • 一是將 SDK 中的“Expect: 100-Continue”頭部修改為規范的小寫形式;
  • 二是為 Nginx 添加一個不啟用“Expect: 100-continue”的選項,這個選項是很必要的,可以減少一次網絡交互。

這兩種方案均能有效解決問題,我們向 S3 SDK 社區 JuiceFS 社區提交了 pr。

其他 Tips

文件權限

經常會出現在一批機器中,存在用戶名相同但 uid 不相同的情況。針對這種情況,建議如果要做隔離,就在掛載時做好隔離,比如使用掛載子目錄的方式來做隔離。同時,文件寫入方負責文件權限的正確分配,確保其他文件使用方能有正確的權限。

元數據備份

當元數據數量龐大時,可能會遇到備份失敗的情況。如果你的元數據引擎已經具備副本機制或者你已經實施了定時備份策略,那么可以考慮關閉元數據備份功能,以節省資源。

k8s-CSI

在使用 k8s-CSI 時,開可以選擇禁用 format 選項。具體操作是,給 k8s-CSI只提供name和metaUrl兩個參數即可。這樣一來,在 k8s-CSI 運行過程中,就不會實際執行 format過程。這一做法能夠帶來兩大好處:

首先,它能夠保護我們的安全信息,如 S3 密鑰等敏感數據不被泄露。由于format 過程中可能涉及文件系統的關鍵信息,禁用該功能能夠減少信息暴露的風險。

其次,它允許存儲提供方來管理文件系統的配置。在將JuiceFS交付給容器云平臺之前,我們已經完成了文件系統的配置工作。這樣一來,容器云平臺就可以直接使用已經配置好的文件系統,無需再進行額外的配置或調整。

05 未來展望

分布式元數據引擎

我們注意到當前在某些場景中,對元數據性能的要求較高。針對這些場景,我們可能會考慮使用 Redis。然而,目前的 Redis 存在容量瓶頸問題,因為它為了保證事務的一致性,只使用了集群中的一個節點進行數據存儲,無論集群中部署了多少個節點,實際上只有一個節點在運行,這導致了容量不能水平擴展。

此外,Redis 在運維方面也存在不便之處。因此,我們部門內部正在開發一個分布式的 KV 存儲系統。在系統的調研階段,我們已經與相關部門進行了多輪的溝通。

分布式緩存

通過引入分布式緩存,我們可以更有效地處理大數據場景下的數據存儲和訪問需求,進一步提升系統的整體性能和穩定性。

希望這篇內容能夠對你有一些幫助,如果有其他疑問歡迎加入?JuiceFS 社區與大家共同交流。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/63354.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/63354.shtml
英文地址,請注明出處:http://en.pswp.cn/web/63354.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

固定資產分類,提升資產盤活效益

固定資產是企業長期使用的重要資源,涵蓋范圍廣、種類多,不同的資產需要針對性管理。通過科學的分類與高效的盤活策略,不僅可以優化資源配置,還能提升企業資產的利用效率和經濟效益。以下將詳細解析固定資產的分類方式和盤活效益的…

富途證券C++面試題及參考答案

C++ 中堆和棧的區別 在 C++ 中,堆和棧是兩種不同的內存區域,它們有許多區別。 從內存分配方式來看,棧是由編譯器自動分配和釋放的內存區域。當一個函數被調用時,函數內的局部變量、函數參數等會被壓入棧中,這些變量的內存空間在函數執行結束后會自動被釋放。例如,在下面的…

【字符串匹配算法——BF算法】

🌈個人主頁: Aileen_0v0 🔥熱門專欄: 華為鴻蒙系統學習|計算機網絡|數據結構與算法 ?💫個人格言:“沒有羅馬,那就自己創造羅馬~” 文章目錄 BF算法介紹及過程演示代碼實現過程下節預告KMP算法利用next數組存儲子串中j回退的位置(…

Linux 文件系統目錄結構及其簡要介紹

Hello! 親愛的小伙伴們,大家好呀(Smile~)!我是 H u a z z i Huazzi Huazzi,歡迎觀看本篇博客,接下來讓我們一起來學習一下Linux 文件系統目錄結構吧!祝你有所收獲! 本篇博客的目錄&a…

小米準備入局Nas?Nas究竟是啥?能干啥?

一開頭就來了個三連問:小米準備入局Nas?Nas究竟是啥?Nas能干啥? 好像這段時間Nas這個詞頻頻出現,但很多小伙伴都不知道這個是什么設備。首先咱們來解決一下名詞Nas是什么意思。 什么是Nas? 為了盡可能解釋…

基于Socket實現客戶端和服務端的Tcp通信(C#)

0.前言 使用C#和Unity實現復刻Liar’s bar中的功能 軟件開發大作業 本系列文章用于記錄與分享開發過程中使用到的知識點,以及常見錯誤 本文主要描述有關網絡編程的內容 目錄 0.前言1.使用Socket搭建Server1.1Server端的Socket連接1.2 Server端接收Client的信息1.3…

【mysql】如何查看大表記錄行數

目錄 1. 使用 ANALYZE TABLE 和 SHOW TABLE STATUS2. 查詢 INFORMATION_SCHEMA 表3. 使用索引統計信息4. 維護行數緩存5. 使用分區計數 1. 使用 ANALYZE TABLE 和 SHOW TABLE STATUS 1.ANALYZE TABLE 可以更新表的統計信息,然后使用 SHOW TABLE STATUS 來查看估算的…

文件斷點續傳(視頻播放,大文件下載)

客戶端每次請求取大文件部分數據。 瀏覽器播放mp4視頻時,會首先傳Range消息頭,檢測到206狀態碼,和Content-Range,Accept-Ranges 會自動請求余下數據。后端需要在文件任意偏移量取數據。 參考: springboot項目實現斷…

游戲AI實現-尋路算法(A*)

A*(A-star)是一種圖遍歷和尋路算法,由于其完整性、最優性和最佳效率,它被用于計算機科學的許多領域。給定一個加權圖、一個源節點和一個目標節點,該算法將找到從源到目標的最短路徑(相對于給定的權重&#…

any/all 子查詢優化規則的原理與解析 | OceanBase查詢優化

背景 在通常情況下,當遇到包含any/all子查詢的語句時,往往需要遵循嵌套執行的方式,因此其查詢效率較低。Oceanbase中制定了相應的any/all子查詢優化規則,能夠能夠識別并優化符合條件的any/all子查詢,從而有效提升查詢…

[HNOI2002] 營業額統計 STL - set集合

文章目錄 [HNOI2002] 營業額統計題目描述樣例輸入 #1樣例輸出 #1 提示題解相關知識點set [HNOI2002] 營業額統計 STL - set解題 題目描述 Tiger 最近被公司升任為營業部經理,他上任后接受公司交給的第一項任務便是統計并分析公司成立以來的營業情況。 Tiger 拿出…

汽車供應鏈 “劇變”開始,“智能感知潛在龍頭”誕生

智能汽車產業鏈“劇變”已經開啟,智能感知軟硬件能力的權重正在不斷被放大。 比如滿足高階泊車的第二代AK2超聲波傳感器、滿足人機共駕場景需求的電子外后視鏡(CMS)、iTOF 3D成像視覺感知(用于艙內監控)等新產品&…

Latex中表格添加底部文本注釋并調整對齊

如何實現從第一個表到第三個表的轉換, 其中主要涉及到兩點: (1)底部腳注與表格自動對齊并縮進換行 (2)表格自適應頁面寬度 底部腳注的對齊與換行縮進需要用到 \usepackage{threeparttable} \usepackage{…

SQL 查詢方式比較:子查詢與自連接

在 SQL 中,子查詢和自連接是兩種常見的查詢方式,它們的功能雖然可以相同,但實現的方式不同。本文通過具體示例,深入探討這兩種查詢方式,并配合數據展示,幫助大家理解它們的使用場景和差異。 數據示例 假設…

html基礎-認識html

1.什么是html html是瀏覽器可以識別的的標記語言&#xff0c;我們在瀏覽器瀏覽的網頁就是一個個的html文檔 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>認識html</title> </head> <body><h1…

linux 無網絡安裝mysql

下載地址 通過網盤分享的文件&#xff1a;mysql-5.7.33-linux-glibc2.12-x86_64.tar.gz 鏈接: https://pan.baidu.com/s/1qm48pNfGYMqBGfoqT3hxPw?pwd0012 提取碼: 0012 安裝 解壓 tar -zxvf mysql-5.7.33-linux-glibc2.12-x86_64.tar.gz mv /usr/mysql-5.7.33-linux-glibc2.1…

利用高德API獲取整個城市的公交路線并可視化(七)

本篇文章是對我們從高德拿到的公交/地鐵的json文件的精細化處理的一個深入解析&#xff0c;通過對這些原始數據進行詳細的清洗、轉換和分析&#xff0c;我們通過對數據的質量和可用性的提升&#xff0c;來為后續的數據精細化處理和研究做基礎數據的支撐&#xff0c;從而為后續的…

OGV格式如何轉換成MP4格式?五款視頻格式轉換工具

在數字時代&#xff0c;視頻已成為我們日常生活、工作和學習中不可或缺的一部分。而不同的設備和平臺往往支持不同的視頻格式&#xff0c;這就需要對視頻進行格式轉換。 OGV&#xff08;Ogg Video File&#xff09;是一種使用OGG開源格式的容器&#xff0c;用于存儲帶或不帶音頻…

番外篇 | Hyper-YOLO:超圖計算與YOLO架構相結合成為目標檢測新的SOTA !

前言:Hello大家好,我是小哥談。Hyper-YOLO,該方法融合了超圖計算以捕捉視覺特征之間復雜的高階關聯。傳統的YOLO模型雖然功能強大,但其頸部設計存在局限性,限制了跨層特征的融合以及高階特征關系的利用。Hyper-YOLO在骨干和頸部的聯合增強下,成為一個突破性的架構。在COC…

C語言小練習-打印字母倒三角

編寫一個程序&#xff0c;在用戶輸入某個大寫字母后&#xff0c;產生一個金字塔圖案。 #include <stdio.h>int main(int argc,char *argv[]) {char ch; loop:printf("請輸入大寫字母&#xff01;\n");scanf("%c",&ch);getchar();if(ch < A ||…