亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

[轉] 基于MySQL的數(shù)據(jù)庫集群系統(tǒng)的實現(xiàn)

系統(tǒng) 2002 0

基于MySQL的數(shù)據(jù)庫集群系統(tǒng)的實現(xiàn)

<nobr><table cellspacing="0" cellpadding="0"><tbody><tr valign="top"> <td align="right"></td> <td width="46"><form action="https://www-130.ibm.com/developerworks/secure/email-it.jsp"></form></td> </tr></tbody></table></nobr>
內(nèi)容:
<!--Standard links for every dw-article-->
第一節(jié) 數(shù)據(jù)庫集群技術的現(xiàn)狀
第二節(jié) 目前數(shù)據(jù)庫應用狀況
第三節(jié) 暴露出來的問題
第四節(jié) 如何解決
第五節(jié) 針對于"Linux+Apache+PHP+MySQL"的第一類應用問題的解決方式
第六節(jié) MySQL-HA-Proxy方案的提出
第七節(jié) MySQL Client 與 Server之間如何通信
第八節(jié) Client 如何通過 Server 的用戶認證
第九節(jié) 系統(tǒng)的結構與流程
第十節(jié) 結束語
參考資料
關于作者
對本文的評價
訂閱:
developerWorks 時事通訊

級別: 初級

<name></name>徐超
TOM.COM北京公司
2003 年 3 月 09 日

您的WebApp系統(tǒng)是否正在使用一個MySQL的數(shù)據(jù)庫系統(tǒng)?您的客戶是不是總是抱怨頁面結果反饋的非常慢?您的MySQL系統(tǒng)的負載是不是總是維持在一個非常高的狀態(tài)下?本文將為您提供一個分擔MySQL系統(tǒng)的負載的方法,以及由此派生出來的一個MySQL-HA-Proxy的開發(fā)項目。使用本文提供的方法,您將以最小的源代碼改動,獲得MySQL系統(tǒng)的高效運轉。

第一節(jié) 數(shù)據(jù)庫集群技術的現(xiàn)狀
目前數(shù)據(jù)庫集群系統(tǒng)應用得比較成功,應用范圍比較廣泛的是:Oracle公司的Oracle9與IBM公司DB2。Oracle9采用Shared-storage的技術,DB2選擇了Shared-nothing的技術,二者各有長短。

最新的數(shù)據(jù)庫集群系統(tǒng)的理論基礎是分布式計算,將數(shù)據(jù)分布到每個節(jié)點,所有的計算節(jié)點并行處理數(shù)據(jù),將結果匯總。這樣的方式無疑是最完美的。但是目前仍然不能實現(xiàn)全部的功能。


對于Shared-storage以及Shared-nothing的技術請參考Oracle以及IBM網(wǎng)站上的相關資料。

第二節(jié) 目前數(shù)據(jù)庫應用狀況
目前數(shù)據(jù)庫應用狀況大致分為兩類,第一類是數(shù)據(jù)量在100G以下,數(shù)據(jù)庫訪問頻繁,請求密集。主要是Web APP類型的應用,例如:網(wǎng)站,論壇等。這些Web APP類型的應用訪問數(shù)據(jù)庫的特點是:訪問頻繁,數(shù)據(jù)庫每秒鐘要接受幾千次以上的查詢,需要經(jīng)常追加數(shù)據(jù),同時對數(shù)據(jù)的響應速度要求比較高。另一類是用于科學計算、存儲歷史數(shù)據(jù)的應用,數(shù)據(jù)量往往達到幾百G。這些應用訪問數(shù)據(jù)庫的特點是:多為查詢操作,數(shù)據(jù)都是分批、定時、集中倒入數(shù)據(jù)庫,數(shù)據(jù)庫的記錄非常多,積累了大量的數(shù)據(jù),對數(shù)據(jù)庫的響應速度沒有太高要求。

第三節(jié) 暴露出來的問題
第一類應用,由于訪問比較頻繁,而且為了支持更多的訪問,Web Server一般都使用了負載均衡的集群,但是對于數(shù)據(jù)庫來說,由于無法實現(xiàn)集群操作,每秒鐘的請求不斷增加,隨著服務器負載的增加,響應單個請求的速度越來越慢,如果庫文件比較大,出現(xiàn)寫操作的時候還會出現(xiàn)鎖表時間過長等影響訪問效率的事情。

