2006年8月5日 星期六

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

Standard

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

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

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

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

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

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