mysql主從同步

mysql複製的原理:html

Mysql內建的複製功能是構建大型,高性能應用程序的基礎。將Mysql的數據分佈到多個系統上去,這種分佈的機制,是經過將Mysql的某一臺主機的數據複製到其它主機(slaves)上,並從新執行一遍來實現的。複製過程當中一個服務器充當主服務器,而一個或多個其它服務器充當從服務器。主服務器將更新寫入二進制日誌文件,並維護文件的一個索引以跟蹤日誌循環。這些日誌能夠記錄發送到從服務器的更新。當一個從服務器鏈接主服務器時,它通知主服務器從服務器在日誌中讀取的最後一次成功更新的位置。從服務器接收從那時起發生的任何更新,而後封鎖並等待主服務器通知新的更新。mysql

mysql支持哪些複製sql

 1--基於語句的複製: 在主服務器上執行的SQL語句,在從服務器上執行一樣的語句。MySQL默認採用基於語句的複製,效率比較高。一旦發現無法精確複製時,會自動選着基於行的複製。 
 2--基於行的複製:把改變的內容複製過去,而不是把命令在從服務器上執行一遍. 從mysql5.0開始支持
 3--混合類型的複製: 默認採用基於語句的複製,一旦發現基於語句的沒法精確的複製時,就會採用基於行的複製。數據庫

Mysql複製能解決的問題
    1--數據分佈 (Data distribution )
    2--負載平衡(load balancing)
    3--數據備份(Backups) ,保證數據安全
    4--高可用性和容錯行(High availability and failover)
    5--實現讀寫分離,緩解數據庫壓力vim

Mysql主從複製原理
     master服務器將數據的改變記錄二進制binlog日誌,當master上的數據發生改變時,則將其改變寫入二進制日誌中;salve服務器會在必定時間間隔內對master二進制日誌進行探測其是否發生改變,若是發生改變,則開始一個I/OThread請求master二進制事件,同時主節點爲每一個I/O線程啓動一個dump線程,用於向其發送二進制事件,並保存至從節點本地的中繼日誌中,從節點將啓動SQL線程從中繼日誌中讀取二進制日誌,在本地重放,使得其數據和主節點的保持一致,最後I/OThread和SQLThread將進入睡眠狀態,等待下一次被喚醒。緩存

注意幾點:
     1--master將操做語句記錄到binlog日誌中,而後授予slave遠程鏈接的權限(master必定要開啓binlog二進制日誌功能;一般爲了數據安全考慮,slave也開啓binlog功能)。
     2--slave開啓兩個線程:IO線程和SQL線程。其中:IO線程負責讀取master的binlog內容到中繼日誌relay log裏;SQL線程負責從relay log日誌裏讀出binlog內容,並更新到slave的數據庫裏,這樣就能保證slave數據和master數據保持一致了。
     3--Mysql複製至少須要兩個Mysql的服務,固然Mysql服務能夠分佈在不一樣的服務器上,也能夠在一臺服務器上啓動多個服務。
     4--Mysql複製最好確保master和slave服務器上的Mysql版本相同(若是不能知足版本一致,那麼要保證master主節點的版本低於slave從節點的版本)
     5--master和slave兩節點間時間需同步安全

Mysql複製的流程圖以下:bash

 

如上圖所示:
     Mysql複製過程的第一部分就是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上並行操做。服務器

主從複製條件

1)開啓Binlog功能
2)主庫要創建帳號
3)從庫要配置master.info(CHANGE MASTER to...至關於配置密碼文件和Master的相關信息)
4)start slave 開啓複製功能
  
須要瞭解的:
1)3個線程,主庫IO,從庫IO和SQL及做用
2)master.info(從庫)做用
3)relay-log 做用
4)異步複製
5)binlog做用(若是須要級聯須要開啓Binlog)

 

master上的操做:併發

1)設置master數據庫的my.cnf文件(在[mysqld]配置區域添加下面內容)

[root@master ~] # vim /usr/local/mysql/my.cnf
.......
server- id =1         #數據庫惟一ID,主從的標識號絕對不能重複。
log-bin=mysql-bin      #開啓bin-log,並指定文件目錄和文件名前綴
binlog- do -db=******      #須要同步的數據庫。若是是多個同步庫,就以此格式另寫幾行便可。若是不指明對某個具體庫同步,就去掉此行,表示同步全部庫(除了ignore忽略的庫)。
binlog-ignore-db=mysql   #不一樣步mysql系統數據庫。若是是多個不一樣步庫,就以此格式另寫幾行;也能夠在一行,中間逗號隔開。
sync_binlog = 1       #確保binlog日誌寫入後與硬盤同步
binlog_checksum = none   #跳過現有的採用checksum的事件,mysql5.6.5之後的版本中binlog_checksum=crc32,而低版本都是binlog_checksum=none
binlog_format = mixed    #bin-log日誌文件格式,設置爲MIXED能夠防止主鍵重複。
    
