複製概述
Mysql內建的複製功能是構建大型,高性能應用程序的基礎。將Mysql的數據分佈到多個系統上去,這種分佈的機制,是通過將Mysql的某一臺主機的數據複製到其它主機(slaves)上,並重新執行一遍來實現的。複製過程中一個服務器充當主服務器,而一個或多個其它服務器充當從服務器。主服務器將更新寫入二進制日誌文件,並維護文件的一個索引以跟蹤日誌循環。這些日誌可以記錄發送到從服務器的更新。當一個從服務器連接主服務器時,它通知主服務器從服務器在日誌中讀取的最後一次成功更新的位置。從服務器接收從那時起發生的任何更新,然後封鎖並等待主服務器通知新的更新。
請注意當你進行復制時,所有對複製中的表的更新必須在主服務器上進行。否則,你必須要小心,以避免用戶對主服務器上的表進行的更新與對從服務器上的表所進行的更新之間的衝突。
1 mysql支持的複製類型:
(1):基於語句的複製: 在主服務器上執行的SQL語句,在從服務器上執行同樣的語句。MySQL默認採用基於語句的複製,效率比較高。
一旦發現沒法精確複製時, 會自動選着基於行的複製。
(2):基於行的複製:把改變的內容複製過去,而不是把命令在從服務器上執行一遍. 從mysql5.0開始支持
(3):混合類型的複製: 默認採用基於語句的複製,一旦發現基於語句的無法精確的複製時,就會採用基於行的複製。
2 . 複製解決的問題
MySQL複製技術有以下一些特點:
(1) 數據分佈 (Data distribution )
(2) 負載平衡(load balancing)
(3) 備份(Backups)
(4) 高可用性和容錯行 High availability and failover
3 複製如何工作
整體上來說,複製有3個步驟:
(1) master將改變記錄到二進制日誌(binary log)中(這些記錄叫做二進制日誌事件,binary log events);
(2) slave將master的binary log events拷貝到它的中繼日誌(relay log);
(3) slave重做中繼日誌中的事件,將改變反映它自己的數據。
下圖描述了複製的過程:
該過程的第一部分就是master記錄二進制日誌。在每個事務更新數據完成之前,master在二日誌記錄這些改變。MySQL將事務串行的寫入二進制日誌,即使事務中的語句都是交叉執行的。在事件寫入二進制日誌完成後,master通知存儲引擎提交事務。
下一步就是slave將master的binary log拷貝到它自己的中繼日誌。首先,slave開始一個工作線程——I/O線程。I/O線程在master上打開一個普通的連接,然後開始binlog dump process。Binlog dump process從master的二進制日誌中讀取事件,如果已經跟上master,它會睡眠並等待master產生新的事件。I/O線程將這些事件寫入中繼日誌。
SQL slave thread(SQL從線程)處理該過程的最後一步。SQL線程從中繼日誌讀取事件,並重放其中的事件而更新slave的數據,使其與master中的數據一致。只要該線程與I/O線程保持一致,中繼日誌通常會位於OS的緩存中,所以中繼日誌的開銷很小。
此外,在master中也有一個工作線程:和其它MySQL的連接一樣,slave在master中打開一個連接也會使得master開始一個線程。複製過程有一個很重要的限制——複製在slave上是串行化的,也就是說master上的並行更新操作不能在slave上並行操作。
複製配置
有兩臺MySQL數據庫服務器Master和slave,Master爲主服務器,slave爲從服務器,初始狀態時,Master和slave中的數據信息相同,當Master中的數據發生變化時,slave也跟着發生相應的變化,使得master和slave的數據信息同步,達到備份的目的。
要點:
負責在主、從服務器傳輸各種修改動作的媒介是主服務器的二進制變更日誌,這個日誌記載着需要傳輸給從服務器的各種修改動作。因此,主服務器必須激活二進制日誌功能。從服務器必須具備足以讓它連接主服務器並請求主服務器把二進制變更日誌傳輸給它的權限。
配置環境:
數據庫版本:MySQL-5.5.16
操作系統: redhat 5.10
在搭建主從服務器時,主,從 服務器的數據庫版本和數據庫的初始環境必須一致,即主服務器的MySQL什麼樣從MySQL就得是什麼樣的。 主,從服務器MySQL服務搭建完成以後,在主服務器上
1、創建複製帳號
1、在Master的數據庫中建立一個備份帳戶:每個slave使用標準的MySQL用戶名和密碼連接master。進行復制操作的用戶會授予REPLICATION SLAVE權限。用戶名的密碼都會存儲在文本文件master.info中
命令如下:
mysql > GRANT REPLICATION SLAVE ON *.* TO backup@’10.100.0.200’ IDENTIFIED BY ‘1234’;
建立一個帳戶backup,並且只能允許從10.100.0.200這個地址上來登陸,密碼是1234。只授權是從數據庫服務器,不授權其他權限
2,配置master
接下來對master進行配置,包括打開二進制日誌,指定唯一的servr ID。例如,在配置文件加入如下值:
vim /etv/my.cnf
[mysqld]
server-id=1
log-bin=mysql-bin
server-id=1 //爲主服務器A的ID值唯一的ID號
log-bin=master-bin //二進制日誌文件
log-bin-index=master-bin.index //二進制日誌索引文件
innodb-file-per-table=1
datadir= //如果數據目錄在其他分區這裏需要指定
sync-binlog = on //用於事務安全,主服務器事務一提交馬上寫入二進制日誌
啓動服務器,查看二進制日誌文件
MySQL> SHOW MASTER STATUS;
+------------------------+---------------+-----------------------+----------------------+
| file |position | binlog_do_db | binlog_ignore_db |
+------------------------+---------------+-----------------------+----------------------+
| master-bin.000001 | 399 | | |
+------------------------+----------------+-----------------------+----------------------+
1 row in set (0.00 sec)
二進制日誌從399開始是因爲主服務器做過授權,而從服務器不需要複製授權信息,所以要從399以後開始複製3.配
3.配置slave
Slave的配置與master類似,你同樣需要重啓slave的MySQL。如下:
vim /etv/my.cnf
log_bin = slave-bin //如果不在做其他從服務器的主服務器的話,就不要記錄二進制日誌
server_id = 11 //儘量寫的大一些方便以後改動
relay_log = slave-relay-bin
relay_log-index = slave-relay-bin.index
log_slave_updates = 1 //slave將複製事件寫進自己的二進制日誌
read_only = 1 //配置從服務器爲只讀的,爲安全考慮,爲中繼日誌
datadir= //數據存放目錄
4.啓動slave
接下來就是讓slave連接master,並開始重做master二進制日誌中的事件。你不應該用配置文件進行該操作,而應該使用CHANGE MASTER TO語句,該語句可以完全取代對配置文件的修改,而且它可以爲slave指定不同的master,而不需要停止服務器。如下:
mysql> CHANGE MASTER TO
-> MASTER_HOST='10.100.0.100', //可以是主機名也可以是主服務器的IP地址
-> MASTER_USER='backup', //授權用戶的用戶賬號
-> MASTER_PASSWORD='1234', //授權用戶的用戶密碼
-> MASTER_LOG_FILE='master-bin.000001', //使用的二進制日誌文件
-> MASTER_LOG_POS=399; //二進制日誌的複製開始位置
mysql>show slave status;
*************************** 1. row ***************************
Slave_IO_State:
Master_Host:10.100.0.100
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master-bin.000001
Read_Master_Log_Pos: 399
Relay_Log_File: slave-relay-bin.000001
Relay_Log_Pos: 4
Relay_Master_Log_File: master-bin.000001
Slave_IO_Running: No
Slave_SQL_Running: No
...omitted...
Seconds_Behind_Master: NULL
這倆項還是NO狀態,說明還沒有開始複製,這是要執行
MySQL>start slave;
*************************** 1. row ***************************
Slave_IO_State:
Master_Host:10.100.0.100
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master-bin.000001 //當前讀取的二進制日誌文件
Read_Master_Log_Pos: 399 //讀取二進制日誌的位置
Relay_Log_File: slave-relay-bin.000001
Relay_Log_Pos: 4
Relay_Master_Log_File: master-bin.000001
Slave_IO_Running: yes
Slave_SQL_Running:yes
...omitted...
Seconds_Behind_Master: NULL
slave的I/O和SQL線程都已經開始運行,而且Seconds_Behind_Master不再是NULL。日誌的位置增加了,意味着一些事件被獲取並執行了。如果你在master上進行修改,你可以在slave上看到各種日誌文件的位置的變化,同樣,你也可以看到數據庫中數據的變化。
還可以單獨啓動或關閉slave_io 和slave_sql
mysql >start slave io_thread;
mysql >stop slave io_thread;
mysql >start slave sql_thread;
mysql >stop slave sql_thread;
可查看master和slave上線程的狀態。在master上,你可以看到slave的I/O線程創建的連接:
在master和slave上輸入show processlist\G;
MySQL>show processlist\G;
從服務器上倆個重要的文件 master.info 和 relay-log.info
master.info 記錄了主服務的每次使用的二進制日誌文件及位置 ,主服務器的IP ,端口號 用戶名和密碼等信息
relay-log.info記錄了 realy-log正在使用的文件和主服務器二進制日誌文件及事件位置