[轉]使用複製來提升MySQL的高可用性和處理能力

season0891發表於2013-10-31

昨晚看了一晚上的MySQL文件,主要是關於MySQL的複製方面的文件,用的工具是MySQL的幫助文件+金山詞霸。

終於比較大概的瞭解瞭如何透過複製來提升MySQL資料庫的高可用性和處理能力,不過還沒有經過實際的試驗,但整體的思想是清楚了,下面把思路大概的描述一下,有機會再進行實驗。

首先在伺服器端採用1+N的模型來安裝和配置MySQL資料庫。1就是一個master資料庫,N就是一至多個slave資料庫。master資料 庫必須啟用binlog模式,關於這兩種資料庫的配置參見MySQL的文件。配置完成後就形成了一個1+N的複製叢集,當對master進行修改時會自動 把修改的資料更新到N個slave資料庫上。但是有一個注意的是,所有的修改操作包括新增、刪除、修改等語句必須作用在master資料庫上,這樣才能使 資料可靠的複製到其他slave伺服器上。另外,由於slave伺服器只用作查詢,因此選用MyISAM的儲存引擎可以提高查詢的速度。

而在客戶端呢?如何使客戶端程式能均衡的使用這些可用的伺服器呢?而且更新操作只能對master進行處理。這個豈不是應用程式對資料庫的操作邏輯非常的複雜?

其實沒有那麼複雜,MySQL為我們提供了介面可以將這些複雜的操作透明化。下面主要介紹採用JDBC的客戶端如何工作在基於複製的叢集環境中,其他程式語言請參照mysql的文件。

MySQL最新的JDBC驅動程式包中提供了一個驅動類就是 com.mysql.jdbc.ReplicationDriver 。這個驅動類允許在url中設定多個mysql主機地址,例如:

jdbc:mysql://master1,slave1,slave2/dlog?autoReconnect=true&roundRobinLoadBalance=true

在上面的url中,有三個主機地址分別是master1,slave1,slave2,其中ReplicationDriver 規定第一個主機是master主機地址,剩下的全部是slave主機。另外有兩個引數必須指定為true,就是autoReconnect和roundRobinLoadBalance。

使用這個驅動和配置後還不能馬上解決所有的問題,我們還需要對程式做一些小改動。

我們必須告訴驅動程式,哪些語句的執行是作用在master資料庫,而哪些語句的執行作用在slave資料庫上。

ReplicationDriver 是透過Connection物件的readOnly屬性來判斷該操作是否為更新操作。因此我們在執行一個sql語句的時候必須呼叫一下 setReadOnly告訴驅動程式當前執行的操作是否是隻讀。如果你是使用hibernate運算元據庫的,那可以呼叫 Query.setReadOnly方法。

以上就是整個思路的大概描述,猜想肯定還有存在一些問題,例如因為資料的複製過程是非同步的,也是說有可能執行了某個更新操作,但是查詢的時候查不到的情況出現。當然這些問題只能在實際的過程中進行解決。

另外關於最新版本的MySQL 5.1有一個叢集的功能,不過經過研究發現這個東西簡直就是兒戲,實在搞不懂MySQL怎麼會做這麼不負責任的設計,因為這個特性要求資料庫是整個 load到記憶體中的,也就是說你的資料有多大,記憶體就得有多大,怎麼說呢? 如果你真的記憶體足夠大,你去試試吧,反正這種方案已經被我否決了,希望MySQL能改進一下。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/90618/viewspace-775439/,如需轉載,請註明出處,否則將追究法律責任。

相關文章