mysql複製在業界裏有叫:mysql同步,ab複製等。專業名稱就是叫:複製。複製是單向的異步複製,從一個Mysql(Master)複製到另外一個Mysql(Slave)。實現整個主從複製,須要由Master服務器上的IO進程,和Salve服務器上的Sql進程和IO進程共同完成。mysql
要實現主從複製,首先必須打開Master端的二進制日誌(bin-log)功能,由於整個Mysql複製過程實際上就是Slave從Master端獲取相應的二進制日誌文件,而後在根據相應的Position號在本身Slave端徹底的執行日誌中所記錄的各類操做,(二進制日誌文件是用sql語句寫成的因此能夠直接在Slave機上直接執行)。sql
主從複製的基本過程以下:數據庫
一、Mysql Slave端的IO進程連接上Master,向Master請求指定日誌文件的指定位置(或者從最開始的日誌)以後的日誌內容;vim
二、Master接受來自Slave的IO進程的請求後,負責複製的IO進程根據Slave的請求信息,讀取相應日誌內容,返回給Slave 的IO進程。並將本次請求讀取的bin-log文件名及位置一塊兒返回給Slave端。安全
三、Slave的IO進程接受到信息後,將接受到的日誌內容寫入relay-log文件中,並將讀取到的Master端的二進制日誌文件名後Position號記錄在Master-info文件中,下次根據記錄的日誌文件名和Position號從Master上繼續複製。以確保數據的一致性。服務器
四、Slave的Sql進程檢測到relay-log中新增長的內容後,會立刻解析relay-log的內容,並在自身執行。多線程
這種傳統的複製方法因爲在Master端是多線程寫入的,而在Slave端是單線程的複製,每每會形成很高的延遲,同時在配置的時候須要找到binlog和pos點,而後change master to指向,不是頗有經驗的運維,每每會找錯,形成主從同步複製報錯。而從Mysql5.6開始支持的gtid模式的主從複製從而很大程度上解決了這些問題。架構
TID:Transaction ID,事務的ID號:也就是說在mysql複製中每個事務都有本身的ID號(隨機數)運維
GTID:Global Transaction ID,全局事務ID,在整個事務架構中每個事務ID號是全局惟一的,不止是在一個節點上而是整個主從複製架構中每任何兩個事務的ID號都不會相同。是mysql對寫入二進制日誌的每一個事務所做的標記。由server_uuid和事務id組成。異步
簡單來說GTID可以保證讓一個從服務器到其餘的從服務器那裏實現數據複製並且可以實現數據整合的。一個事務對應一個惟一ID,一個GTID在一個服務器上只會執行一次,相對於行復制來說數據安全性更高,故障切換更簡單。
GTID也有它的限制,不支持非事務引擎;不支持create table … select 語句複製;不容許在一個SQL同時更新一個事務引擎和非事務引擎的表; 在一個複製組中,必需要求統一開啓CTID或是關閉GTID,開啓DTID後,就不在使用原來的傳統的複製方式,對於createtemporary table 和drop temporary table語句不支持,不支持sqlslaveskip_counter。
Mysql是默認是異步複製、Master在將事件寫入binlon時不知道Slave是否已經接受,此時Master宕機的,Slave可能會丟失事務。在這中狀況下咱們能夠採用半同步複製,即一個線程在Master上提交事務將受到阻塞,直到得知一個已開啓半同步複製功能的Slave已收到此事務的全部事件,或等待超時。
如下是mysql主從複製的一些簡單配置
傳統ab複製(mysql版本爲rhel6.5自帶的mysql):
在master主機上:
vim /etc/my.cnf server-id=1 log-bin=mysql-bin #啓動二進制日誌系統 /etc/init.d/mysqld restart cd /var/lib/mysql
能夠經過mysqlbinlog指令來插看二進制日誌文件
建立同步賬戶,並給予權限
mysql -p mysql> GRANT REPLICATION SLAVE ON *.* TO example@'172.25.254.3' IDENTIFIED BY 'Westos+123' ;
查看master狀態
show master status;
記錄File和Position的值,在slave配置時會用到。
在slave主機上
查看可否遠程登錄master主機的mysql
mysql -h 172.25.254.2 -uexample -pWestos+123
vim /etc/my.cnf server-id=2 #從服務器ID號,不要和主ID相同也不要與其餘從服務器相同 /etc/init.d/mysqld restart mysql -p mysql> change master to -> master_host='172.25.254.2', #指定主服務器ip地址 -> master_user='example', #指定在主服務器上能夠進行同步的用戶名 -> master_password='Westos+123', #同步用戶的密碼 -> master_log_file='mysql-bin.000003', #上面看到的master的日誌文件 -> master_log_pos=1007; #master機的position值 mysql> start slave; #開啓同步 mysql> show slave status\G #查看slave狀態
看到如下兩個yes就表示同步開啓成功
Slave_IO_Running: Yes Slave_SQL_Running: Yes
咱們能夠經過slave狀態中的延遲時間是否爲0和pos號是否與master主機一致來查看同步是否完成。
。。。 Seconds_Behind_Master: 0 Exec_Master_Log_Pos: 1007 。。。
Mysql的GTID複製:(mysql爲5.7社區版)
在Master主機上:
vim /etc/my.cnf server-id=1 log-bin=mysql-bin gtid-mode=on #開啓gtid enforce-gtid-consistency=on #強制GTID的一致性 /etc/init.d/mysqld restart mysql -p mysql> GRANT REPLICATION SLAVE ON *.* TO example@'172.25.254.3' IDENTIFIED BY 'Westos+123' ;
在slave主機上
vim /etc/my.cnf server-id=2 log-slave-updates #更新是否記入日誌,當slave主機做爲master主機是必需要有 gtid-mode=on enforce-gtid-consistency=on slave-parallel-type=LOGICAL_CLOCK #MySQL 5.6的多線程同步僅在有多個數據庫時纔有明顯的性能提高,MySQL 5.7.2以後,能夠經過配置slave-parallel-type爲LOGICAL_CLOCK來避開這個限制. slave-parallel-workers=16 #從服務器的SQL線程數,一個數據庫同一時間只能有一個worker線程來進行工做。master_info_repository=TABLE #主服信息記錄庫=表/文件relay_log_info_repository=TABLE #中繼日誌信息記錄庫relay_log_recovery=ON #在CRASH後自動放棄全部未執行的relay-log,而且從新從MASTER獲取日誌;保證relay-log的完整 /etc/init.d/mysqld restart mysql -p mysql> change master to -> master_host='172.25.254.2', -> master_user='example', -> master_password='Westos+123', -> master_auto_position=1; mysql> start slave; mysql> show processlist; #能夠看到開啓了多個線程
這樣簡單的配置就完成了,檢測的方法就是在Master主機上建立一個數據庫看Slave機上是否會同步。