MySQL基於二進制日誌的主從複製

1、什麼是MySQL的主從複製?html

      MySQL能夠將一個數據庫設置爲主庫,另外一個數據庫設置爲該主庫的從庫,當主庫發生了變動,會同步到從庫中。MySQL的主從架構,能夠是星型的,也能夠是線型的。mysql

     星型架構:sql

     

        線型架構:docker

    

         

         因爲主從複製的延遲問題,星型架構比線型架構更經常使用。下文中的應用主要是以星型架構爲例。數據庫

2、MySQL主從複製的方式centos

       MySQL的複製能夠分爲基於二進制日誌的複製和基於事務(GTID)的複製,基於二進制日誌的複製方式,又能夠分爲基於行(ROW)的二進制日誌複製方式,和基於語句(STATEMENT)的二進制日誌複製方式。那麼這些複製方式有什麼區別呢?bash

      基於語句的二進制日誌複製,主庫將變動SQL語句以及上下文記錄到二進制日誌中,這樣的話,若是SQL語句中有不肯定值的函數,例如uuid(),在從庫中執行執行相同的SQL語句可能會致使不一樣的變動結果。如今來看一下基於語句的二進制日誌,臨時設置二進制日誌格式爲statement:set session binlog_format=statement,在庫中插入一條數據:insert into novel values(4, '杯雪')。查看產生的二進制日誌:mysqlbinlog --no-defaults mysql-bin.000002,日誌以下所示:session

     

     基於行的二進制日誌複製,主庫是將每行的變動數據記錄到二進制日誌中,在從庫中直接是對每行數據進行修改,而不用在從庫中執行SQL語句,這樣會更高效,而且不會致使主從數據不一致的問題。不過,這樣會致使二進制日誌比較大。下面是基於ROW的二進制日誌:架構

      

    上面的兩種二進制日誌複製方式,須要指定是哪一個二進制日誌以及相應的偏移量,來進行增量同步,若是指定錯誤會形成遺漏或者重複。函數

    GTID方式,本文暫不討論,後續會補上。

3、MySQL複製的原理

     

  • 主庫發生變動,將變動事件記錄到二進制日誌中
  • 從庫啓動一個I/O線程,該線程和主庫創建一個鏈接,並在主庫上啓動一個二進制轉儲線程,用於讀取主庫中的二進制日誌事件,從庫的I/O線程將接收到的二進制日誌事件寫到中繼日誌中。
  • 從庫的SQL線程從中繼日誌中讀取事件,並更新從庫。

 4、基於行的二進制日誌的主從複製方式實例

  • 準備MySQL環境:
  1. 在win10,以管理員的身份啓動docker,啓動一個centos6.7容器:

            docker run --name cnt-centos-mysql-w -itd  87de1d39ef43 /bin/bash

         2. 在容器中安裝並配置mysql,參考http://www.javashuo.com/article/p-omyniwxi-cq.html

         3. docker commit cfb8dfa6ddd8  centos-mysql,將安裝mysql後的容器保存爲一個鏡像。

         4. 用上述centos-mysql鏡像,啓動三個容器實例,做爲一主二從:

            Master:docker run --name cnt-centos-mysql-master -itd -p 7000:22 centos-mysql /bin/bash

            Slave1:ocker run --name cnt-centos-mysql-slave1 -itd  -p 7001:22 centos-mysql /bin/bash

            Slave2:docker run --name cnt-centos-mysql-slave2 –itd –p 7002:22 centos-mysql /bin/bash

         5. 在主庫建立一個數據庫,建立表,插入數據

            在啓動mysql服務的時候,若是報「」,能夠嘗試使用rm -fr /var/lib/mysql/*這個命令來解決,從新初始化數據庫。

           

  • 配置主庫,vi /etc/my.cnf

          

  • 配置從庫

          

  •  將主庫的初始數據,初始化到從庫中

          備份主數據庫:

          

          將備份腳本拷貝到從庫中:

          

         初始化從庫:

         

  • 在主庫上創建複製用戶並受權:

          創建對應網段的複製用戶:

          

         給repl用戶授予複製權限:

         

  • 在從庫上配置複製鏈路:

          

         其中,master_log_file的取值,來自備份的腳本,以下:

         

        啓動複製鏈路,並查看複製鏈路轉態信息:

        

  • 測試

          在主庫中插入數據:

          

          查詢從庫,能夠看到剛插入的數據已經從主庫同步到從庫中了:

          

相關文章
相關標籤/搜索