🛡️Cloudflare Blog•較早收集於 80m
解決 PB 級 ClickHouse 叢集中的隱藏鎖定競爭問題

💡學習如何除錯 AI 訓練管線所使用的大規模資料基礎設施中,隱蔽的效能瓶頸。
⚡ 30-Second TL;DR
有什麼變化
在分區操作期間發現 ClickHouse 查詢規劃器中存在嚴重的鎖定競爭。
為什麼重要
這凸顯了大型資料基礎設施中深度可觀測性的重要性。它提醒開發者,標準指標可能會遺漏複雜分散式系統中的關鍵效能瓶頸。
下一步行動
若您運行大規模 ClickHouse 叢集,請審查查詢規劃器日誌與分區變更頻率,以主動識別潛在的鎖定競爭問題。
誰應關注:Developers & AI Engineers
關鍵要點
- •在分區操作期間發現 ClickHouse 查詢規劃器中存在嚴重的鎖定競爭。
- •標準監控指標無法顯示該瓶頸,需要深入的除錯分析。
- •向 ClickHouse 提交上游修補程式以改善併發性與效能。
- •在解決關鍵計費作業停滯的同時,維持了 PB 級資料的完整性。
🧠 深度解析
AI-generated analysis for this event.
🔑 增強重點摘要
- •該隱藏瓶頸特別難以察覺,因為傳統的CPU、記憶體和I/O利用率等監控指標均顯示正常,需要使用更進階的「Real」追蹤(採樣所有執行緒,包括阻塞的執行緒)才能識別出鎖競爭 [11]。
- •觸發此問題的特定分區變更,是將一個欄位新增到PB級資料表的分區鍵中,這是一個複雜的DDL操作,旨在實現按租戶資料保留 [11]。
- •ClickHouse的MergeTree引擎雖然設計為透過不可變資料部分實現高併發,但在執行ALTER TABLE等DDL操作時仍會獲取排他性表級別鎖,這可能因分區鍵變更而加劇鎖競爭 [7, 9, 14]。
- •其他主要ClickHouse使用者,如Tinybird,在2025年也曾遇到並解決了類似的、長達一年的隱藏鎖競爭問題,特別是與管理全域和查詢特定物件的Context及ContextSharedPart實例中的全域互斥鎖相關,這表明ClickHouse核心架構中存在一類重複出現的併發挑戰 [23, 26]。
📊 競品分析▸ Show
| 特徵/產品 | ClickHouse | Google BigQuery | Snowflake | Amazon Redshift | Apache Druid | StarRocks |
|---|---|---|---|---|---|---|
| 類型 | 開源OLAP資料庫 | 雲端資料倉儲 | 雲端資料倉儲 | 雲端資料倉儲 | 開源OLAP資料庫 | 分佈式OLAP資料庫 |
| 部署 | 自託管/雲端 | 雲端 (Google Cloud) | 多雲 | 雲端 (AWS) | 自託管/雲端 | 自託管/雲端 |
| 即時分析 | 極佳,亞秒級延遲 [1, 2] | 較高延遲,批次導向 [1, 2] | 不為即時分析設計 [1] | 傳統資料倉儲工作負載競爭力強,但即時分析通常較慢 [2] | 優化用於時間序列資料和即時攝取 [2] | 針對現代分析需求,高併發性能 [6] |
| 擴展性 | PB級資料,但叢集擴展需手動重新平衡 [6, 11] | 真正無伺服器,無需容量規劃 [1] | 計算與儲存分離,易於擴展 [1] | 深度AWS整合,伺服器less選項 [2] | 優化用於時間序列資料和即時攝取 [2] | 解決ClickHouse擴展挑戰,內建成本優化器 [6] |
| 併發性 | 單伺服器查詢性能好,但複雜、高併發查詢可能性能下降 [6] | 查詢量不可預測/零星時表現良好 [1] | 易於使用,最少調優 [1] | 成熟產品,功能廣泛 [1] | 針對極端規模和嚴格延遲 [1] | 卓越的多表連接性能,高併發場景下性能優異 [6] |
| 資料變更 | 對資料更新支援有限,頻繁更新可能導致性能波動 [6] | N/A | N/A | N/A | N/A | 支援增量更新的實體化視圖 [6] |
| 多表連接 | 難以處理多表連接,通常需要上游去正規化 [6] | 卓越的即席查詢 [1] | N/A | N/A | N/A | 類領先的多表連接性能,無需去正規化 [6] |
| 操作複雜性 | 可管理的操作複雜性,但自託管需要專業知識 [1, 2] | 零運營開銷 [1] | 最小化調優,易於使用 [1] | 成熟產品,廣泛的工具生態系統 [2] | 比ClickHouse操作更複雜 [1] | 簡化資料攝取管道 [6] |
| 成本模型 | 通常比雲端資料倉儲在規模上更具成本效益 [1] | 按查詢計費,規模大時可能昂貴 [1] | 規模大時昂貴 [1] | N/A | N/A | N/A |
🛠️ 技術深入
- ClickHouse的MergeTree家族引擎將資料組織成不可變的資料部分(parts)。每次INSERT操作都會建立一個新的資料部分,這些部分會由背景程序合併為更大的部分 [9, 14, 19, 22]。
- 資料部分在磁碟上按主鍵排序,並可根據分區表達式進行分區。查詢時,分區剪枝(partition pruning)機制可跳過不相關的資料,從而加速查詢 [14, 19, 22]。
- ClickHouse採用多種鎖定機制,包括表級別的讀寫鎖(Table RW locks,用於DDL操作與查詢之間的結構鎖定)、資料部分鎖(Part locks,在合併和讀取資料部分期間使用)、ZooKeeper分佈式鎖(用於複製表協調)以及互斥鎖(Mutex locks,用於進程內共享狀態的序列化) [8]。
- DDL操作(如ALTER TABLE、DROP TABLE、RENAME TABLE)會獲取排他性表級別鎖,這會阻塞併發的讀寫操作 [7, 8]。變更分區鍵的ALTER TABLE操作尤其可能導致鎖競爭,因為它涉及對表結構的重大修改 [7, 11]。
- 查詢規劃器在執行查詢時會與
Context和ContextSharedPart物件互動。ContextSharedPart儲存全域共享物件(如執行緒池、伺服器路徑、叢集資訊),而Context儲存查詢或會話特定的物件(如查詢設定、快取)。在某些情況下,這些物件的同步曾依賴單一全域互斥鎖,導致高併發場景下的瓶頸 [23, 26]。 - Cloudflare的除錯過程顯示,標準的CPU追蹤(僅採樣活動執行緒)無法揭示問題,需要切換到「Real」追蹤(採樣所有執行緒,包括阻塞的執行緒)才能發現隱藏的鎖競爭 [11]。
- 解決方案涉及開發上游修補程式以改善併發性。Tinybird的類似解決方案是將單一全域互斥鎖替換為
ContextSharedPart的全域讀寫互斥鎖和每個Context的局部讀寫互斥鎖 [23]。 - 用戶可透過
system.processes和system.query_log等系統表來監控鎖等待事件,並檢查ProfileEvents['RWLockReadersWaitMilliseconds']和ProfileEvents['RWLockWritersWaitMilliseconds']等指標來診斷鎖競爭 [7, 8]。
🔮 前景展望AI analysis grounded in cited sources
ClickHouse將進一步增強其內部併發控制機制。
Cloudflare和其他主要用戶(如Tinybird)發現並解決了隱藏的鎖競爭問題,這將促使ClickHouse核心開發者優先改進其查詢規劃器和DDL操作的併發處理能力。
大型ClickHouse部署的穩定性和性能將得到顯著提升。
解決PB級叢集中的關鍵鎖定競爭問題,特別是在分區變更等DDL操作期間,將減少延遲並提高高併發分析工作負載的可靠性。
ClickHouse生態系統中的監控和除錯工具將變得更加精細。
由於標準指標未能檢測到此類隱藏瓶頸,未來將需要更深入的追蹤和分析工具,例如「Real」追蹤,以幫助用戶識別和解決類似的複雜性能問題。
⏳ 時間線
2009
ClickHouse開發開始 [12]
2012
在Yandex.Metrica投入生產 [12]
2016
開源發布 (Apache 2.0) [12]
2022-01
Cloudflare建立「Ready-Analytics」系統,大量使用ClickHouse [11]
2025-04-24
Tinybird發布部落格文章,詳述解決ClickHouse中與Context相關的長達一年的鎖競爭問題 [23]
2025-11-18
Cloudflare發生一次重大服務中斷,部分原因是一個ClickHouse查詢返回重複的元資料,導致Rust代理服務崩潰 [25, 29]
2026-05-14
Cloudflare發布部落格文章,描述解決PB級ClickHouse叢集中查詢規劃器隱藏鎖競爭問題的經驗 [4, 11]
📰
AI 週報
閱讀本週精選 AI 大事摘要 →
👉相關動態
AI 策展新聞聚合。所有內容版權歸原始發布者所有。
原始來源: Cloudflare Blog ↗
