Mongodb

處理高度相關的大數據時的關係或非關係

  • July 6, 2021

我正在處理一個將處理大型事件流(每分鐘 GBs)的項目(用 Java 編寫)。此數據經過大量處理以查找事件之間的關係。這是通過標準化和相關過程完成的。現在,我們正在研究大約 10 種不同的數據類型(換句話說,10 個表),它們最終將進入數據庫,以及用於下游處理的 Kafka。所有這些數據類型都會以某種方式相互關聯。

該系統基於微服務架構,所有數據均使用 Kafka 實時處理。這意味著,有大量的數據庫寫入幾乎沒有讀取(除了我們的中間件/前端)。

我已經閱讀了大量關於 NoSQL(特別是 MongoDB)的資料,但我有點受寵若驚。大多數文章都分解為選擇 NoSQL 而不是關係數據庫,原因如下:

  1. 處理大量數據和可擴展性是一個問題
  2. 每次迭代都會定期更改架構
  3. 您正在處理的數據是非關係型的

我的案例與這三點衝突:

  1. 考慮到我們每天將儲存數 TB 的數據,擴展始終是一個問題。很多這些數據是重複的,可能會被合併。
  2. 在開發階段的初始迭代中,架構更改會很頻繁,但我想一旦項目達到 GA 版本,就會放慢速度。在那之後,架構更改可能會很小,但很可能會發生。
  3. 該軟體的目的是辨識數據中的關係,其中將存在多個一對多關係。

如果我繼續使用 SQL,我可以通過使用查找/映射表和合併重複數據來很好地減少儲存的數據量。但歸根結底,擴展是我的第一個關注點。一旦我們致力於使用關係數據庫,就很難遷移出去。

如果我選擇 NoSQL,我可以在擴展方面放輕鬆。隨著我們的應用程序在開發階段的開始發生重大變化,它還可以實現更順暢的開發。

不幸的是,許多關於這個主題的文章傾向於概括掉在對這個問題做出決定時真正重要的具體關鍵事實,這導致了很多錯誤資訊和混亂。

首先,在讀取和寫入數據時,沒有什麼可以讓 NoSQL 數據庫系統更快,無論人們考慮儲存多少數據。兩者都能夠以(大致)相同的速度在相同的硬體上讀取和寫入數據,所有條件都相同。TB 級數據就是 TB 級數據,無論是使用 NoSQL 數據庫系統還是 RDBMS 儲存。這是人們在考慮何時使用 NoSQL 系統時偶然發現的最大困惑之一。聽起來您並沒有對此感到特別困惑,但我只想向未來的讀者說明這一點。

話雖如此,您提到的三點幾乎是需要考慮的主要事項,所以讓我們簡要地分解一下:

1. 處理大量數據和可擴展性是一個問題:NoSQL 最初是為了解決基礎設施可擴展性問題,當公司開始達到硬體的垂直限制時,它允許跨多個伺服器的水平擴展具有更大的靈活性。他們的伺服器。NoSQL 通過權衡一些傳統關係數據庫管理系統 (RDBMS) 必須遵守的ACID 原則來實現這一點,例如即時一致性最終一致性,這提高了其擴展的靈活性。

在現代計算中,作為一個整體的硬體和基礎設施(例如,作為一個選項的雲服務),甚至 RDBMS 本身都已經發展到足夠的程度,以至於最初發明 NoSQL 的可伸縮性問題現在已經成為一個有爭議的問題。這並不是說 NoSQL 沒有案例,例如,移動開發往往是一個合適的地方,人們可能會發現 NoSQL 的自然水平可擴展性是他們應用程序的合適選擇(因為在跨多個設備分發數據時需要最終的一致性需要支持離線優先設計)。但是垂直擴展,無論是物理的、虛擬的還是在雲中,現在都和水平擴展一樣容易,而且現在 RDBMS 甚至可以很容易地水平擴展。

這一點對今天的開發人員來說可能很重要的唯一原因是,如果您的基礎架構團隊真的無法維持 RDBMS 的垂直擴展,並且由於一些獨特而有趣的原因,發現水平擴展基礎架構更加容易和快捷。

2. 每次迭代都會有規律地改變模式:雖然 NoSQL 數據庫減少了對數據庫層架構更改的關注,但它並沒有消除架構仍然需要由消費者維護的事實,消費者將建立在數據之上。因此,雖然在 RDBMS 中維護模式更改可能需要做更多的前期工作,但這並不是什麼外來的東西,或者應該禁止人們選擇使用這樣的系統,因為通常無論人們選擇如何儲存他們的數據,模式的想法該數據將始終存在於其生命週期的某個時刻。並且在 RDBMS 中進行模式更改通常並不難維護(除非您再次嘗試在分佈式客戶端(例如移動設備)之間同步這些更改,並且首先考慮離線,然後需要額外考慮) .

3. 您正在處理的數據是非關係型的:在我看來,這是在不同類型的數據庫系統之間做出決定時最具決定性的特徵之一。如果您的數據具有強烈定義的關係模式,那麼將其儲存在 RDBMS 中通常是有意義的。否則會降低數據設計的架構,並讓以後查詢更複雜的案例變得更加困難。如果數據不是關係數據,那麼如果您從不打算以更複雜的方式查詢數據,那麼 NoSQL 系統可能會被證明是您數據的更簡單的家。

根據您提供的資訊,除非您的基礎架構團隊在垂直擴展伺服器硬體方面存在重大瓶頸,否則我建議您使用 RDBMS,因為您的數據已經具有很強的相關性。

有關更多資訊,請參閱我過去就該主題撰寫的DBA.StackExchange 答案,其中談到了兩種類型的數據庫系統的差異並涉及 NoSQL 的歷史。

引用自:https://dba.stackexchange.com/questions/295305