第二類應用,主要是數(shù)據(jù)文件太大,每次處理數(shù)據(jù)都需要大量的時間,如果寫錯一個語句就需要花幾個小時來重做查詢。

第四節(jié) 如何解決
首先應當從硬件、軟件、程序、索引、SQL語句這幾個方面進行優(yōu)化,如果仍然不能解決問題,我們就要考慮數(shù)據(jù)庫系統(tǒng)的集群(并行處理)了。

對于第一類的應用,在數(shù)據(jù)庫服務器正常運行,負載不高的情況下,應用對數(shù)據(jù)庫系統(tǒng)的狀況還是滿意的。但是數(shù)據(jù)庫系統(tǒng)負載過高之后,就會出現(xiàn)完成請求的時間加長,達不到系統(tǒng)的要求時間。既然負載是由于過多的請求造成的,我們就采取分擔請求的方式,讓一部分的請求去訪問另外一臺服務器,讓單臺服務器的負載降低,從而解決問題。

對于第二類的應用,就需要分布式計算的系統(tǒng)來解決了,一般的系統(tǒng)是無能為力了。

第五節(jié) 針對于"Linux+Apache+PHP+MySQL"的第一類應用問題的解決方式
一個實際案例的解決:
我在工作當中遇到了這樣的問題,我們的Web Server是Linux+Apache+Php的三臺機器組成的集群,MySQL運行在SUN450,2G內(nèi)存的平臺上。由于WEB的訪問量在高峰的時候幾乎滿負荷運轉,LoadAvg(就是一分鐘之內(nèi)處于Running狀態(tài)的進程數(shù)量)都在10-20之間,反映出來就是大量的請求都在訪問數(shù)據(jù)庫的時候被掛住了,導致一個請求沒有完成,下一個請求又進來,最后惡性循環(huán)。LoadAvg會在瞬間飆升至800以上。數(shù)據(jù)庫那邊就更糟糕了,LoadAvg達到300多,數(shù)據(jù)庫的線程非常多,CPU忙于切換線程狀態(tài),這個時候除非Restart MySQL,否則怎么都不會好。在對SQL語句優(yōu)化完成后還是不能很好的解決問題,我們增加了一臺數(shù)據(jù)庫服務器,通過MySQL的數(shù)據(jù)同步機制,讓兩臺數(shù)據(jù)庫上的數(shù)據(jù)保持同步,修改了一部分只會發(fā)生讀取操作的php程序,讓這些程序連接另外一臺數(shù)據(jù)庫,算是把負載分離出去一部分,問題得到了初步的解決。但是后來業(yè)務做大,我們又增加了多臺服務器,修改了很多程序,分離他們對數(shù)據(jù)庫的讀取操作,訪問不同的服務器。

第六節(jié) MySQL-HA-Proxy方案的提出
通過修改程序的方式實現(xiàn)將系統(tǒng)的負載分離,是件很痛苦的事情,工程浩大,而且不能弄錯,因為除了主服務器可以寫入、修改數(shù)據(jù),而其它的服務器只能通過數(shù)據(jù)同步更新自身的數(shù)據(jù),所以如果你對那些數(shù)據(jù)庫進行了寫操作,結果將是災難性的。

如果我們能夠有一個程序分揀SQL語句,根據(jù)他的類型(讀取/寫入),分別傳送給不同的服務器,然后再將結果返回。采用一種類似HTTP的PROXY的方式,這樣我們就不需要通過修改源程序的方式來分擔負載了,如果再能夠根據(jù)服務器的負載狀況,或者是表的狀態(tài)(可用/鎖定),來判斷應該將這個請求分配到哪臺服務器,那就比我們修改源程序所能達到的效果還要好。

第七節(jié) MySQL Client 與 Server之間如何通信
四處尋找,也沒有找到一篇關于Mysql通訊協(xié)議的文章,看來只有分析Mysql的源程序了。于是找來mysql 3.23.49的代碼,打開sniffer工具。MySQL的通訊協(xié)議可能變更過多次,在3.23.49的版本里面,通訊協(xié)議的版本竟然是10。

簡單的分析了一下通訊協(xié)議,現(xiàn)在規(guī)整如下,有些地方還不是很完善,由于我實在沒有太多的時間仔細研讀mysql的代碼,目前我只了解到了這些。

