1. 程式人生 > >備份策略四、使用主從複製機制(replication)

備份策略四、使用主從複製機制(replication)

MySQL支援單向、非同步複製,複製過程中一個伺服器充當主伺服器,而一個或多個其它伺服器充當從伺服器。主伺服器將更新寫入二進位制日誌檔案,並維護日誌檔案的一個索引以跟蹤日誌迴圈。當一個從伺服器連線到主伺服器時,它通知主伺服器從伺服器在日誌中讀取的最後一次成功更新的位置。從伺服器接收從那時起發生的任何更新,然後封鎖並等待主伺服器通知下一次更新。

為什麼使用主從複製?

1、主伺服器/從伺服器設定增加了健壯性。主伺服器出現問題時,你可以切換到從伺服器作為備份。

2、通過在主伺服器和從伺服器之間切分處理客戶查詢的負荷,可以得到更好的客戶響應時間。但是不要同時在主從伺服器上進行更新,這樣可能引起衝突。

3、使用複製的另一個好處是可以使用一個從伺服器執行備份,而不會干擾主伺服器。在備份過程中主伺服器可以繼續處理更新。

MySQL使用3個執行緒來執行復制功能(其中1個在主伺服器上,另兩個在從伺服器上。當發出START SLAVE時,從伺服器建立一個I/O執行緒,以連線主伺服器並讓主伺服器傳送二進位制日誌。主伺服器建立一個執行緒將二進位制日誌中的內容傳送到從伺服器。從伺服器I/O執行緒讀取主伺服器Binlog Dump執行緒傳送的內容並將該資料拷貝到從伺服器資料目錄中的本地檔案中,即中繼日誌。第3個執行緒是SQL執行緒,從伺服器使用此執行緒讀取中繼日誌並執行日誌中包含的更新。SHOW PROCESSLIST語句可以查詢在主伺服器上和從伺服器上發生的關於複製的資訊。

預設中繼日誌使用host_name-relay-bin.nnnnnn

形式的檔名,其中host_name是從伺服器主機名,nnnnnn是序列號。用連續序列號來建立連續中繼日誌檔案,從000001開始。從伺服器跟蹤中繼日誌索引檔案來識別目前正使用的中繼日誌。預設中繼日誌索引檔名為host_name-relay-bin.index。在預設情況,這些檔案在從伺服器的資料目錄中被建立。中繼日誌與二進位制日誌的格式相同,並且可以用mysqlbinlog讀取。當SQL執行緒執行完中繼日誌中的所有事件後,中繼日誌將會被自動刪除。

從伺服器在資料目錄中另外建立兩個狀態檔案--master.info和relay-log.info。狀態檔案儲存在硬碟上,從伺服器關閉時不會丟失。下次從伺服器啟動時,讀取這些檔案以確定它已經從主伺服器讀取了多少二進位制日誌,以及處理自己的中繼日誌的程度。

設定主從複製:

1、確保在主伺服器和從伺服器上安裝的MySQL版本相同,並且最好是MySQL的最新穩定版本。

2、在主伺服器上為複製設定一個連線賬戶。該賬戶必須授予REPLICATION SLAVE許可權。如果賬戶僅用於複製(推薦這樣做),則不需要再授予任何其它許可權。

mysql> GRANT REPLICATION SLAVE ON *.*

-> TO 'replication'@'%.yourdomain.com' IDENTIFIED BY 'slavepass';

3、執行FLUSH TABLES WITH READ LOCK語句清空所有表和塊寫入語句:

mysql> FLUSH TABLES WITH READ LOCK;

保持mysql客戶端程式不要退出。開啟另一個終端對主伺服器資料目錄做快照。

shell> cd /usr/local/mysql/

shell> tar -cvf /tmp/mysql-snapshot.tar ./data

如果從伺服器的使用者賬戶與主伺服器的不同,你可能不想複製mysql資料庫。在這種情況下,應從歸檔中排除該資料庫。你也不需要在歸檔中包括任何日誌檔案或者master.info或relay-log.info檔案。

當FLUSH TABLES WITH READ LOCK所置讀鎖定有效時(即mysql客戶端程式不退出),讀取主伺服器上當前的二進位制日誌名和偏移量值:

mysql > SHOW MASTER STATUS;

+---------------+----------+--------------+------------------+

| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+---------------+----------+--------------+------------------+

| mysql-bin.003 | 73   | test | manual,mysql  |

+---------------+----------+--------------+------------------+

File列顯示日誌名,而Position顯示偏移量。在該例子中,二進位制日誌值為mysql-bin.003,偏移量為73。記錄該值。以後設定從伺服器時需要使用這些值。它們表示複製座標,從伺服器應從該點開始從主伺服器上進行新的更新。

如果主伺服器執行時沒有啟用--logs-bin,SHOW MASTER STATUS顯示的日誌名和位置值為空。在這種情況下,當以後指定從伺服器的日誌檔案和位置時需要使用的值為空字串('')和4.

取得快照並記錄日誌名和偏移量後,回到前一中端重新啟用寫活動:

mysql> UNLOCK TABLES;

4、確保主伺服器主機上my.cnf檔案的[mysqld]部分包括一個log-bin選項。該部分還應有一個server-id=Master_id選項,其中master_id必須為1到232–1之間的一個正整數值。例如:

[mysqld]

log-bin

server-id=1

如果沒有提供那些選項,應新增它們並重啟伺服器。

5、停止從伺服器上的mysqld服務並在其my.cnf檔案中新增下面的行:

[mysqld]

server-id=2

slave_id值同Master_id值一樣,必須為1到232–1之間的一個正整數值。並且,從伺服器的ID必須與主伺服器的ID不相同。

6、將資料備據目錄中。確保對這些檔案和目錄的許可權正確。伺服器 MySQL執行的使用者必須能夠讀寫檔案,如同在主伺服器上一樣。

Shell> chown -R mysql:mysql /usr/local/mysql/data

7、啟動從伺服器。在從伺服器上執行下面的語句,用你的系統的實際值替換選項值:

mysql> CHANGE MASTER TO

->MASTER_HOST='master_host_name',

  ->MASTER_USER='replication_user_name',

->MASTER_PASSWORD='replication_password',

->MASTER_LOG_FILE='recorded_log_file_name',

->MASTER_LOG_POS=recorded_log_position;

8、啟動從伺服器執行緒:

mysql> START SLAVE;

執行這些程式後,從伺服器應連線主伺服器,並補充自從快照以來發生的任何更新。

9、如果出現複製錯誤,從伺服器的錯誤日誌(HOSTNAME.err)中也會出現錯誤訊息。

10、從伺服器複製時,會在其資料目錄中發現檔案master.info和HOSTNAME-relay-log.info。從伺服器使用這兩個檔案跟蹤已經處理了多少主伺服器的二進位制日誌。不要移除或編輯這些檔案,除非你確切知你正在做什麼並完全理解其意義。即使這樣,最好是使用CHANGE MASTER TO語句。