標籤:blog http io os ar 使用 sp 檔案 資料
內容轉自:http://blog.sina.com.cn/s/blog_4e424e2101000c1z.html;http://blog.sina.com.cn/s/blog_4e424e2101000c20.html
MySQL支援單向、非同步複製,複製過程中一個伺服器充當主伺服器,而一個或多個其它伺服器充當從伺服器。主伺服器將 更新寫入二進位記錄檔,並維護記錄檔的一個索引以追蹤記錄檔迴圈。當一個從伺服器串連到主伺服器時,它通知主伺服器從伺服器在日誌中讀取的最後一次成功更新的位置。從伺服器接收從那時起發生的任何更新,然後封鎖並等待主伺服器通知 下一次更新。
為什麼使用主從複製?
1、主伺服器/從伺服器設定增加了健壯性。主伺服器出現問題時,你可以切換到從伺服器進行恢複。
2、通過在主伺服器和從伺服器之間切分處理客戶查詢的負荷,可以得到更好的客戶回應時間。但是不要同時在主從伺服器上進行更新,這樣可能引起衝突。
3、使用複製的另一個好處是可以使用一個從伺服器執行備份,而不會干擾主伺服器。在備份過程中主伺服器可以繼續處理更新。
主從複製的原理:
MySQL使用3個線程來執行複製功能(其中1個在主伺服器上,另2個在從伺服器上)。
第1個線程:當發出START SLAVE時,從伺服器建立一個I/O線程,以串連主伺服器並讓主伺服器發送二進位日誌。
第2個線程: 主伺服器建立一個線程將二進位日誌中的內容發送到從伺服器。從伺服器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
binlog-do-db = testdb #用於master-slave模式的資料庫
如果沒有提供那些選項,應添加它們並重啟伺服器。
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語句。
轉:Mysql使用主從複製機制(replication)