Server 對 Client 請求的響應數(shù)據(jù)格式:

偏移 區(qū)域 類型 長度(byte) 說明
0 HEAD Data Length 3
1
2
3 FLAG 1 =0普通信息
=1多段信息
=2認證返回
>2段結束字
4 DATA CMD Code 1
5 Message DataLength - 1

當FLAG=0 , 2的時候 CMD Code 與 Message 的定義

CMDCode 類型 Message的結構
00 狀態(tài)碼 偏移 類型 Length(byte)
0 Affect rows 2
0A 服務器版本號 偏移 類型 Length(byte)
只有在剛剛連接上Server的時候有效,Server會馬上返回一個數(shù)據(jù)節(jié)段的信息 0 VersionString 8 end of '\0'
8 Session ID 4 32bits
12 UnKnown 11
FF 當出現(xiàn)錯誤的時候返回信息 偏移 類型 Length(byte)
0 ErrCode 2
2 ErrMsg END
FE 多段信息傳輸?shù)慕Y束

Client 對 Server 提交數(shù)據(jù)的格式:

偏移 區(qū)域 類型 Length(byte)
0 HEAD Data Length 3
1
2
3 Compressed 1
4 DATA Command ID 1
5 Command Data Data Length - 1

Command ID 與 Command Data 的說明:

ID 類型 數(shù)據(jù)格式
0 COM_SLEEP
1 COM_QUIT NULL
2 COM_INIT_DB Database name
3 COM_QUERY stand query string
4 COM_FIELD_LIST table name [128] wildcard[128]
5 COM_CREATE_DB Database name
6 COM_DROP_DB Database name
7 COM_REFRESH options(bits)
8 COM_SHUTDOWN NULL
9 COM_STATISTICS NULL
10 COM_PROCESS_INFO NULL
11 COM_CONNECT
12 COM_PROCESS_KILL sid[4]
13 COM_DEBUG NULL
14 COM_PING NULL
15 COM_TIME
16 COM_DELAYED_INSERT
17 COM_CHANGE_USER [user][passwd][db]
18 COM_BINLOG_DUMP
19 COM_TABLE_DUMP
20 COM_CONNECT_OUT

第八節(jié) Client 如何通過 Server 的用戶認證
協(xié)議分析完成了,我嘗試著讓它工作起來,可是認證這個部分遇到了麻煩,Mysql Server在Client連接上它的時候,會首先返回給Client一個數(shù)據(jù)包,包含協(xié)議的版本號,版本信息,SessionID,一個8字節(jié)的Key,就是這個Key的原因。Client會使用這個Key來加密密碼,然后將用戶名,密碼,需要打開的數(shù)據(jù)庫等信息發(fā)送給Server,這樣就完成認證了。我不知道Client是如何利用這個Key來加密的,所以我打算跳過密碼,我將Client的數(shù)據(jù)包重組,去掉Password的信息之后,我成功了,但是集群里面的Mysql用戶都是沒有密碼的,安全性多多少少有些問題,不過這些服務器都是放在HA后面的,沒有外部的IP地址,應該問題不大,不過多多少少是個缺憾。

但是我總要知道用戶的密碼是否正確吧?怎么辦呢?使用一個專用的Mysql來完成密碼認證。安裝一個最小化資源的Mysql Server用來做MysqlAuth(專用認證服務器),當Client連接后,就將MysqlAuth的第一個數(shù)據(jù)包返回給Client,這里面當然就包含著Key,然后Client會使用這個Key,加密密碼之后,將認證信息發(fā)回來,這個時候,MysqlHA系統(tǒng)就會將這個信息轉發(fā)給MysqlAuth,并且自己保留一份,如果認證通過了,就把保留的那一份進行重組,去掉密碼信息,然后用重組后的認證信息去連接集群中的服務器。

第九節(jié) 系統(tǒng)的結構與流程


