單體數據庫對性能和安全性的影響?
請注意:雖然我在這里特別提到 MySQL,但我也希望/接受適用於所有/大多數關係系統的通用答案。
作為一名開發人員,我看不到將表分組到不同數據庫中的設計優勢,尤其是如果所有表都以某種方式相互連接/相關。從性能的角度來看,對我(一個愚蠢的開發人員)來說,如果我有 100 個表位於單個數據庫中,或者 10 個數據庫中有 10 個表,這有什麼關係呢?
所以我問:將單體數據庫分解成更小的數據庫有性能/安全性/其他好處嗎?這些是什麼?
另外,如果我有數百個表,並且它們實際上都以某種方式連結在一起怎麼辦?意思是,整個系統中沒有完全隔離的表;它們都具有指向其他表的外鍵。這是否意味著我必須只有 1 個大型/單體數據庫?
為了安全起見,您希望您的數據盡可能多地複製到多台伺服器上,這樣如果一台伺服器倒下,其他伺服器可以分擔負載。
並發事務引發的“經典”oltp 數據庫性能問題。主要由於鎖定,時間/事務呈指數增長。因此,緩解此問題的一種簡單方法是擁有多個數據庫,因為數據庫的並發事務將減少。因此,這是一種有吸引力的管道膠帶(便宜且容易,至少與替代品相比)。
需要考慮的一件事是,從歷史上看,瓶頸一直是儲存(磁碟),因此數據庫傾向於通過消耗大量 CPU 和記憶體來最小化磁碟訪問。同樣,分區表有助於減少磁碟負載。
同樣,多個數據庫允許將大部分數據記憶體在記憶體中,從而也大大提高了性能。
還有其他選擇。一些數據庫可以使用多台機器,或者您可以將機器合併到一個虛擬機中,但這也僅限於此。
目前的趨勢是拆分oltp和olap數據庫。這是有道理的,oltp 需要快速的行“訪問”,olap 需要高吞吐量的列讀取。
另一個技巧是擁有兩個數據庫,一個處於讀/寫模式,一個處於只讀模式。它們處於主/從配置中。大多數讀取都是在從屬設備中完成的,並且主設備上的更改被推送到從設備。這減輕了處理事務的主數據庫的負擔。
如果你仔細觀察你的數據庫,你會發現很少有操作真的需要酸性事務。拋開經典模型,建構兩三個系統可能會很有趣。例如,一個用於門票(需要交易,因為您不想出售缺貨產品),另一個系統用於其餘的。如果你更新一個產品的價格,而舊的價格用了 0.1 秒,那沒什麼大不了的(當然拍賣系統除外)。關鍵是,使用傳統系統,您不能在更新價格時出售門票,因為該行將被鎖定,並且它將在更長的時間內(1-10 秒)不可用,因為您的傳統數據庫(現在是大規模)要慢得多。
通常,事務數據庫將在“記憶體中”(基於核心鎖或多 paxos),其餘 99% 的事務數據庫將在“nosql”數據庫中讀取。然後將記憶體中的日誌合併到 nosql 數據庫中。結合其他技巧,它可以線性擴展,因此可以以傳統數據庫難以實現的方式增長。
這更複雜,需要分析、學習新範式和大量時間來實施。據我所知,它主要由Google或推特等“巨頭”使用。這是“大數據”運動的基礎。
如果您的公司使用傳統的 sql 數據庫,則最好在更改完整的迴聲系統之前使用所有可用的技巧(分片、分區、讀/寫 dbs、vm)。