Mysql Replication系列之原理及配置

ew3y 9年前發布 | 16K 次閱讀 MySQL 數據庫服務器

       mysql的復制(replication)是一個異步的復制從一個mysql instace(master)復制到另一個mysql instace(slave)。實現整個復制操作主要有三個線程完成的,其中兩個線程在slave(SQL_thread和IO_thread),另外一個線程在master(IO_thread)上。

        Replication的原理如圖所示:

      

        具體步驟:

        1. Master接收用戶的請求,進行相磁的寫操作后生成MySQL binlog;
        2.Slave會啟動兩個線程,一個IO_thread,一個SQL_thread。IO_thread連接到Master上后會告訴Master我需要那個binlog及binlog positition之后的日志;
        3.Master接收到來自Slave的IO_thread進程的請求后,通過負責復制的IO_thread根據請求信息讀取指定日志指定位置之后的日志信息,返回給Slave 的IO_thread。返回信息中除了日志所包含的信息之外,還包括本次返回的信息已經到Master端的bin-log文件的名稱以及bin-log的位置;
        4.Slave的IO_thread接收到信息后,為了必避免機器故障,日志丟失,將接收到的日志內容依次添加到Slave端的relay-log文件的最末端,并將讀取到的Master端的 bin-log的文件名和位置記錄到master-info文件中,以便在下一次讀取的時候能夠清楚的告訴Master“我需要從某個bin-log的哪個位置開始往后的日志內容,請發給我”;
        5. Slave上SQL_thread讀取本的relay-log從中讀到了變化過程或是SQL在進行執行,執行后的結果寫入Slave上的數據文件中;


      Master_Log_File,Read_Master_Log_Pos 記錄了IO thread讀到的當前master binlog文 件和位置, 對應master的binlog文件和位置。
      Relay_Log_File,Relay_Log_Pos記錄了SQL thread執行到relay log的那個文件和位置,對應的是slave上的relay log文件和位置。
      Relay_Master_Log_File,Exec_Master_Log_Pos記錄的是SQL thread執行到master binlog的文件和位置,對應的master上binlog的文件和位置。

Mysql Replication是基于binlog來完成的,那么我就需要認識一下binlog。

        1.MySQL日志的格式(實際生產中基本都是ROW,建議你用MIXED):
            Binlog_format=STATEMENT|ROW|MIXED
                STATEMENT : 基于操作的SQL語句記錄到binlog中。
                ROW: 基于行的變更情況記錄,會記錄行變更前的樣子及變更后的內容。
                MIXED: 混后使用ROW和STATEMENT格式。對于DDL記錄會STATEMENT,對于TABLE
                注意:如果使用Innodb表,事務級別使用了 READ COMMITTED or READ UNCOMMITTED日志級別只能使用row格式。但在使用ROW格式中DDL語句還是會記錄來STATEMENT格式。
               基于SQL語句的復制(statement-based replication, SBR),基于行的復制(row-based replication,RBR),混合模式復制(mixed-based replication,MBR)。

          ROW:
              優點:
                  1.數據庫變更采用行模式記錄
                  2.slave上數據很少會不一致
                  3.任何情況都可以被復制,這對復制來說是最安全可靠的
                  4.和其他大多數數據庫系統的復制技術一樣
                  5.多數情況下,從服務器上的表如果有主鍵的話,復制就會快了很多
                  6.復制以下幾種語句時的行鎖更少:
                      a.INSERT ... SELECT
                      b. 包含 AUTO_INCREMENT 字段的 INSERT
                      c. 沒有附帶條件或者并沒有修改很多記錄的 UPDATE 或 DELETE 語句
                 7.執行 INSERT,UPDATE,DELETE 語句時鎖更少
                 8.從服務器上采用多線程來執行復制成為可能
            缺點:
                1.binlog 大了很多
                2.復雜的回滾時 binlog 中會包含大量的數據
                3.主服務器上執行 UPDATE 語句時,所有發生變化的記錄都會寫到 binlog 中,而 SBR 只會寫一次,這會導致頻繁發生 binlog 的并發寫問題
                4.UDF 產生的大 BLOB 值會導致復制變慢
                5.無法從 binlog 中看到都復制了寫什么語句
                6.當在非事務表上執行一段堆積的SQL語句時,最好采用 SBR 模式,否則很容易導致主從服務器的數據不一致情況發生
          STATEMENT:
             優點:
                1.歷史悠久,技術成熟
                2.binlog文件較小
                3.binlog中包含了所有數據庫更改信息,可以據此來審核數據庫的安全等情況
                4.binlog可以用于實時的還原,而不僅僅用于復制
                5.主從版本可以不一樣,從服務器版本可以比主服務器版本高
            缺點:
                1.不是所有的UPDATE語句都能被復制,尤其是包含不確定操作的時候。
                2.調用具有不確定因素的 UDF 時復制也可能出問題
                3.使用以下函數的語句也無法被復制:
                    a.LOAD_FILE()
                    b.UUID()
                    c.USER()
                    d.FOUND_ROWS()
                    e.SYSDATE() (除非啟動時啟用了 --sysdate-is-now 選項)
                4.INSERT ... SELECT 會產生比 RBR 更多的行級鎖
                5.復制需要進行全表掃描(WHERE 語句中沒有使用到索引)的 UPDATE 時,需要比 RBR 請求更多的行級鎖
                6.對于有 AUTO_INCREMENT 字段的 InnoDB表而言,INSERT 語句會阻塞其他 INSERT 語句
                7.對于一些復雜的語句,在從服務器上的耗資源情況會更嚴重,而 RBR 模式下,只會對那個發生變化的記錄產生影響
                8.存儲函數(不是存儲過程)在被調用的同時也會執行一次 NOW() 函數,這個可以說是壞事也可能是好事
                9.確定了的 UDF 也需要在從服務器上執行
               10.數據表必須幾乎和主服務器保持一致才行,否則可能會導致復制出錯
               11.執行復雜語句如果出錯的話,會消耗更多資源
       MIXED:
             Mixed: 是以上兩種level的混合使用,一般的語句修改使用statment格式保存binlog,如一些函數,statement無法完成主從復制的操作,則采用row格式保binlog,MySQL會根據執行的每一條具體的sql語句來區分對待記錄的日志形式,也就是在Statement和Row之間選擇一種.新版本的MySQL中隊row level模式也被做了優化,并不是所有的修改都會以row level來記錄,像遇到表結構變更的時候就會以statement模式來記錄。至于update或者delete等修改數據的語句,還是會記錄所有行的變更。

說了這么多,我們現在就來動手配置一個主從吧(只是在學習環境里用)

     1.部署環境整理:

</tr>

</tr>

</tr> </tbody> </table>     2.找到master上的log及position生成change master to語句:         a.在主庫通過show master status,可以查看到log以及position
        b.在從庫執行change master to master_host='192.168.11.128',master_port=3306, master_user='repl', master_password='repl', master_log_file='mysql-bin.000001', master_log_pos=253;
        c.start slave;
        d.show slave status\G;Slave_IO_Running, Slave_SQL_Running都是YES,說明從庫已配置成功
        e.主庫上利用show processlist看看有沒有同步的進程Command : Binlog Dump說明主庫已配置成功
        f.在主庫隨便創建一個數據庫(表),然后在從庫看看是否復制過來啦。

 本文由用戶 ew3y 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!
角色 Ip:port Server-id 必備條件
Master 192.168.11.20:3306 203306 a.啟用log-bin;
b.主庫上創建復制用戶(grant replication slave on *.* to 'repl'@'%' identified by 'repl';)
Slav 192.168.11.21:3306 213306  
  • sesese色