MySQL High Availability and Load Balancing Solution

最近有個朋友的客戶因為網站一到尖峰時間 MySQL 的負載就佔滿了主機了資源,請我幫忙看看能不能解決,不過因為時間考量並沒有接這個案子,只是義務性質幫忙給個方向。


據工程師表示,程式的部份除了 Cache 之外,大多也都為了 MySQL 做了最佳化。而我在尖峰時間也幫忙監測了一下狀況,在 copy tmp table 的時候也沒有花太多的時間。而 slow query 的數量增多比較偏向是 CPU Loading 太重的關係。

程式 Cache 的部份已請他們工程師處理,MySQL 的部份目前是用 Replication 來分散Write 跟 Read 的工作,以目前的負載狀況勢必要再加主機上去,由於網站性質的即時性較高,如何確保 Replication 正確運作就是一大問題,而我也提供了三種方案給他們參考。

1.MySQL Cluster

因為他們的資料庫不大,使用 Cluster 是最好的方式,加上 Ultra Monkey 可以配置出二組以上的 MySQL Cluster 來分散流量,架設方式可以參考:
http://www.howtoforge.com/loadbalanced_mysql_cluster_debian

因為網站用的是 Struts 撰寫,也可以考慮這個月才剛出爐的新工具 NDB/J ,可以直接讀取 Data node 的資料,而不用透過 MySQL Server。

NDB/J:
http://sourceforge.net/projects/ndbj/

2.MySQL Replication

這個是他們目前使用的方式,所以流量分散的部份我就不提供建議了。不過在 HA 上要花比較多的功夫來處理。如採用 Master-Master Replication 架構,或是自行撰寫 Failover/Arbitrator 來處理伺服器之間的同步關係。

架設 Master-Master Replication 可以參考:
http://www.howtoforge.com/mysql_master_master_replication

Master-Master Replication 也有個管理工具可用:
http://blog.kovyrin.net/mysql-master-master-replication-manager/

如果要自行撰寫 Failover/Arbitrator,使用 MySQL Toolkit 可以省去不少時間:
http://sourceforge.net/projects/mysqltoolkit

MySQL Toolkits 作者的介紹:
http://www.xaprb.com/blog/2007/02/26/introducing-mysql-table-checksum/
http://www.xaprb.com/blog/2007/03/18/introducing-mysql-table-sync/

3.Sequoia

20070429_01.jpg

Sequoia 前身為 C-JDBC。由 continuent 接手後,透過 Carob 已經可以支援多種不同的程式語言來建置資料庫的 clustering 跟 load balancing 環境。

Sequoia 官方網站:
http://sequoia.continuent.org/HomePage

4 comments On MySQL High Availability and Load Balancing Solution

  • 小弟最近在尋找 PostgreSQL Cluster Solution
    剛好看到這篇文章提到的 Sequoia

    不曉得 Sequoia 在超大流量跟資料(6千萬筆以上)的網站
    效率怎樣?

    小弟有試過 PGCluster, 可能是還在開發中的緣故吧
    穩定度似乎不太好 =.=”

  • longtime:

    Sequoia “據說”效能不是很好。

    不過資料庫在流量大的時候,通常都是被 Wirte 佔的資源給搞垮。不論使用的工具是什麼,有些地方還是得靠手動來調整會比較好。

  • 也許請他們先檢查索引
    CPU Loading 太大很多是因為索引沒作好
    調教過就沒問題了
    遇過很多百萬筆資料的,也沒有這樣嚴重

  • sqlrelay如何?我是用sqlrelay再搭配MySQL Replication的

Leave a reply:

Your email address will not be published.

Site Footer

Sliding Sidebar