美國汽車服務應用程式開發商Jerry公司使用人工智慧(AI)和機器學習(ML)來簡化汽車保險和汽車貸款的比較和購買過程。隨著數據的增長,該公司在使用AWS Redshift時遇到了一些問題,例如速度緩慢且價格昂貴。在該公司改用ClickHouse之後加快了查詢性能,並大幅地降低了成本,但這也帶來了磁碟故障和數據恢復等存儲方面的挑戰。
為了避免大量的維護工作,Jerry公司採用了高性能的分布式文件系統JuiceFS,創新地使用其快照功能來實現ClickHouse的主-副本架構。該架構保證了數據的高可用性和穩定性,同時顯著提高了系統性能和數據恢復能力。一年多來,JuiceFS一直在持續運行,並且沒有發生停機和複製錯誤,提供了預期的性能。
本文將深入探討Jerry公司採用的應用程式面臨的挑戰、採用的解決方案以及未來實施的計劃。希望這篇文章能為初創公司和大公司的開發團隊提供有價值的見解。
最初,Jerry公司選擇Redshift進行分析查詢。然而,隨著數據量的增長,遇到了嚴重的性能和成本挑戰。例如,當生成漏斗和A/B測試報告時,面臨著長達數十分鐘的加載時間。即使在規模合理的Redshift集群上,這些操作也太慢了,這使得該公司的數據服務不可用。
因此,Jerry公司急需尋求一個更快、更經濟的解決方案,因此選擇了ClickHouse,儘管它在實時更新和刪除方面存在局限性。而切換到ClickHouse帶來了顯著的好處:
Jerry公司的設計以ClickHouse為中心,使用Snowflake作為ClickHouse無法處理的1%數據處理的備份。這個設置實現了ClickHouse和Snowflake之間的無縫數據交換。
圖1 Jerry公司的數據架構
Jerry公司最初保持獨立部署有以下幾個原因:
因此,考慮到內存、CPU和存儲帶寬,獨立的ClickHouse是一個可接受的解決方案,在可預見的未來將是有效的。
然而,ClickHouse方法也存在一些固有問題:
在部署ClickHouse之後,Jerry公司遇到了以下問題:
Jerry公司採用JuiceFS來解決其痛點,原因如下:
Jerry公司提出了將ClickHouse遷移到基於JuiceFS的共享存儲環境的想法。《探索ClickHouse的存儲和計算分離》一文提供了一些見解。
為了驗證這種方法,Jerry公司進行了一系列測試。結果表明,在啟用緩存之後,JuiceFS的讀取性能接近本地磁碟的讀取性能,這與本文中的測試結果類似。
雖然寫入性能下降到磁碟寫入速度的10%到50%,但這是可以接受的。
Jerry公司對JuiceFS安裝所做的調整如下:
提高緩存命中率是Jerry公司的優化目標。使用JuiceFS雲服務將緩存命中率提高到95%。如果需要進一步改進,會考慮添加更多的磁碟。
ClickHouse和JuiceFS的結合大幅減少了Jerry公司的運營工作量,並且不再需要頻繁地擴展磁碟空間。與其相反,Jerry公司專注於監控緩存命中率。這顯著地緩解了磁碟擴展的緊迫性。此外,在發生硬體故障時不需要進行數據遷移。這顯著地降低了可能的風險和損失。
Jerry公司從JuiceFS快照功能提供的簡單數據備份和恢複選項中受益匪淺。藉助快照,可以查看數據的原始狀態,並在將來的任何時候恢復資料庫服務。這種方法通過在文件系統級別實現解決方案來解決以前在應用程式級別處理的問題。此外,快照功能非常快速和經濟,因為只存儲數據的一個副本。JuiceFS社區版的用戶可以使用克隆功能來實現類似的功能。
此外,在不需要數據遷移的情況下,停機時間顯著減少。Jerry公司可以快速響應故障或允許自動系統將目錄掛載到另一台伺服器上,從而確保服務的連續性。值得一提的是,ClickHouse的啟動時間只有幾分鐘,這進一步提高了系統恢復速度。
此外,讀性能在遷移後保持穩定,Jerry公司的員工都沒有發現任何差異。這證明了該解決方案的性能穩定性。
最後,Jerry公司的成本大幅下降。
在遷移到ClickHouse之後遇到了幾個問題,促使Jerry公司考慮構建主-副本架構:
JuiceFS支持在不同位置的多個掛載點。Jerry公司嘗試在其他地方掛載JuiceFS文件系統,並在同一位置運行ClickHouse。然而,在實施過程中遇到了一些問題:
因此,Jerry公司使用JuiceFS快照來設置主-副本架構。這種方法的工作原理類似於常規的主備份系統。主實例處理所有數據更新,包括同步和提取、轉換和加載(ETL)操作。副本實例主要關注查詢功能。
圖2 ClickHouse主-副本架構
(1)創建快照
使用JuiceFS快照命令從主實例上的ClickHouse數據目錄創建快照目錄,並在該目錄上部署ClickHouse服務。
(2)暫停Kafka消費者隊列
在啟動ClickHouse實例之前,必須停止使用來自其他數據源的有狀態內容。這意味著暫停Kafka消息隊列,以避免與主實例競爭Kafka數據。
(3)在快照目錄下執行ClickHouse命令
在啟動ClickHouse服務之後,注入了一些元數據,向用戶提供有關ClickHouse創建時間的信息。
(4)刪除ClickHouse數據突變
在副本實例上,刪除了所有數據突變,以提高系統性能。
(5)執行連續複製
快照只保存創建時的狀態。為了確保它讀取最新的數據,Jerry公司定期用副本替換原始實例。這種方法使用簡單且高效,因為每個副本實例都以兩個副本和指向其中一個副本的指針開始。即使需要10分鐘或更長時間,通常也會每小時運行一次以滿足Jerry公司的需求。
Jerry公司的ClickHouse主-副本架構已經穩定運行了一年多,完成2萬多次無故障複製操作,證明了其高可靠性。工作負載隔離和數據副本的穩定性是提高性能的關鍵。在沒有任何應用層優化的情況下,Jerry公司成功地將總體報告可用性從不到95%提高到99%。此外,該架構支持彈性擴展,極大地增強了靈活性。這使Jerry公司能夠根據需要開發和部署新的ClickHouse服務,而無需複雜的操作。