圖中HA就是使用HeartBeat方式建立的高可靠性系統(tǒng)(具體實現(xiàn)方法請參考 http://www.linuxvirtualserver.org/ )。Proxy為Mysql-Proxy系統(tǒng),MysqlAuth是專用的認證服務器。紅色的RealServer為主要服務器,可以進行數(shù)據(jù)更新操作,同時將數(shù)據(jù)同步到其它的RealServer。


下圖描述的就是Client認證過程

下圖描述的是認證不通過以及認證通過后與RealServer建立聯(lián)接的過程

上圖講述了連接建立后,系統(tǒng)處理SQL Query請求的過程

第十節(jié) 結束語
我現(xiàn)在已經(jīng)基本完成了mysql-proxy的程序的開發(fā),但是目前仍然處于測試階段,最新的版本是0.0.4,下一個版本仍然還在修訂中。從0.0.3版本開始,mysql-proxy已經(jīng)可以完整的跑完mysql自身提供的sql-bench了,但是這個sql-bench只能提供單點的性能,沒有對集群的mysql系統(tǒng)提供測試功能。

系統(tǒng)提供了動態(tài)采集RealServer上的LoadAvg然后反饋給Mysql Proxy的程序,但是由于這部分我沒有進行測試,所以我在前面的測試中采用的請求分配方式是輪詢方式,如果出現(xiàn)兩個負載一樣的RealServer系統(tǒng)會自動的在它們之間輪換選擇。

Mysql-proxy的源代碼您可以到我的網(wǎng)站下載: http://netsock.org/bbs/ Mysql-HA-Cluster項目。還有一部分測試的數(shù)據(jù)我也會在那里公布。

如何進行系統(tǒng)測試?

既然是專門為Linux+Apache+Php+Mysql這樣的系統(tǒng)做的集群,就應該找一個實際的應用來跑跑看,然后模擬大量的訪問,來進行測試。

選擇一個論壇系統(tǒng)也許不錯,VBB吧,用的比較多,也比較流行。模擬訪問就用Apache自身提供的AB來做。

測試系統(tǒng)的最小環(huán)境就是:(五臺機器)

            1 x Apache + PHP
1 x AB
1 x Mysql Proxy + Mysql Auth Server
2 x Mysql Real Server

          

參考資料

第九節(jié)的幻燈片可以在 http://www.netsock.org/mysqlha/mysql-ha.ppt 得到

最新版本的源代碼可以在 http://www.netsock.org/mysqlha/mysql-proxy_0.0.4.zip 得到

安裝說明可以參考 http://netsock.org/bbs/showthread.php?threadid=5

一個sql-bench的運行結果可以在 http://netsock.org/bbs/showthread.php?threadid=9 得到

關于作者
徐超,任職于TOM.COM北京公司,從事網(wǎng)絡系統(tǒng)技術支持及系統(tǒng)維護工作。業(yè)余時間致力于以NetSocket技術為基礎的網(wǎng)絡應用的開發(fā)。開發(fā)網(wǎng)站: http://netsock.org/bbs/ 目前正在開發(fā)的項目包括:SocketChat, MySQL-HA-Proxy, Php Session Server

[轉] 基于MySQL的數(shù)據(jù)庫集群系統(tǒng)的實現(xiàn)


更多文章、技術交流、商務合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 我要看欧美一级毛片 | 亚洲毛片大全 | 四虎4hutv永久地址公告 | 亚洲精品欧美精品一区二区 | 免费一级毛片视频 | 成人a毛片在线看免费全部播放 | 久久国产精品自在自线 | 尤物福利在线 | 国产成人午夜精品影院游乐网 | 国内视频一区二区 | 国产精品欧美一区二区在线看 | 一级特黄女人生活片 | 毛片欧美| 亚洲激情小视频 | 久久最新免费视频 | 狠狠躁夜夜躁人人爽天天段 | 日日做日日摸夜夜爽 | 久久这里只有精品免费的 | 女人国产香蕉久久精品 | 欧美在线观看一区二区 | 热久久久久久 | 91在线观 | 91精品国产乱码在线观看 | 国产欧美一区二区三区免费看 | 夜夜操操操 | 国产日韩欧美综合 | 天天se天天cao| 成人午夜影视全部免费看 | 一级毛片成人午夜 | 精品在线视频播放 | 精品国产亚一区二区三区 | 欧美久久精品 | 国产精品亚洲成在人线 | 四虎影视8848a四虎在线播放 | 久久一区二区三区精品 | 欧美精品成人一区二区在线观看 | 国产精品一区二区国产 | 日本亚洲精品久久 | 欧美色欧美亚洲高清在线视频 | 国内精品区一区二区三 | 久久99国产精品亚洲 |