2009-04-24 63 views
24

我有一個運行LAMP的web應用程序。我們最近增加了負載,現在正在尋求解決方案。縮放apache非常簡單,我們只需要擁有多臺主機並循環傳入流量。如何用多臺機器擴展MySQL?

但是,apache的每個實例都會與MySQL進行通信,最終MySQL將被重載。如何在此設置中跨多臺機器擴展MySQL?我已經看過this,但具體而言,我們需要立即提供數據庫的更新,所以我不認爲複製是一個很好的策略嗎?也希望這可以用最少的代碼更改來完成。

PS。我們有1:1的讀寫比率。

回答

21

只有兩種策略:複製和分片。當您的寫入和讀取流量較少時,通常會進行復制,因此您可以將讀取重定向到多個從屬設備,但複製流量存在大量時間和不一致的可能性。

隨着分片分割你的數據庫表跨多臺機器(稱爲功能分片),這使得特別是加入更加困難。如果這再適合你,你也需要在多臺機器上分割你的行,但這並不好玩,並且依賴於應用程序和數據庫之間實現的分層。

面向文檔的數據庫或列存儲爲您完成這項工作,但它們目前針對OLAP進行了優化,而不針對OLTP進行優化。

5

您可能不認爲複製不是最佳策略,但請看這link,它提供了一個相當簡單和直接的提示,使用複製來幫助平衡多臺機器間的負載。

+0

鏈接已損壞。 – sunnyrjuneja 2012-10-17 18:44:06

0

取決於應用程序後端(即如何處理PK,事務和插入ID),可以考慮使用不同auto_increment設置的MASTER-MASTER複製。這可能很棘手,需要經過徹底測試,但它可以工作。

此外,在新的MySQL 5.6中有一個GTID(全局事務標識符),通常可以幫助保持複製同步,特別是在這種情況下。

0

那麼......好運將所有這些寫入到一個真正的大規模。數據庫引擎成爲瓶頸,太多的鎖和緩衝管理和東西...

我發現真正有效的唯一方法是向外擴展,分片,不幸的是沒有爲MySQL「開箱即用」提供分片(就像Mongo等NoSQL一樣)。 ScaleBase(免責聲明:我在那裏工作)是一個完全橫向擴展解決方案的製造商,如果你願意,你可以使用「自動分片機」。 ScaleBae分析您的數據和SQL流,在數據庫節點之間分割數據,路由命令並在運行時彙總結果 - 所以您不必!