NoSQL調查 Part2 NoSQL誤解

2022-10-09 21:57:22 字數 4138 閱讀 5581

前言

nosql資料庫在2023年左右成為 "流行模式",並引發了一場資料庫革命,導致許多企業用基於nosql的資料平台取代他們傳統的rdbms技術。

有趣的是,現在這些公司中的許多人要麼對他們做的這樣決定感到後悔,要麼發現,要繼續使用他們的nosql解決方案,而不花費不合理的金錢或承擔不合理的風險,是極其困難的。

很多客戶在其他平台上實施了nosql,然而最初的解決方案讓他們失望,於是來到了volt active data,。在研究了他們的失敗原因時,出現了許多共同的因素,最常見的事情之一就是對nosql能做什麼或不能做什麼的某種誤解。

讓我們回顧一下我們對nosql夢想破滅的真實經歷。

我需要nosql,是因為sql很慢

我們已經多次看到這種情況。因為傳統的資料庫很慢,所以人們傾向於認為是sql導致了它們的緩慢。

現在我們要清楚:sql可以很慢。破壞sql的最簡單的方法是在每次向資料庫傳送sql語句時都要進行解析,而不是使用 "預備語句"。你也可以在複雜的查詢和可疑的執行計畫中獲得數小時的樂趣。或者,如果你真的想讓你的dba有乙個 "充分就業的行為",可以使用基於成本的優化器。

但是,sql本身並沒有什麼內在的緩慢。傳統的sql資料庫之所以慢,是因為它們的架構可以追溯到2023年左右,那時你只有乙個cpu,最小的ram,以及乙個如果你揭開蓋子就可以看到旋轉的磁碟。

volt active data是為了解決現代硬體背景下的這個問題而建立的,在同樣的硬體下,它的吞吐量是傳統rdbms的10倍左右,因為它是為現代多核cpu編寫的。sql本身並不是問題所在。

我們聽到的第二個反對sql的理由是——"開發人員不喜歡它"。但是正如我們上面指出的,某種形式的模式和結構是需要的,而且隨著越來越多的用例得到支援,它將迅速變得更加複雜。這就是人們在nosql資料庫中加入sql層的原因。這反過來又讓我們回到了如何讓sql快速執行的問題上,這是我們所知道的一兩件事情。快速的sql必須從一開始就被納入架構。在nosql儲存中新增乙個sql層,充其量會讓你面臨你在使用傳統rdbms時想要逃避的那種效能挑戰。

圍繞著資料庫速度,你應該考慮的是:交易的快速執行--即在1到2毫秒內。

我可以直接使用開放原始碼,獲得兩方面的好處

管理層喜歡開源nosql技術的概念,不是因為他們想為**庫做貢獻,而是因為它是'免費'的。

但是,開源軟體是 "免費"的,就像給動物園提供乙隻「免費」大熊貓一樣。熊貓本身並沒有花費動物園的錢,但維護、照顧和用空運的新鮮竹子餵養肯定要花錢,用量也會迅速增加。實際上,在商業背景下,軟體許可證是整個系統執行過程中相關費用和成本的一部分。因此,雖然你可能不花任何錢就能獲得軟體,但你不可能免費使用它。

一旦你獲得了乙個軟體,你就需要支援它。對於開放原始碼,我們經常聽到員工自願自己做支援的故事。雖然這對相關人員的簡歷有好處,但這不一定符合公司的最佳利益。通過內部支援,他們有效地創造了乙個要求,即新員工必須具有與原來的內部志願者相同的高度專業化的技能水平。另乙個選擇是付錢給支援開源產品的公司來提供支援,在這種情況下,整個 "開源 "的區別就開始變得有點模糊了。

另乙個因素是nosql資料庫的複雜性在增加。隨著他們解決更多的功能,他們變得越來越複雜,尤其是當你開始為諸如sql和acid事務新增子系統時。

開源的nosql資料庫還有乙個長期的問題。幾乎所有成功的資料庫現在都已經上市了,經常以令人瞠目結舌的估值上市。這意味著他們未來的開發工作將不可避免地集中在企業功能上,並抓住那些尚未與他們簽訂協議的企業客戶。sspl的崛起就是這方面的明顯證據。

圍繞資料庫和資料平台的成本,你應該考慮什麼。與它所創造的價值相比,技術的長期總成本應該是可**、可負擔的。

我們希望模式具有靈活性,所以我們需要乙個無模式的nosql資料庫

當涉及到定製和靈活性時,傳統的關係型資料庫是非常無助的。但多虧了json,現在無論你使用什麼資料平台,都可以更容易地在記錄層面新增額外的、自定義的資料。

也就是說,在追求靈活性的過程中,很多開發人員最終放棄了他們處理資料所需的結構。模式層面的靈活性是一把雙刃劍,它將複雜性從單一的資料儲存副本推向了多個客戶端應用程式,所有這些應用程式都必須就自定義資料的含義達成一致。在你追蹤的事物上有可選的屬性和拒絕說出不同種類的事物之間也有很大的區別。遲早有一天,需要確定關鍵的資料結構。

雖然在一些合理的情況下,擁有乙個非常靈活的模式是非常有幫助的,比如定製。但實際上並不存在真正的 "無模式 "資料庫,因為所有的資料至少都有乙個高階結構。如果資料真的沒有固有的結構,那麼你只需要一條記錄,那就是乙個blob,包含與業務有關的一切。

