心有多大舞臺(tái)便有多大

          Embrace changes, pursue excellence, share niceness.

          [轉(zhuǎn)]使用復(fù)制來提升MySQL的高可用性和處理能力

          lhwork 發(fā)表于 2007-1-19 9:30:08

          昨晚看了一晚上的MySQL文檔,主要是關(guān)于MySQL的復(fù)制方面的文檔,用的工具是MySQL的幫助文檔+金山詞霸。

          終于比較大概的了解了如何通過復(fù)制來提升MySQL數(shù)據(jù)庫的高可用性和處理能力,不過還沒有經(jīng)過實(shí)際的試驗(yàn),但整體的思想是清楚了,下面把思路大概的描述一下,有機(jī)會(huì)再進(jìn)行實(shí)驗(yàn)。

          首先在服務(wù)器端采用1+N的模型來安裝和配置MySQL數(shù)據(jù)庫。1就是一個(gè)master數(shù)據(jù)庫,N就是一至多個(gè)slave數(shù)據(jù)庫。master數(shù)據(jù)庫必須啟用binlog模式,關(guān)于這兩種數(shù)據(jù)庫的配置參見MySQL的文檔。配置完成后就形成了一個(gè)1+N的復(fù)制集群,當(dāng)對(duì)master進(jìn)行修改時(shí)會(huì)自動(dòng)把修改的數(shù)據(jù)更新到N個(gè)slave數(shù)據(jù)庫上。但是有一個(gè)注意的是,所有的修改操作包括添加、刪除、修改等語句必須作用在master數(shù)據(jù)庫上,這樣才能使數(shù)據(jù)可靠的復(fù)制到其他slave服務(wù)器上。另外,由于slave服務(wù)器只用作查詢,因此選用MyISAM的存儲(chǔ)引擎可以提高查詢的速度。

          而在客戶端呢?如何使客戶端程序能均衡的使用這些可用的服務(wù)器呢?而且更新操作只能對(duì)master進(jìn)行處理。這個(gè)豈不是應(yīng)用程序?qū)?shù)據(jù)庫的操作邏輯非常的復(fù)雜?

          其實(shí)沒有那么復(fù)雜,MySQL為我們提供了接口可以將這些復(fù)雜的操作透明化。下面主要介紹采用JDBC的客戶端如何工作在基于復(fù)制的集群環(huán)境中,其他編程語言請(qǐng)參照mysql的文檔。

          MySQL最新的JDBC驅(qū)動(dòng)程序包中提供了一個(gè)驅(qū)動(dòng)類就是 com.mysql.jdbc.ReplicationDriver 。這個(gè)驅(qū)動(dòng)類允許在url中設(shè)置多個(gè)mysql主機(jī)地址,例如:

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

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

          使用這個(gè)驅(qū)動(dòng)和配置后還不能馬上解決所有的問題,我們還需要對(duì)程序做一些小改動(dòng)。

          我們必須告訴驅(qū)動(dòng)程序,哪些語句的執(zhí)行是作用在master數(shù)據(jù)庫,而哪些語句的執(zhí)行作用在slave數(shù)據(jù)庫上。

          ReplicationDriver 是通過Connection對(duì)象的readOnly屬性來判斷該操作是否為更新操作。因此我們?cè)趫?zhí)行一個(gè)sql語句的時(shí)候必須調(diào)用一下setReadOnly告訴驅(qū)動(dòng)程序當(dāng)前執(zhí)行的操作是否是只讀。如果你是使用hibernate操作數(shù)據(jù)庫的,那可以調(diào)用Query.setReadOnly方法。

          以上就是整個(gè)思路的大概描述,猜想肯定還有存在一些問題,例如因?yàn)閿?shù)據(jù)的復(fù)制過程是異步的,也是說有可能執(zhí)行了某個(gè)更新操作,但是查詢的時(shí)候查不到的情況出現(xiàn)。當(dāng)然這些問題只能在實(shí)際的過程中進(jìn)行解決。

          另外關(guān)于最新版本的MySQL 5.1有一個(gè)集群的功能,不過經(jīng)過研究發(fā)現(xiàn)這個(gè)東西簡直就是兒戲,實(shí)在搞不懂MySQL怎么會(huì)做這么不負(fù)責(zé)任的設(shè)計(jì),因?yàn)檫@個(gè)特性要求數(shù)據(jù)庫是整個(gè)load到內(nèi)存中的,也就是說你的數(shù)據(jù)有多大,內(nèi)存就得有多大,怎么說呢? 如果你真的內(nèi)存足夠大,你去試試吧,反正這種方案已經(jīng)被我否決了,希望MySQL能改進(jìn)一下。

          posted on 2008-03-21 19:03 pony 閱讀(578) 評(píng)論(0)  編輯  收藏 所屬分類: 轉(zhuǎn)載的文章

          主站蜘蛛池模板: 沾化县| 吉首市| 平谷区| 镇康县| 六盘水市| 澄迈县| 神池县| 阿拉善左旗| 乳山市| 成武县| 湘潭县| 吉木乃县| 城步| 美姑县| 方城县| 西畴县| 吕梁市| 女性| 怀柔区| 津市市| 柳河县| 安康市| 壤塘县| 密云县| 花垣县| 敦煌市| 垦利县| 木里| 昌乐县| 舟曲县| 华阴市| 阿坝| 长治县| 宜丰县| 桂平市| 灵寿县| 集贤县| 东平县| 海安县| 新绛县| 乌审旗|