MySql數(shù)據(jù)庫從同步負載均衡實時備份描述
如果你對MySql數(shù)據(jù)庫主從同步負載均衡實時的備份,的實際操作步驟感到很是很郁悶時。你就可以瀏覽下面的文章了,我在一個信譽度很好的網(wǎng)站找到一個關(guān)于MySql數(shù)據(jù)庫主從同步負載均衡實時的備份的實際操作。供大家分享。
最近將四臺MySQL數(shù)據(jù)庫服務(wù)器配置成主從模式以實現(xiàn)一定的負載均衡,好象還可以接受,至少現(xiàn)在沒有出什么大問題。
MySQL同步機制基于master把所有對數(shù)據(jù)庫的更新、刪除 等)都記錄在二進制日志里。因此,想要啟用同步機制,在master就必須啟用二進制日志。每個slave接受來自master上在二進制日志中記錄的更新操作,因此在slave上執(zhí)行了這個操作的一個拷貝。應(yīng)該非常重要地意識到,二進制日志只是從啟用二進制日志開始的時刻才記錄更新操作的。所有的slave必須在啟用二進制日志時把master上已經(jīng)存在的數(shù)據(jù)拷貝過來。如果運行同步時slave上的數(shù)據(jù)和master上啟用二進制日志時的數(shù)據(jù)不一致的話,那么slave同步就會失敗。
把master上的數(shù)據(jù)拷貝過來的方法之一實在slave上執(zhí)行 LOAD DATA FROM MASTER 語句。不過要注意,LOAD DATA FROM MASTER 是從MySQL 4.0.0之后才開始可以用的,而且只支持master上的 MyISAM 類型表。同樣地,這個操作需要一個全局的讀鎖,這樣的話傳送日志到slave的時候在master上就不會有更新操作了。
當實現(xiàn)了自由鎖表熱備份時(在MySQL 5.0中),全局讀鎖就沒必要了。由于有這些限制,因此我們建議只在master上相關(guān)數(shù)據(jù)比較小的時候才執(zhí)行 LOAD DATA FROM MASTER 語句,或者在master上允許一個長時間的讀鎖。由于每個系統(tǒng)之間 LOAD DATA FROM MASTER 的速度各不一樣,一個比較好的衡量規(guī)則是每秒能拷貝1MB數(shù)據(jù)。這只是的粗略的估計,不過master和slave都是奔騰700MHz的機器且用100MBit/s網(wǎng)絡(luò)連接時就能達到這個速度了。
slave上已經(jīng)完整拷貝master數(shù)據(jù)后,就可以連接到master上然后等待處理更新了。如果master當機或者slave連接斷開,slave會定期嘗試連接到master上直到能重連并且等待更新。重試的時間間隔由 –master-connect-retry 選項來控制,它的默認值是60秒。每個slave都記錄了它關(guān)閉時的日志位置。msater是不知道有多少個slave連接上來或者哪個slave從什么時候開始更新。
MySQL數(shù)據(jù)庫同步功能由3個線程(master上1個,slave上2個)來實現(xiàn)。執(zhí)行 START SLAVE 語句后,slave就創(chuàng)建一個I/O線程。I/O線程連接到master上,并請求master發(fā)送二進制日志中的語句。master創(chuàng)建一個線程來把日志的內(nèi)容發(fā)送到slave上。這個線程在master上執(zhí)行 SHOW PROCESSLIST 語句后的結(jié)果中的 Binlog Dump 線程便是。
slave上的I/O線程讀取master的 Binlog Dump 線程發(fā)送的語句,并且把它們拷貝到其數(shù)據(jù)目錄下的中繼日志(relay logs)中。第三個是SQL線程,salve用它來讀取中繼日志,然后執(zhí)行它們來更新數(shù)據(jù)。如上所述,每個mster/slave上都有3個線程。每個master上有多個線程,它為每個slave連接都創(chuàng)建一個線程,每個slave只有I/O和SQL線程。
在MySQL 4.0.2以前,同步只需2個線程(master和slave各一個)。slave上的I/O和SQL線程合并成一個了,它不使用中繼日志。slave上使用2個線程的優(yōu)點是,把讀日志和執(zhí)行分開成2個獨立的任務(wù)。執(zhí)行任務(wù)如果慢的話,讀日志任務(wù)不會跟著慢下來。
例如,如果slave停止了一段時間,那么I/O線程可以在slave啟動后很快地從master上讀取全部日志,盡管SQL線程可能落后I/O線程好幾的小時。如果slave在SQL線程沒全部執(zhí)行完就停止了,但I/O線程卻已經(jīng)把所有的更新日志都讀取并且保存在本地的中繼日志中了,因此在slave再次啟動后就會繼續(xù)執(zhí)行它們了。這就允許在master上清除二進制日志,因為slave已經(jīng)無需去master讀取更新日志了。執(zhí)行 SHOW PROCESSLIST 語句就會告訴我們所關(guān)心的master和slave上發(fā)生的情況。 下面我們來具體配置
1. 在主服務(wù)器上為從服務(wù)器建立一個用戶:
grant replication slave on *.* to ‘用戶名‘@’主機’ identified by ‘密碼’; (在MySQL 數(shù)據(jù)庫4 dot 0.2以前,用 FILE 權(quán)限來代替 REPLICATION SLAVE)
如果打算在slave上執(zhí)行 LOAD TABLE FROM MASTER 或 LOAD DATA FROM MASTER 語句,那么必須給該帳戶授予附加權(quán)限:
授予全局 SUPER 和 RELOAD 權(quán)限。
授予對想要加載的所有表上的 SELECT 權(quán)限。在master上任何沒有 SELECT 權(quán)限的表都會被 LOAD DATA FROM MASTER 略過。
2. 編輯主服務(wù)器的配置文件:/etc/my.cnf
server-id = 1
log-bin
binlog-do-db=需要備份的數(shù)據(jù)庫名,如果備份多個數(shù)據(jù)庫,重復(fù)設(shè)置這個選項即可
binlog-ignore-db=不需要備份的數(shù)據(jù)庫苦命,如果備份多個數(shù)據(jù)庫,重復(fù)設(shè)置這個選項即可
3. 編輯從服務(wù)器的配置文件:/etc/my.cnf
server-id=2 (配置多個從服務(wù)器時依次設(shè)置id號)
master-host=主機
master-user=用戶名
master-password=密碼
master-port=端口
replicate-do-db=需要備份的數(shù)據(jù)庫名,如果備份多個數(shù)據(jù)庫,重復(fù)設(shè)置這個選項即可
記得先手動同步一下主從服務(wù)器中要備份的數(shù)據(jù)庫,然后重啟主,從服務(wù)器。
要驗證主從設(shè)置是否已經(jīng)成功,可以登錄從服務(wù)器輸入如下命令:
- mysql> show slave status\G
得到的列表會有類似下面的數(shù)據(jù):
- Slave_IO_State: Waiting for master to send event
- Slave_IO_Running: Yes
- Slave_SQL_Running: Yes
如果后面兩個選項不全是Yes,那就說明你前面某個步驟配置錯了。
如果你的設(shè)置是正確的,嘗試在主服務(wù)器上插入若干條記錄,然后你再轉(zhuǎn)到從服務(wù)器,會發(fā)現(xiàn)相應(yīng)的新記錄已經(jīng)自動同步過來了。
如果你的主從服務(wù)器已經(jīng)配置好了,那么你在應(yīng)用程序中,只要保證所有的insert/delete/update操作是在主服務(wù)器上進行的,那么相應(yīng)的數(shù)據(jù)變化會自動同步到從服務(wù)器上,這樣,我們就可以把select操作分擔(dān)到多臺從數(shù)據(jù)庫上,從而降低服務(wù)器的載荷。
如果你想使用復(fù)制數(shù)據(jù)文件的方式來備份數(shù)據(jù)庫,只要在從服務(wù)器上的mysql數(shù)據(jù)庫命令行先鍵入slave stop;然后復(fù)制數(shù)據(jù)庫文件,復(fù)制好了,再在mysql命令行鍵入slave start;啟動從服務(wù)器,這樣就即備份了數(shù)據(jù)有保證了數(shù)據(jù)完整性,而且整個過程中主服務(wù)器的mysql無需停止。
提示:如果修改了主服務(wù)器的配置,記得刪除從服務(wù)器上的master.info文件。否則從服務(wù)器使用的還是老配置,可能會導(dǎo)致錯誤。
注意:關(guān)于要復(fù)制多個數(shù)據(jù)庫時,binlog-do-db和replicate-do-db選項的設(shè)置,如果要備份多個數(shù)據(jù)庫,只要重復(fù)設(shè)置相應(yīng)選項就可以了。
比如:
- binlog-do-db=a
- bbinlog-do-db=b
- replicate-do-db=a
- replicate-do-db=b
補充:
在從服務(wù)器上使用show slave status
Slave_IO_Running,為No,則說明IO_THREAD沒有啟動,請執(zhí)行slave start [IO_THREAD]
Slave_SQL_Running為No則復(fù)制出錯,查看Last_error字段排除錯誤后執(zhí)行slave start [SQL_THREAD]
【編輯推薦】