但在現實中,你與不同種類的 "事物 "打交道,這些 "事物 "具有相同的屬性集,而且這些事物與其他事物相關。因此,你的資料總是有乙個結構,即使它的各個組成部分有獨特的屬性。

事實上,任何一種自動化的資料處理都以工作結構為前提。你可以在模式內擁有無模式的區域,但這需要在更廣泛的企業模式的背景下進行。

圍繞模式的靈活性,應該考慮的是:有能力用任意的額外資料(即json)擴充套件記錄,並為這些記錄建立索引。

我需要乙個nosql鍵值儲存,因為我們不希望我們的伺服器做應用邏輯

在我們見過的所有古怪的要求中,這在某種程度上是最奇怪的。它似乎是對使用3gl sql操作語言(如pl/sql)所帶來的無可爭辯的麻煩、苦難和痛苦的一種反應。它通常與上述要求同時出現,即伺服器支援完全無模式的儲存。

他們的想法是,因為一般的儲存過程,特別是pl/sql,處理起來很痛苦,所以未來與資料庫的所有互動都應該限於 "獲取 "和

"投放 "操作。作為乙個曾經的pl/sql開發者,我可以同情這種做法,但試圖避免這種做法會產生其他更糟糕的問題。

如果處理的是乙個簡單的用例,對乙個鍵/值進行一次讀取,然後再進行寫入修改,那麼雖然可能會遇到爭用和樂觀鎖定的問題,但事情或多或少都會正常。

當你需要讀取和改變多個鍵,例如 "a"、"b "和 "c "時,問題就開始了。如果你按順序讀取和改變它們,你會面臨兩個主要問題:

有人可能在你讀完a後,在你讀c前改變a,導致錯誤的結果。

在依次寫入'a'、'b'和'c'之前,依次讀取它們所花費的時間會影響你的sla。

簡而言之,有乙個用例的子集,需要在乙個步驟中讀取和修改一組相關的值,或者在出錯時寫很多很多的**來清理事情。

nosql處理這個問題方式比較糟糕,要麼是把工作轉嫁給開發人員,要麼是實現與使用傳統rdbms時讓我們發瘋的那種笨重的鎖定技術。

圍繞一致性和邏輯,你應該考慮什麼。能夠處理涉及多個資料項的複雜事務,而不必擔心讀取一致性或清理**。

​我們今天只需要乙個簡單的nosql資料儲存,所以我們可以這樣做,並在其他時間擔心未來的複雜性

敏捷開發一般來說是件好事,但我們看到的情況是,重點已經從專注於通過每次快速迭代為客戶增加價值,變成了奇怪的、故意拒絕為未來做計畫的狀態。僅因第乙個版本有乙個簡單的模式,並不意味著你在未來不需要乙個功能更全面的資料平台,而且改變資料平台可能是非常昂貴的。

未來對地理複製的要求就是乙個典型的例子。像我們的​​active(n)​​這樣可信的地理複製資料平台是很罕見的。在應用層面上對成品進行地理複製的改造是一場噩夢,經常導致完全重寫。這就像建造一輛飛行汽車和讓現有的汽車飛起來之間的區別。

即使你使用乙個具有地理複製能力的資料平台,你仍然需要乙個很好的計畫來解決應用層面的衝突,而這樣的系統會帶來巨大的操作挑戰。

地理複製只是這種現象的乙個例子。底線是,在定義需求時,如果只盯著眼前的問題,而不考慮長期的需求,將會很災難。

圍繞複雜性,應該考慮——挑選乙個能滿足長期需求的產品,同時也要充分了解它是如何做到的,以及它是如何影響架構選擇和總成本的。​總結

每個人的情況都不一樣,在volt active data,我們並不聲稱我們的產品是乙個神奇的、通用的資料平台,可以滿足你所有的需求。在我們與你交談之前,我們不知道volt active data是否適用於你。

但我們確實看到,從傳統的rdbms到nosql的轉變出了問題,因為人們使用的需求乍看之下是合理的,在深入了解後,會發現這些需求既簡單又與企業的長期目標脫節。

如果你正在從傳統的rdbms遷移,或者有乙個新實施的nosql解決方案讓你失望,因為它不能滿足你對規模、速度或交易的需求,請隨時與我們交流。我們非常肯定,我們至少可以引導你走向正確的方向。

​​volt active data中文站​​

[email protected]

程式設計練習 part2

一.題目 對於乙個給定的井字棋棋盤,請設計乙個高效演算法判斷當前玩家是否獲勝。給定乙個二維陣列board,代表當前棋盤,其中元素為1的代表是當前玩家的棋子,為0表示沒有棋子,為 1代表是對方玩家的棋子。測試樣例 1,0,1 1,1,1 1,1,0 返回 true 思路 對於井字棋的獲勝方式,有下面幾...

網路程式設計part2

五層協議 計算機1 計算機2 應用層 應用層 socket socket 傳輸層 段傳輸層 網路層包 網路層資料鏈路層 幀資料鏈路層 物理層 互動機 物理層 客戶端軟體send 服務端軟體recv 作業系統 作業系統 計算機硬體 物理介質 計算機硬體 客戶端軟體send 服務端軟體recv 作業系統...

C 記憶體管理 part2

allocating class instances using new new operator 也可以用於對class instance分配動態記憶體。如下例 include using namespace std class point private int x int y int main...