對於高負載資料庫的突發奇想

一直以來,我所開發的程式、系統,都是往大格局方向去規劃,但是卻往往高估了電腦硬體的能力。縱使程式被設計能夠支 持大架構的使用,電腦硬體卻總是不給面子。尤其資料庫的部份更是令人頭痛,大量的查詢、輸入、修改,都造成資料庫效能不彰。雖然 PostgreSQL 、 MySQL等資料庫系統,都號稱每秒能夠查詢幾百萬筆資料,但事實上確不是如此。可能有人會說我應該將資料表的設計做重新的規劃和分割,或是對系統做更多 的調校。但我敢問心無愧的說,大多數該做的我都做過了。

追根究底,任何機器有它能夠負荷的運算量,縱使我們做再多的最佳化,也不過是將其他用途的運算省略減少以增加我們需 要的運算效能。所以,一直以來都有人提議,將資料庫的新增修改等操作與查詢分開,或是將資料依價值時限分割移出原本的Table。雖都可以暫時解決效能問 題,但在功能操作上多了很多不便限制,也增加了系統設計上的複雜度。

市面上常討論的資料庫叢集,不外乎是Master/Slave架構,他能做的用途只不過是資料庫的備援,能迅速彌補 Master資料庫的當機。就算是多Master的架構,也不過是將操作連線分散到各主機上。不論是哪一種,對每台主機而言,每次連線所要處理查詢的負擔 根本沒變,舉例來說,若Table裡有一千萬筆資料,每次連線所要處理的資料量就是一千萬筆。

在此我有個想法,我們何不將這一千萬筆資料分散到各主機,查詢操作資料庫時,就可分散至各個主機運算,最後再合併各個主機傳回結果。如此,若我們有10台主機共同運算,每台機器只要負擔一百萬筆的資料,效能也因此可大幅提升。

本著新想法至網路上查了一些資料,卻發現Oracle已有如此的設計,看來我不是第一個想到的人。手癢的我又去查了PostgrSQL和MySQL等開放源始碼資料庫的資料,驚訝的發現,居然沒有這種功能,也難怪Oracle始終在資料庫系統市場有一番地位。

開放源始碼的社群一向以熱情和效率著稱,或許不久後的某一天,他們也會將這項功能放入他們的系統中。

留言

  1. MySQL cluster有此架構 從4.1.x版開始

    回覆刪除
  2. 小弟斗膽回應一下,mysql cluster 或是其他solutio
    n 其實很多已經有針對這樣的情況做出回應 但是重點還是 分散式架
    構的處裡 其實講到這樣 最後還是可以回歸到 fopen fread
    的寫檔案方式 畢竟上千萬筆的record 執行成效絕對是會大打
    折扣 小弟在公司的方法 就是當資料量已經大到這種程度的時候 回歸
    到 file base 的作法....

    回覆刪除
  3. 謝謝各位的回應,我稍微研究過了MySQL,的確有此架構。我為文章內指
    控錯誤的地方表示歉意。 另外值得一提的,MySQL5以後,支援或更
    完整的提供很多商業資料庫的功能,如觸發、交易等等。雖然我還未實際測試過
    其實際效能和穩定性,可是這些功能的實現確實增加了MySQL的可用性,也
    讓它有足夠的功能與其他商業Database一較高下了。 關於 Po
    stgreSQL ,我也在研究過後,發現了用它內建的contrib/d
    blink,只需再寫少許的程式或SQL設計,就可以達成分散式架構。
    至於 File Base 雖不失一個提升效能的方法,但如果碰到了需要
    各種方式的索引搜尋和大連線量支援,效能也將會不彰。更尤其是若碰到多個網
    站服務的整合性架構,開發程式困難也是一個問題。當然,File Base
    可以做為輔助SQL的一個非常好用的工具,在某些不需要做索引搜尋等特殊功
    能的資料,可以獨立出來,利用File Base的方式提升效能。

    回覆刪除

張貼留言

這個網誌中的熱門文章

有趣的邏輯問題:是誰在說謊

Web 技術中的 Session 是什麼?

淺談 USB 通訊架構之定義(一)

淺談 USB 通訊架構之定義(二)

Reverse SSH Tunnel 反向打洞實錄