--------------------------------------------------------------------------------
舒適提示:在主服務器上最重要的二進制日誌設置是sync_binlog,這使得mysql在每次提交事務的時候把二進制日誌的內容同步到磁盤上,即便服務器崩潰也會把事件寫入日誌中。
sync_binlog這個參數是對於MySQL系統來講是相當重要的,他不只影響到Binlog對MySQL所帶來的性能損耗,並且還影響到MySQL中數據的完整性。對於 "sync_binlog" 參數的各類設置的說明以下:
sync_binlog=0,當事務提交以後,MySQL不作fsync之類的磁盤同步指令刷新binlog_cache中的信息到磁盤,而讓Filesystem自行決定何時來作同步,或者cache滿了以後才同步到磁盤。
sync_binlog=n,當每進行n次事務提交以後,MySQL將進行一次fsync之類的磁盤同步指令來將binlog_cache中的數據強制寫入磁盤。
     
在MySQL中系統默認的設置是sync_binlog=0,也就是不作任何強制性的磁盤刷新指令,這時候的性能是最好的,可是風險也是最大的。由於一旦系統Crash,在binlog_cache中的全部binlog信息都會被丟失。而當設置爲「1」的時候,是最安全可是性能損耗最大的設置。由於當設置爲1的時候,即便系統Crash,也最多丟失binlog_cache中未完成的一個事務,對實際數據沒有任何實質性影響。
     
從以往經驗和相關測試來看,對於高併發事務的系統來講,「sync_binlog」設置爲0和設置爲1的系統寫入性能差距可能高達5倍甚至更多。
 
導出master數據庫中的數據,而後導入到slave數據庫中。保證雙方在同步環境實現前的數據一致。
導出數據庫以前先鎖定數據庫
mysql> flush tables with  read  lock;     #數據庫只讀鎖定命令,防止導出數據庫的時候有數據寫入。unlock tables命令解除鎖定
 
導出master數據庫(master數據庫的root用戶登錄密碼:123456)
   [root@master ~] # mysql -uroot -p123456  < /opt/backup.sql
   [root@master ~] # scp /opt/backup.sql  192.168.10.202:/opt/   #將導出的sql文件上傳到slave機器上
    
3)設置數據同步權限
   mysql> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'syncuser'@'192.168.10.%' IDENTIFIED BY '123456';
   Query OK, 0 rows affected (0.02 sec)
   mysql> flush privileges;
   Query OK, 0 rows affected (0.00 sec)
 
--------------------------------------------------------------------------------
舒適提示:
權限查看方式
mysql> show grants;
mysql> show grants  for  slave@ '182.148.1115.237' ;
--------------------------------------------------------------------------------
 
4)查看主服務器master狀態(注意File與Position項,從服務器須要這兩項參數)
mysql> show master status;

 

 下面是slave數據庫上的操做

1)設置slave數據庫的my.cnf配置文件

[root@master ~] # vim /usr/local/mysql/my.cnf
.......
server- id =2    #設置從服務器id,必須於主服務器不一樣
log-bin=mysql-bin    #啓動MySQ二進制日誌系統
replicate- do -db=******   #須要同步的數據庫名。若是不指明同步哪些庫,就去掉這行,表示全部庫的同步(除了ignore忽略的庫)。
replicate-ignore-db=mysql   #不一樣步mysql系統數據庫
slave-skip-errors = all    #跳過全部的錯誤錯誤,繼續執行復制操做
    
-----------------------------------------------------------------------------------------------
舒適提示:
當只針對某些庫的某張表進行同步時,以下,只同步huanqiu庫的haha表和huanpc庫的heihei表:
replicate- do -db = huanqiu
replicate-wild- do -table = huanqiu.haha        // 當只同步幾個或少數表時,能夠這樣設置。注意這要跟上面的庫指定配合使用;
replicate- do -db = huanpc
replicate-wild- do -table = huanpc.heihei       // 若是同步的庫的表比較多時,就不能這樣一一指定了,就把這個選項配置去掉,直接根據指定的庫進行同步。
-----------------------------------------------------------------------------------------------
    
2)在slave數據庫中導入從master傳過來的數據。
  # mysql -uroot -p123456  < /opt/backup.sql
    
3)配置主從同步指令
mysql> stop slave;   #執行同步前,要先關閉slave
mysql> CHANGE MASTER TO    MASTER_HOST='192.168.10.201',MASTER_USER='syncuser',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000007',MASTER_LOG_POS=120;
    
mysql> start slave;
mysql> show slave status \G;

如上,當IO和SQL線程的狀態均爲Yes,則表示主從已實現同步了!

 

參考:https://www.cnblogs.com/kevingrace/p/6256603.html

相關文章
相關標籤/搜索