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