mysql主從複製概述以及配置mysql5.7.10實現簡單主從複製

  1. 什麼是主從複製:

    通過將Mysql的某一臺主機的 數據複製到其它主機,複製過程中一個服務器充當主服務器(master),而一個或多個其它服務器充當從服務器(slave)。進行復制時,所有對數據表的寫操作必須在主服務器上進行。否則,因爲主服務器不會同步從服務器的數據,會導致主從數據不一致的問題。mysql的主從複製功能是構建高性能大型應用服務器的基礎


  2. 主從複製的作用:

    1.輔助實現數據的備份

    2.實現數據服務的高可用和異地容災

    3.實現多個服務器分攤負載


  3. 主從複製的實現原理:

    實現整個複製過程主要由三個線程來完成,其中slave端兩個線程(Sql線程和IO線程) ,master端一個線程(IO線程)

    1.master將數據庫改變的記錄到二進制日誌(binary log)中

    2.slave的IO線程向master請求二進制日誌中的事件

    3.master服務器的IO線程將slave服務器的IO線程請求的數據相應給對方

    4.slave的IO線程接收到數據並依次寫入到中繼日誌裏面

    5.slave的SQL線程檢測到中繼日誌發生改變,解析出master發生改變執行的sql語句並在自身執行一遍


  4. 主從複製類別:

    1.基於語句的複製:每一條會修改數據的語句都會記錄到master的二進制中。slave在複製的時候SQL線程會解析成和原來master端執行過的相同的語句來再次執行

     優點:不需要記錄每一行數據的變化,減少二進制日誌量,節約了IO成本,提高了性能。

     缺點:由於他是記錄的執行語句,所以,爲了讓這些語句在slave端也能正確執行,那麼他還必須記錄每條語句在執行的時候的一些相關信息,也就是上下文信息,以保證所有語句在slave端杯執行的時候能夠得到和在master端執行時候相同的結果。當master的某個SQL語句中執行了一些特殊函數,再複製到slave來執行可能會導致值不一樣。例如:master表中的某個字段了插入一條select now();的執行結果,當這條語句再複製到slave上去執行的時候,結果數據就無法被正確複製。


    2.基於行的複製:二進制日誌中會記錄成每一行數據被修改的形式,然後在slave端再對相同的數據進行修改。

      優點:二進制日誌中可以不記錄執行的sql語句的上下文相關的信息,僅僅只需要記錄那一條記錄被修改了,修改成什麼樣了。所以RowLevel的日誌內容會非常清楚的記錄下每一行數據修改的細節,非常容易理解。而且不會出現某些特定情況下的存儲過程,或函數,以及觸發器的調用和觸發無法被正確複製的問題

      缺點:所有的執行的語句當記錄到BinaryLog中的時候,都將以每行記錄的修改來記錄,這樣可能會產生大量的日誌內容,比如有這樣一條update語句:update user_info set sal=15000 where user_id >= 3,執行之後,日誌中記錄的不是這條update語句所對應的事件(MySQL以事件的形式來記錄BinaryLog日誌),而是這條語句所更新的每一條記錄的變化情況,這樣就記錄成很多條記錄被更新的很多個事件,增加了IO負擔。


    3.混合方式:基於語句+基於行的混合方式 中和了前兩種方式的優缺點,是一種相對比較理想的複製方式

    mysql的這個複製級別也就是通過配置二進制日誌的記錄格式來決定的。


  5. mysql主從複製配置:

    環境說明:

     master和slave數據初始都是沒有數據的

     master:

      操作系統:centos6.7

      mysql版本:mysql5.7.10

      主機地址:192.168.1.223

     slave:

      操作系統:centos6.7

        mysql版本:mysql5.7.10

        主機地址:192.168.1.222


     1.master端配置工作

       啓動二進制日誌
       選擇一個唯一的server-id

          vi /etc/my.cnf
           log-bin=/mydata/binlogs/master-bin  
           binlog_format=mixed
            server-id = 2

       重啓mysql服務    

          service mysqld restart

       登錄mysql創建具有複製權限的用戶

         mysql -uroot -p 'password’
         grant replication slave on *.* to repuser@'192.168.1.222' identified by 'password'; 
         flush privileges;

      2.slave端配置工作

        修改server-id
        啓用中繼日誌

            vi /etc/my.cnf
           server-id = 11
            relay-log = /mydata/relaylogs/relay-bin
             log-bin=OFF

        重啓mysql服務 

         service mysqld restart

        登錄mysql連接主服務器

         mysql -uroot -p 'password’
         change master to master_host='192.168.1.223',master_user='repuser',master_password='password'

        查看slave工作狀態     

         show slave status \G;

 *************************** 1. row ***************************
               Slave_IO_State:
                  Master_Host: 192.168.1.223
                  Master_User: repuser
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File:
          Read_Master_Log_Pos: 4
               Relay_Log_File: relay-bin.000001
                Relay_Log_Pos: 4
        Relay_Master_Log_File:
             Slave_IO_Running: No            #現在io線程處於關閉狀態
            Slave_SQL_Running: No           #sql線程也處於關閉狀態
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 0
              Relay_Log_Space: 154
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 0
                  Master_UUID:
             Master_Info_File: /mydata/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State:
           Master_Retry_Count: 86400
                  Master_Bind:
      Last_IO_Error_Timestamp:
     Last_SQL_Error_Timestamp:
               Master_SSL_Crl:
           Master_SSL_Crlpath:
           Retrieved_Gtid_Set:
            Executed_Gtid_Set:
                Auto_Position: 0
         Replicate_Rewrite_DB:
                 Channel_Name:
           Master_TLS_Version:


      啓動複製:

        start slave;


 6.驗證主從配置結果:

    登錄主服務器創建一個數據庫

       mysql -uroot -p'password'
       create database two_db;
       show databases;

    wKiom1bhcsyjNzRCAAA_M4XFpW0303.png


  登錄slave服務器查看是否已同步

    wKioL1bhcyWD52KuAAAxXhuKxS8012.png

至此mysql簡單主從複製基本完成



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章