1. 程式人生 > >實現mysql級聯復制

實現mysql級聯復制

mysql級聯復制

所謂級聯復制就是master服務器,只給一臺slave服務器同步數據,然後slave服務器在向後端的所有slave服務器同步數據,降低master服務器的寫壓力,和復制數據的網絡IO。

一,配置master服務器

1,修改主配置文件

    vim /etc/my.cnf
      在[mysql]配置塊下添加如下兩行配置
       [mysql]
       log_bin          #開啟二進制日誌功能
       server_id=1      #為當前節點設置一個全局惟一的ID號 

2,重啟mysql服務,使配置生效

    systemctl restart mairadb

3,創建有復制權限的用戶賬號

GRANT REPLICATION SLAVE  ON *.* TO ‘repluser‘@‘HOST‘ IDENTIFIED BY ‘replpass‘; 

    命令解析:
        ‘repluser‘@‘HOST‘ :設置用戶名即主機ip或網段,網段用%表示 例如10.0.0.%
        IDENTIFIED BY:設置密碼
        *.* :表示所有數據庫,所有表
        GRANT REPLCATION SLAVE:就是允許該用戶復制數據

    該命令作用就是授權repluser能拷貝數據庫的所有內容

二,中繼slave服務器配置

1,修改主配置文件

    vim /etc/my.cnf
   在[mysql]配置塊中添加如下兩行配置
        [mysqld]   
        log_bin
        server_id=2      #為當前節點設置一個全局惟一的ID號 
                read_only=ON #限制從服務器為只讀."註意:此限制對擁有SUPER權限的用戶均無效"
        log_slave_updates #該項的作用是把master服務器的二進制日誌計入到本機,然後再把二進制日誌復制給後端的其他slave服務器

2,重啟mysql服務,使配置生效

    systemctl  restart mariadb

3,使用有復制權限的用戶賬號連接至主服務器,並啟動復制線程

     CHANGE MASTER TO 
     MASTER_HOST=‘host‘,        #指定master主機IP
     MASTER_USER=‘repluser‘,    #指定master被授權的用戶名
     MASTER_PASSWORD=‘replpass‘,#指定被授權的用戶密碼 MASTER_LOG_FILE=‘mysql-bin.xxxxx‘, #指定從master服務器的那個二進制日誌開始復制
     MASTER_LOG_POS=#;          #二進制日誌位置,可以在master服務器上執行該命令查看,show master logs;

     啟動復制線程IO_THREAD和SQL_THREAD
     START SLAVE; 

4,查看中繼slave服務器狀態


    MariaDB [(none)]> start slave;
    Query OK, 0 rows affected (0.00 sec)

    MariaDB [(none)]> show slave status\G
    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: 192.168.68.7
                      Master_User: repluser
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: mariadb-bin.000001
              Read_Master_Log_Pos: 557
                   Relay_Log_File: mariadb-relay-bin.000002
                    Relay_Log_Pos: 843
            Relay_Master_Log_File: mariadb-bin.000001
                 Slave_IO_Running: Yes  "重點關註如果是NO表示線程沒起來"
                Slave_SQL_Running: Yes "重點關註 如果是NO表示該線程沒起來"
                  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: 557
                  Relay_Log_Space: 1139
                  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: 0 "該項表示同步時間 0表示即使同步"
    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: 1

三,後端slave配置

1,修改配置文件

    vim /etc/my.cnf
        在[mysql]配置塊中添加如下兩行配置
            [mysqld]   
            server_id=3     #為當前節點設置一個全局惟一的ID號
            read_only=ON #限制從服務器為只讀."註意:此限制對擁有SUPER權限的用戶均無效"

2,重啟mysql服務,使配置生效

    systemctl restart mariadb

3,使用有復制權限的用戶賬號連接至主服務器,並啟動復制線程

CHANGE MASTER TO 
     MASTER_HOST=‘中繼host‘,        #指定中繼slave主機IP
     MASTER_USER=‘repluser‘,    #指定master被授權的用戶名
     MASTER_PASSWORD=‘replpass‘,#指定被授權的用戶密碼 MASTER_LOG_FILE=‘mysql-bin.xxxxx‘, #指定從中繼slave服務器的那個二進制日誌開始復制
     MASTER_LOG_POS=#;          #二進制日誌位置,可以在slave服務器上執行該命令查看,show master logs;

     啟動復制線程IO_THREAD和SQL_THREAD
     START SLAVE; 

4,查看slave服務器狀態


    MariaDB [(none)]> start slave;
    Query OK, 0 rows affected (0.00 sec)

    MariaDB [(none)]> show slave status\G
    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: 192.168.68.17
                      Master_User: repluser
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: mariadb-bin.000001
              Read_Master_Log_Pos: 557
                   Relay_Log_File: mariadb-relay-bin.000002
                    Relay_Log_Pos: 843
            Relay_Master_Log_File: mariadb-bin.000001
                 Slave_IO_Running: Yes  "重點關註如果是NO表示線程沒起來"
                Slave_SQL_Running: Yes "重點關註 如果是NO表示該線程沒起來"
                  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: 557
                  Relay_Log_Space: 1139
                  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: 0 "該項表示同步時間 0表示即使同步"
    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: 1

5,最後在master服務器上創建數據庫測試即可查看是否同步

級聯復制特點

  • 降低master服務器的壓力,網絡io壓力
  • 但是會產生數據不一致的問題

總結

  • 中繼slave需要打開二進制日誌,必須加上log_slave_updates配置項
  • 註意read_only=ON作用,限制從服務器為只讀."註意:此限制對擁有SUPER權限的用戶均無效"

實現mysql級聯復制