昨晚看了一晚上的MySQL文檔,主要是關(guān)于MySQL的復制方面的文檔,用的工具是MySQL的幫助文檔+金山詞霸。
終于比較大概的了解了如何通過復制來提升MySQL數(shù)據(jù)庫的高可用性和處理能力,不過還沒有經(jīng)過實際的試驗,但整體的思想是清楚了,下面把思路大概的描述一下,有機會再進行實驗。
首先在服務器端采用1+N的模型來安裝和配置MySQL數(shù)據(jù)庫。1就是一個master數(shù)據(jù)庫,N就是一至多個slave數(shù)據(jù)庫。master數(shù)據(jù)庫必須啟用binlog模式,關(guān)于這兩種數(shù)據(jù)庫的配置參見MySQL的文檔。配置完成后就形成了一個1+N的復制集群,當對master進行修改時會自動把修改的數(shù)據(jù)更新到N個slave數(shù)據(jù)庫上。但是有一個注意的是,所有的修改操作包括添加、刪除、修改等語句必須作用在master數(shù)據(jù)庫上,這樣才能使數(shù)據(jù)可靠的復制到其他slave服務器上。另外,由于slave服務器只用作查詢,因此選用MyISAM的存儲引擎可以提高查詢的速度。
而在客戶端呢?如何使客戶端程序能均衡的使用這些可用的服務器呢?而且更新操作只能對master進行處理。這個豈不是應用程序?qū)?shù)據(jù)庫的操作邏輯非常的復雜?
其實沒有那么復雜,MySQL為我們提供了接口可以將這些復雜的操作透明化。下面主要介紹采用JDBC的客戶端如何工作在基于復制的集群環(huán)境中,其他編程語言請參照mysql的文檔。
MySQL最新的JDBC驅(qū)動程序包中提供了一個驅(qū)動類就是 com.mysql.jdbc.ReplicationDriver 。這個驅(qū)動類允許在url中設置多個mysql主機地址,例如:
jdbc:mysql://master1,slave1,slave2/dlog?autoReconnect=true&roundRobinLoadBalance=true
在上面的url中,有三個主機地址分別是master1,slave1,slave2,其中ReplicationDriver 規(guī)定第一個主機是master主機地址,剩下的全部是slave主機。另外有兩個參數(shù)必須指定為true,就是autoReconnect和roundRobinLoadBalance。
使用這個驅(qū)動和配置后還不能馬上解決所有的問題,我們還需要對程序做一些小改動。
我們必須告訴驅(qū)動程序,哪些語句的執(zhí)行是作用在master數(shù)據(jù)庫,而哪些語句的執(zhí)行作用在slave數(shù)據(jù)庫上。
ReplicationDriver 是通過Connection對象的readOnly屬性來判斷該操作是否為更新操作。因此我們在執(zhí)行一個sql語句的時候必須調(diào)用一下setReadOnly告訴驅(qū)動程序當前執(zhí)行的操作是否是只讀。如果你是使用hibernate操作數(shù)據(jù)庫的,那可以調(diào)用Query.setReadOnly方法。
以上就是整個思路的大概描述,猜想肯定還有存在一些問題,例如因為數(shù)據(jù)的復制過程是異步的,也是說有可能執(zhí)行了某個更新操作,但是查詢的時候查不到的情況出現(xiàn)。當然這些問題只能在實際的過程中進行解決。
另外關(guān)于最新版本的MySQL 5.1有一個集群的功能,不過經(jīng)過研究發(fā)現(xiàn)這個東西簡直就是兒戲,實在搞不懂MySQL怎么會做這么不負責任的設計,因為這個特性要求數(shù)據(jù)庫是整個load到內(nèi)存中的,也就是說你的數(shù)據(jù)有多大,內(nèi)存就得有多大,怎么說呢? 如果你真的內(nèi)存足夠大,你去試試吧,反正這種方案已經(jīng)被我否決了,希望MySQL能改進一下。
|