程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> mysql(master/slave)主從復制道理及設置裝備擺設圖文詳解

mysql(master/slave)主從復制道理及設置裝備擺設圖文詳解

編輯:MySQL綜合教程

mysql(master/slave)主從復制道理及設置裝備擺設圖文詳解。本站提示廣大學習愛好者:(mysql(master/slave)主從復制道理及設置裝備擺設圖文詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是mysql(master/slave)主從復制道理及設置裝備擺設圖文詳解正文


1 復制概述

      Mysql內建的復制功效是構建年夜型,高機能運用法式的基本。將Mysql的數據散布到多個體系上去,這類散布的機制,是經由過程將Mysql的某一台主機的數據復制到其它主機(slaves)上,偏重新履行一遍來完成的。復制進程中一個辦事器充任主辦事器,而一個或多個其它辦事器充任從辦事器。主辦事器將更新寫入二進制日記文件,並保護文件的一個索引以跟蹤日記輪回。這些日記可以記載發送到從辦事器的更新。當一個從辦事器銜接主辦事器時,它告訴主辦事器從辦事器在日記中讀取的最初一次勝利更新的地位。從辦事器吸收從那時起產生的任何更新,然後封閉並期待主辦事器告訴新的更新。

請留意當你停止復制時,一切對復制中的表的更新必需在主辦事器長進行。不然,你必需要當心,以免用戶對主辦事器上的表停止的更新與對從辦事器上的表所停止的更新之間的抵觸。

1.1 mysql支撐的復制類型:

  (1):基於語句的復制:  在主辦事器上履行的SQL語句,在從辦事器上履行異樣的語句。MySQL默許采取基於語句的復制,效力比擬高。  
            一旦發明沒法准確復制時,   會主動選著基於行的復制。    
  (2):基於行的復制:把轉變的內容復制曩昔,而不是把敕令在從辦事器上履行一遍. 從mysql5.0開端支撐
  (3):混雜類型的復制: 默許采取基於語句的復制,一旦發明基於語句的沒法准確的復制時,就會采取基於行的復制。

 1.2 . 復制處理的成績

         MySQL復制技巧有以下一些特色:
         (1)    數據散布 (Data distribution )
         (2)    負載均衡(load balancing)
         (3)    備份(Backups) 
         (4)    高可用性和容錯行 High availability and failover 

  1.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上並行操作。

 2 .復制設置裝備擺設

有兩台MySQL數據庫辦事器Master和slave,Master為主辦事器,slave為從辦事器,初始狀況時,Master和slave中的數據信息雷同,當Master中的數據產生變更時,slave也隨著產生響應的變更,使得master和slave的數據信息同步,到達備份的目標。

要點:
擔任在主、從辦事器傳輸各類修正舉措的序言是主辦事器的二進制變革日記,這個日記記錄著須要傳輸給從辦事器的各類修正舉措。是以,主辦事器必需激活二進制日記功效。從辦事器必需具有足以讓它銜接主辦事器並要求主辦事器把二進制變革日記傳輸給它的權限。
        
情況:
Master和slave的MySQL數據庫版本同為5.0.18
操作體系:unbuntu 11.10
IP地址:10.100.0.100

2.1、創立復制帳號

1、在Master的數據庫中樹立一個備份帳戶:每一個slave應用尺度的MySQL用戶名和暗碼銜接master。停止復制操作的用戶會授與REPLICATION SLAVE權限。用戶名的暗碼都邑存儲在文本文件master.info中

敕令以下:
mysql > GRANT REPLICATION SLAVE,RELOAD,SUPER ON *.* 
TO backup@'10.100.0.200' 
IDENTIFIED BY ‘1234';

樹立一個帳戶backup,而且只能許可從10.100.0.200這個地址下去上岸,暗碼是1234。

(假如由於mysql版本新舊暗碼算法分歧,可以設置:set password for 'backup'@'10.100.0.200'=old_password('1234'))

2.2、拷貝數據

(假設是你完整新裝置mysql主從辦事器,這個一步就不須要。由於新裝置的master和slave有雷同的數據)

關停Master辦事器,將Master中的數據拷貝到B辦事器中,使得Master和slave中的數據同步,而且確保在全體設置操作停止前,制止在Master和slave辦事器中停止寫操作,使得兩數據庫中的數據必定要雷同!

2.3、設置裝備擺設master

接上去對master停止設置裝備擺設,包含翻開二進制日記,指定獨一的servr ID。例如,在設置裝備擺設文件參加以下值:

server-id=1
log-bin=mysql-bin

server-id:為主辦事器A的ID值
log-bin:二進制變革日值

重啟master,運轉SHOW MASTER STATUS,輸入以下:


2.4、設置裝備擺設slaveSlave的設置裝備擺設與master相似,你異樣須要重啟slave的MySQL。以下:
log_bin           = mysql-bin
server_id         = 2
relay_log         = mysql-relay-bin
log_slave_updates = 1
read_only         = 1
server_id是必需的,並且獨一。slave沒有需要開啟二進制日記,然則在一些情形下,必需設置,例如,假如slave為其它slave的master,必需設置bin_log。在這裡,我們開啟了二進制日記,並且顯示的定名(默許稱號為hostname,然則,假如hostname轉變則會湧現成績)。
relay_log設置裝備擺設中繼日記,log_slave_updates表現slave將復制事宜寫進本身的二進制日記(前面會看到它的用途)。
有些人開啟了slave的二進制日記,卻沒有設置log_slave_updates,然後檢查slave的數據能否轉變,這是一種毛病的設置裝備擺設。所以,盡可能應用read_only,它避免轉變數據(除特別的線程)。然則,read_only並是很適用,特殊是那些須要在slave上創立表的運用。

2.5、啟動slave接上去就是讓slave銜接master,並開端重做master二進制日記中的事宜。你不該該用設置裝備擺設文件停止該操作,而應當應用CHANGE MASTER TO語句,該語句可以完整代替對設置裝備擺設文件的修正,並且它可認為slave指定分歧的master,而不須要停滯辦事器。以下:

mysql> CHANGE MASTER TO MASTER_HOST='server1',

    -> MASTER_USER='repl',

    -> MASTER_PASSWORD='p4ssword',

    -> MASTER_LOG_FILE='mysql-bin.000001',

    -> MASTER_LOG_POS=0;

MASTER_LOG_POS的值為0,由於它是日記的開端地位。

你可以用SHOW SLAVE STATUS語句檢查slave的設置能否准確:

mysql> SHOW SLAVE STATUS\G

*************************** 1. row ***************************

             Slave_IO_State:

                Master_Host: server1

                Master_User: repl

                Master_Port: 3306

              Connect_Retry: 60

            Master_Log_File: mysql-bin.000001

        Read_Master_Log_Pos: 4

             Relay_Log_File: mysql-relay-bin.000001

              Relay_Log_Pos: 4

      Relay_Master_Log_File: mysql-bin.000001

           Slave_IO_Running: No

          Slave_SQL_Running: No

                             ...omitted...

      Seconds_Behind_Master: NULL


Slave_IO_State, Slave_IO_Running, 和Slave_SQL_Running是No

注解slave還沒有開端復制進程。日記的地位為4而不是0,這是由於0只是日記文件的開端地位,其實不是日記地位。現實上,MySQL曉得的第一個事宜的地位是4。

為了開端復制,你可以運轉:

mysql> START SLAVE;

運轉SHOW SLAVE STATUS檢查輸入成果:

mysql> SHOW SLAVE STATUS\G

*************************** 1. row ***************************

             Slave_IO_State: Waiting for master to send event

                Master_Host: server1

                Master_User: repl

                Master_Port: 3306

              Connect_Retry: 60

            Master_Log_File: mysql-bin.000001

        Read_Master_Log_Pos: 164

             Relay_Log_File: mysql-relay-bin.000001

              Relay_Log_Pos: 164

      Relay_Master_Log_File: mysql-bin.000001

           Slave_IO_Running: Yes

          Slave_SQL_Running: Yes

                             ...omitted...

      Seconds_Behind_Master: 0


在這裡重要是看:
                   Slave_IO_Running=Yes
                   Slave_SQL_Running=Yes

slave的I/O和SQL線程都曾經開端運轉,並且Seconds_Behind_Master不再是NULL。日記的地位增長了,意味著一些事宜被獲得並履行了。假如你在master長進行修正,你可以在slave上看到各類日記文件的地位的變更,異樣,你也能夠看到數據庫中數據的變更。

你可檢查master和slave上線程的狀況。在master上,你可以看到slave的I/O線程創立的銜接:

在master上輸出show processlist\G;

mysql> show processlist \G

*************************** 1. row ***************************

     Id: 1

   User: root

   Host: localhost:2096

     db: test

Command: Query

   Time: 0

 State: NULL

   Info: show processlist

*************************** 2. row ***************************

     Id: 2

   User: repl

   Host: localhost:2144

     db: NULL

Command: Binlog Dump

   Time: 1838

 State: Has sent all binlog to slave; waiting for binlog to be updated

   Info: NULL

2 rows in set (0.00 sec)

行2為處置slave的I/O線程的銜接。

在slave辦事器上運轉該語句:

mysql> show processlist \G

*************************** 1. row ***************************

     Id: 1

   User: system user

   Host:

     db: NULL

Command: Connect

   Time: 2291

 State: Waiting for master to send event

   Info: NULL

*************************** 2. row ***************************

     Id: 2

   User: system user

   Host:

     db: NULL

Command: Connect

   Time: 1852

 State: Has read all relay log; waiting for the slave I/O thread to update it

   Info: NULL

*************************** 3. row ***************************

     Id: 5

   User: root

   Host: localhost:2152

     db: test

Command: Query

   Time: 0

 State: NULL

   Info: show processlist

3 rows in set (0.00 sec)

行1為I/O線程狀況,行2為SQL線程狀況。

2.5、添加新slave辦事器

假設master曾經運轉良久了,想對新裝置的slave停止數據同步,乃至它沒有master的數據。
此時,有幾種辦法可使slave從另外一個辦事開端,例如,從master拷貝數據,從另外一個slave克隆,從比來的備份開端一個slave。Slave與master同步時,須要三樣器械:
(1)master的某個時辰的數據快照;
(2)master以後的日記文件、和生成快照時的字節偏移。這兩個值可以叫做日記文件坐標(log file coordinate),由於它們肯定了一個二進制日記的地位,你可以用SHOW MASTER STATUS敕令找到日記文件的坐標;
(3)master的二進制日記文件。

可以經由過程以下幾中辦法來克隆一個slave:
(1)    冷拷貝(cold copy)
停滯master,將master的文件拷貝到slave;然後重啟master。缺陷很顯著。
(2)    熱拷貝(warm copy)
假如你僅應用MyISAM表,你可使用mysqlhotcopy拷貝,即便辦事器正在運轉。
(3)    應用mysqldump
應用mysqldump來獲得一個數據快照可分為以下幾步:
<1>鎖表:假如你還沒有鎖表,你應當對表加鎖,避免其它銜接修正數據庫,不然,你獲得的數據可所以紛歧致的。以下:
mysql> FLUSH TABLES WITH READ LOCK;
<2>在另外一個銜接用mysqldump創立一個你想停止復制的數據庫的轉儲:
shell> mysqldump --all-databases --lock-all-tables >dbdump.db
<3>對表釋放鎖。
mysql> UNLOCK TABLES;

3、深刻懂得復制曾經評論辯論了關於復制的一些根本器械,上面深刻評論辯論一下復制。

3.1、基於語句的復制(Statement-Based Replication)     MySQL 5.0及之前的版本僅支撐基於語句的復制(也叫做邏輯復制,logical replication),這在數據庫其實不罕見。master記載下轉變數據的查詢,然後,slave從中繼日記中讀取事宜,並履行它,這些SQL語句與master履行的語句一樣。
這類方法的長處就是完成簡略。另外,基於語句的復制的二進制日記可以很好的停止緊縮,並且日記的數據量也較小,占用帶寬少——例如,一個更新GB的數據的查詢僅須要幾十個字節的二進制日記。而mysqlbinlog關於基於語句的日記處置非常便利。
 
      然則,基於語句的復制其實不是像它看起來那末簡略,由於一些查詢語句依附於master的特定前提,例如,master與slave能夠有分歧的時光。所以,MySQL的二進制日記的格局不只僅是查詢語句,還包含一些元數據信息,例如,以後的時光戳。即便如斯,照樣有一些語句,好比,CURRENT USER函數,不克不及准確的停止復制。另外,存儲進程和觸發器也是一個成績。
     別的一個成績就是基於語句的復制必需是串行化的。這請求年夜量特別的代碼,設置裝備擺設,例如InnoDB的next-key鎖等。其實不是一切的存儲引擎都支撐基於語句的復制。

3.2、基於記載的復制(Row-Based Replication)      MySQL增長基於記載的復制,在二進制日記中記載下現實數據的轉變,這與其它一些DBMS的完成方法相似。這類方法有長處,也出缺點。長處就是可以對任何語句都能准確任務,一些語句的效力更高。重要的缺陷就是二進制日記能夠會很年夜,並且不直不雅,所以,你不克不及應用mysqlbinlog來檢查二進制日記。
關於一些語句,基於記載的復制可以或許更有用的任務,如:
mysql> INSERT INTO summary_table(col1, col2, sum_col3)
    -> SELECT col1, col2, sum(col3)
    -> FROM enormous_table
    -> GROUP BY col1, col2;
     假定,只要三種獨一的col1和col2的組合,然則,該查詢會掃描原表的很多行,卻僅前往三筆記錄。此時,基於記載的復制效力更高。
    另外一方面,上面的語句,基於語句的復制更有用:
 mysql> UPDATE enormous_table SET col1 = 0;
此時應用基於記載的復制價值會異常高。因為兩種方法不克不及對一切情形都能很好的處置,所以,MySQL 5.1支撐在基於語句的復制和基於記載的復制之前靜態交流。你可以經由過程設置session變量binlog_format來停止掌握。

3.3、復制相干的文件除二進制日記和中繼日記文件外,還有其它一些與復制相干的文件。以下:

(1)mysql-bin.index辦事器一旦開啟二進制日記,會發生一個與二日記文件同名,然則以.index開頭的文件。它用於跟蹤磁盤上存在哪些二進制日記文件。MySQL用它來定位二進制日記文件。它的內容以下(我的機械上):

 (2)mysql-relay-bin.index該文件的功效與mysql-bin.index相似,然則它是針對中繼日記,而不是二進制日記。內容以下:
.\mysql-02-relay-bin.000017
.\mysql-02-relay-bin.000018

(3)master.info保留master的相干信息。不要刪除它,不然,slave重啟後不克不及銜接master。內容以下(我的機械上):

 I/O線程更新master.info文件,內容以下(我的機械上):

 

.\mysql-02-relay-bin.000019

254

mysql-01-bin.000010

286

0

52813

 (4)relay-log.info 包括slave中以後二進制日記和中繼日記的信息。

3.4、發送復制事宜到其它slave當設置log_slave_updates時,你可讓slave飾演其它slave的master。此時,slave把SQL線程履行的事宜寫停止本身的二進制日記(binary log),然後,它的slave可以獲得這些事宜並履行它。以下:

 

3.5、復制過濾(Replication Filters)復制過濾可讓你只復禮服務器中的一部門數據,有兩種復制過濾:在master上過濾二進制日記中的事宜;在slave上過濾中繼日記中的事宜。以下:


4、復制的經常使用拓撲構造復制的系統構造有以下一些根本准繩:
(1)    每一個slave只能有一個master;
(2)    每一個slave只能有一個獨一的辦事器ID;
(3)    每一個master可以有許多slave;
(4)    假如你設置log_slave_updates,slave可所以其它slave的master,從而分散master的更新。

MySQL不支撐多主辦事器復制(Multimaster Replication)——即一個slave可以有多個master。然則,經由過程一些簡略的組合,我們卻可以樹立靈巧而壯大的復制系統構造。

4.1、單一master和多slave由一個master和一個slave構成復制體系是最簡略的情形。Slave之間其實不互相通訊,只能與master停止通訊。以下:

 假如寫操作較少,而讀操作很時,可以采用這類構造。你可以將讀操作散布到其它的slave,從而減小master的壓力。然則,當slave增長到必定數目時,slave對master的負載和收集帶寬都邑成為一個嚴重的成績。
這類構造固然簡略,然則,它卻異常靈巧,足夠知足年夜多半運用需求。一些建議:
(1)    分歧的slave飾演分歧的感化(例如應用分歧的索引,或許分歧的存儲引擎);
(2)    用一個slave作為備用master,只停止復制;
(3)    用一個長途的slave,用於災害恢復;


4.2、自動形式的Master-Master(Master-Master in Active-Active Mode)Master-Master復制的兩台辦事器,既是master,又是另外一台辦事器的slave。如圖:

自動的Master-Master復制有一些特別的用途。例如,地輿上散布的兩個部門都須要本身的可寫的數據正本。這類構造最年夜的成績就是更新抵觸。假定一個表只要一行(一列)的數據,其值為1,假如兩個辦事器分離同時履行以下語句:
在第一個辦事器上履行:
mysql> UPDATE tbl SET col=col + 1;
在第二個辦事器上履行:
mysql> UPDATE tbl SET col=col * 2;
那末成果是若干呢?一台辦事器是4,另外一個辦事器是3,然則,這其實不會發生毛病。
現實上,MySQL其實不支撐其它一些DBMS支撐的多主辦事器復制(Multimaster Replication),這是MySQL的復制功效很年夜的一個限制(多主辦事器的難點在於處理更新抵觸),然則,假如你其實有這類需求,你可以采取MySQL Cluster,和將Cluster和Replication聯合起來,可以樹立壯大的高機能的數據庫平台。然則,可以經由過程其它一些方法來模仿這類多主辦事器的復制。

4.3、自動-主動形式的Master-Master(Master-Master in Active-Passive Mode)這是master-master構造變更而來的,它防止了M-M的缺陷,現實上,這是一種具有容錯和高可用性的體系。它的分歧點在於個中一個辦事只能停止只讀操作。如圖:

 4.4、帶從辦事器的Master-Master構造(Master-Master with Slaves)這類構造的長處就是供給了冗余。在地輿上散布的復制構造,它不存在單一節點毛病成績,並且還可以將讀密集型的要求放到slave上。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved