2011-03-14 55 views
31

我們正在對我們當前的系統進行概述,試圖弄清楚我們是否可以提高性能&的可靠性。MySQL集羣(NDB)與MySQL複製(InnoDB)for Rails 3應用程序:優點/缺點?

目前我們運行了一堆內部Rails應用程序和我們基於Rails的網站。有些已經是Rails 3,有些正在轉換爲Rails 3.它們都連接到下面的MySQL安裝程序。

mysql01 (master server) => mysql02 (slave) =>(每日數據庫備份到驅動器,每日,每週,每月&每半年備份一次)。

所有的寫操作都發生在mysql01上,大部分的短讀操作也是如此,一些「更耗費資源的讀操作」(比如每月/每週報告需要3-10分鐘才能運行並將數據轉儲到csv或備份)轉到mysql02服務器。我們每天大約有3-5,000次訪問我們的網站,並且有大約20-30名內部用戶,每天使用各種應用程序進行庫存,訂單處理等。因此,除了這些報告之外,這些服務器並不特別承受重負。無論如何,奴隸的運行。

所有服務器都在Debian Lenny虛擬機上的virtualized XEN池中運行。

因此,我們正在對系統進行審查,並且有人提出了切換到MySQL Cluster (NDB)設置的建議。我理論上知道它,但從未真正運行過它。那麼有沒有經驗的人知道任何pro/cons與我們當前的設置,以及涉及Ruby/Rails應用程序時的任何特定警告?

回答

69

有InnoDB和MySQL集羣(NDB)最近發佈的文檔......一個很好的比較值得考慮看看:http://dev.mysql.com/doc/refman/5.1/en/mysql-cluster-compared.html

的集羣架構由兩個被訪問的MySQL服務器池的(多個)應用;這些MySQL服務器實際上並不存儲羣集數據,數據通過下面的數據節點池進行分區。每個MySQL服務器都可以訪問所有數據節點中的數據。如果一臺MySQL服務器更改了一段數據,那麼它對所有其他MySQL服務器即時可見。

顯然,這種架構使得擴展數據庫非常容易。與分片不同,應用程序不需要知道數據的保存位置 - 它只能在所有可用的MySQL服務器之間進行負載平衡。與使用MySQL複製進行擴展不同,集羣允許您像讀取一樣擴展寫入。新的數據節點或MySQL服務器可以添加到現有的羣集中,而不會對應用程序造成任何服務中斷。

MySQL集羣的無共享體系結構意味着它可以提供極高的可用性(99.999%+)。每次更改數據時,都會同步複製到第二個數據節點;如果一個數據節點出現故障,則應用程序讀取請求將由備份數據節點自動處理。由於MySQL Cluster的分佈式特性,一些操作可能會比較慢(例如JOIN有數千箇中間結果 - 雖然有一個可用的原型解決方案可以解決這個問題),但其他操作可能非常快並且可以極大地擴展好(如主鍵讀寫)。您可以選擇在內存或磁盤中存儲表(甚至是列),並且通過選擇內存選項(在backgoround中將檢查點設置爲磁盤),事務處理可以快速地爲非常簡短

MySQL集羣可能比單個MySQL服務器更復雜,但它可以防止您在應用程序中實施分片或讀/寫分割。鞦韆和環島。

爲了獲得MySQL Cluster的最佳性能和可伸縮性,您可能需要調整您的應用程序(請參閱集羣性能調整白皮書:http://www.mysql.com/why-mysql/white-papers/mysql_wp_cluster_perfomance.php)。如果你擁有應用程序,這通常不是什麼大問題,但是如果你使用別人的應用程序,而你不能修改,那麼這可能是一個問題。

最後需要注意的是,它不需要全部或全部 - 您可以選擇將某些表存儲在羣集中,還可以選擇使用其他存儲引擎,這是每個表的選項。您也可以在羣集和其他存儲引擎之間進行復制(例如,將Cluster用於運行時數據庫,然後複製到InnoDB以生成複雜的報告)。

+0

謝謝 - 非常全面的答案。 – konung 2011-03-16 14:50:24