用Rust編寫的資料庫GreptimeDB現開源
GreptimeDB用於時間序列資料的多租戶、分散式和雲原生實時處理系統,是一個優秀的資料處理系統,可讓您實時從時間序列中獲取價值。與TimescaleDb 類似,Timescale 也將 Rust 用於他們的工具包擴充套件。
為什麼選擇 Greptime
幾年前,我在一家大型金融科技公司工作,被要求構建一個超大規模(支援千萬級監控指標,數十萬個容器,以及由數千個容器組成的微服務的監控解決方案。在研究了 InfluxDB、Prometheus 等流行的解決方案之後,我發現目前還沒有滿足我們需求的開源解決方案(這些需求現在已經遍佈各地):
- 以合理的成本處理海量、高基數的時間序列資料點
- 每秒實時處理至少 100K 個查詢和 500M 個資料點
- 滿足資料分析的各種高要求
為了解決這些問題,我和我的團隊在過去幾年裡構建了一個專門針對時間序列的超大規模資料處理系統。每秒不間斷寫入數億資料點,多維度實時分析數百萬指標(告警、根因分析等),低成本儲存數千萬遺留指標. 同時,我們提供強大的SQL/Python分析能力,幫助資料科學團隊輕鬆構建AIOps/FinOps等智慧應用。我們處理的所有資料都是時間序列資料。
隨著物聯網感測器生成大量資料,我突然想到時間序列資料如何幫助我們建設一個更美好的社會,而它的價值卻被低估了。事實上,您現在正受益於時間序列資料。以越來越多的互聯汽車為例。根據我們收集的資料,科學團隊可以在我們的車輛中構建技術。我們可以識別最能預測未來五秒內將發生車禍的跡象,並挽救乘客的生命,因為它可以識別他/她此刻何時失去注意力。我們的工作是確保使用者能夠更可靠、更高效地使用裝置和資料。我們幫助人們和技術更容易、更快地做出關鍵決策,因此我們強調實時性。
我們經歷了十多年的實戰考驗,支援成功的應用。我們有信心將我們獲得的工程能力、我們贏得的業務優勢以及我們獲得的資源交付給我們的客戶。我們希望透過開源和雲服務來實現這一願景。於是 Greptime 誕生了。
我們使用*nix系統中常用的搜尋命令“grep”這個動詞,希望賦能客戶更深入地挖掘時間序列資料,發現隱藏的價值——“投資資料,時間收穫”。
隨著像 Snowflake 這樣的雲原生資料倉儲的興起,分離儲存和計算被證明可以節省成本並提高效能和彈性。在將資料基礎設施轉移到雲端時,我們認為圍繞效能、可維護性和成本重新設計服務至關重要。
Greptime
提供多租戶、開箱即用、完全託管的服務,每個使用者都執行一個安全高效的資料生命週期:攝取、儲存、分析、資料管理、視覺化、異常檢測、預測等。
GreptimeDB Cloud 服務主要由三個元件組成:
- Frontend:無狀態,負責閘道器協議和分散式寫入和查詢;
- Datanode:工作節點,無狀態,內建時序儲存引擎和計算引擎;
- 分散式WAL:多租戶共享的Write-Ahead-Log服務,用於支援Datanode的容錯和容災。
資料最終儲存在 S3 等具有成本效益的儲存中。為了解決儲存和計算分離帶來的寫吞吐量和查詢延遲問題,我們還設計了一個分散式的buffer/cache系統,類似於OS中的Page cache。
我們提供這種混合架構以利用無共享(前端、資料節點)和共享磁碟(wal、快取)架構的優勢:
- 將“冷”資料儲存在 S3 中,將“熱”資料儲存在本地磁碟中。
- 使用者可以根據需要水平擴充套件計算節點。
- 使用者請求將被動態排程。如果發生錯誤,計算節點將自動移動到另一個。當資料庫沒有流量時,計算資源將被回收,使用者只需為他們使用的東西付費。
- 共享分散式WAL只需要少量的EBS就可以提供寫容災。資料刷入S3後,可以截斷日誌。
解耦儲存和計算
我們的架構將儲存和計算分離。核心元件Datanode具有三個功能:
- 儲存引擎:基於LSM樹的時間序列資料表引擎,稱為Mito引擎。
- 查詢引擎:支援SQL;它將 SQL 轉換為邏輯/物理計劃。透過向量化計算和使用者定義的函式,GreptimeDB 可以專門處理大量資料以進行許多複雜的計算。
- Python 協處理器:為避免花費大量時間和精力傳輸和轉換資料,我們提供了在資料庫中執行 Python 指令碼的能力。此外,使用者可以從強大的 Python 社群中受益。
內建Rust
自 2018 年以來,我們一直在使用 Rust 編寫我們的時間序列資料庫。當涉及到資料庫等基礎設施時,高水平的穩定性和效能是重中之重。最好避免使用任何執行時/GC 語言,因為它們會導致不可避免的記憶體和 CPU 開銷。Rust 的建立是為了確保類似於 C/C++ 的高效能,Rust 也強調記憶體安全。越來越多的公司,從初創公司到大公司,都在生產中使用 Rust。
作為一個白手起家的TSDB,已經穩定高效執行了四年,Rust是其中的關鍵一員。在多年的開發過程中,我們幾乎沒有遇到過記憶體安全相關的嚴重BUG,而且由於測試充分,其他嚴重BUG也比較少。
此外,充滿活力的 Rust 社群推動了 Rust 包的增長,這使得開發人員更容易構建東西。而且我們都喜歡 Rust,所以選擇 Rust 作為我們建立 Greptime 的主要語言是很自然的。
相關文章
- gluesql/gluesql:一個用Rust編寫的SQL資料庫引擎庫包SQLRust資料庫
- ChiselStore:Rust編寫的Raft分散式SQLite資料庫RustRaft分散式SQLite資料庫
- 用Rust 實現的現代化實時開源資料倉儲Rust
- 開源資料庫的現狀資料庫
- spacejam/sled:使用Rust語言編寫的嵌入式資料庫Rust資料庫
- Revolt:用Rust 編寫的替代Discord之類聊天室的開源專案Rust
- rust常用開源庫Rust
- Aero:用rust編寫的新現代作業系統Rust作業系統
- 試用開源資料庫ApacheDerby資料庫Apache
- Rust是如何用Rust編寫的? - RedditRust
- locutus:用Rust編寫的去中心化平臺Rust中心化
- Rocketgraph:用Golang編寫的Firebase的開源替代品Golang
- 編寫資料庫設計文件資料庫
- 用Rust編寫的快如閃電的程式碼編輯器:lapceRust
- 用開源 apidoc rap編寫php介面文件APIPHP
- Ory Kratos: 用 Go 編寫的開源身份伺服器Go伺服器
- Youki:用 Rust 編寫的更快Docker容器執行時RustDocker
- 使用 Rust 語言編寫 Java JNI 實現RustJava
- 使用純Java編寫正規表示式的開源庫包Java
- isql指令碼編寫建立資料庫SQL指令碼資料庫
- Rust語言開發資源Rust
- 寫給小白的開源編譯器編譯
- Swift編寫的EOS開源框架SwiftyEOSSwift框架
- ekzhang/rustpad:使用Rust編寫的高效程式碼編輯器Rust
- 開源的誘惑——資料庫篇資料庫
- ChatGPT “眼”中的開源資料庫ChatGPT資料庫
- 使用rust編寫dwm status-bar應用程式Rust
- 用 Rust 編寫 eBPF/XDP 負載均衡器RusteBPF負載
- async-rdma:編寫高吞吐量、低延遲網路應用的Rust庫Rust
- Rust的資料DataFrame庫有哪些?Rust
- 開源資料庫流行度首次超過非開源資料庫Confluent資料庫
- rnacos——用rust重新實現的nacos開源配置、註冊中心服務Rust
- rust-unofficial/awesome-rust:Rust開原始碼和資源的精選列表。Rust原始碼
- 平安科技資料庫總經理汪洋:開源資料庫在平安的應用實踐資料庫
- V8替代?用Rust編寫的JavaScript引擎Boa釋出RustJavaScript
- 22. 從零用Rust編寫正反向代理,一個資料包的神奇HTTP歷險記!RustHTTP
- 資料庫課程作業筆記 - 編寫資料填充資料庫筆記
- PouchDB:一個開源的 JS 資料庫JS資料庫