1. 程式人生 > >實現mysql主主復制架構

實現mysql主主復制架構

實現mysql主主復制架構

實驗環境,假設公司想要對一臺運行了一段時間的mysql服務器,做一個主主復制架構,以提升數據庫的讀寫能力。







老服務器用M0表示
新服務器用M1表示

一,對M0服務器做一個全備份

    mysqldump -A -F -E -R --single-transaction --master-data=1 --flush-privileges --triggers --hex-blob > /mysqlbackup/all.sql

    命令解析:
        -A:備份所有數據庫,含create database語句

        -F:備份前滾動日誌,鎖定表完成後,執行flush logs命令,生成新的二進制日誌文件,配合-A時,會導致刷新多次數據庫,在同一時刻執行轉儲和日誌刷新,--single-transaction 之刷新一次二進制日誌
        --single-transaction :只刷新一次二進制日誌
        --flush-privileges: 備份mysql或相關時需要使用
        --triggers:備份表相關的觸發器,默認啟用,用--skiptriggers,不備份觸發器 
        --master-data=【1|2】:註意:此選項須啟用二進制日誌
         1:所備份的數據之前加一條記錄為CHANGE MASTER TO語 句,非註釋,不指定#,默認為1     
         2:記錄為註釋的CHANGE MASTER TO語句  此選項會自動關閉--lock-tables功能,自動打開--lock-alltables功能(除非開啟--single-transaction) 

二,查看當前備份位置


    [root@centos7 ~]# grep -i ^change*  /mysqlbackup/all.sql 
    CHANGE MASTER TO MASTER_LOG_FILE=‘mariadb-bin.000005‘, MASTER_LOG_POS=245;

    當前備份位置是mariadb-bin.000002的245,之前的所有內容都備份了

三,將全備份拷貝到M1服務器上

    scp /mysqlbackup/all.sql  192.168.68.17:/data/

四,修改M0服務器配置文件

    vim /etc/my.cnf
    在[mysqld]配置塊中添加如下配置
    [mysqld]
    server_id=0             #設置為當前節點設置一個全局惟一的ID號
    innodb_file_per_table #啟用數據庫儀表結構分離存放在兩個不同文件
    auto_increment_offset=1     #設置字段自動增長的起始值1
    auto_increment_increment=2  #增長的幅度為2
    log_bin                     #啟用二進制日誌

五,重啟M0的mysql服務,使配置生效

    systemctl restart mairadb

六,在M0上創建擁有復制權限的用戶賬號

    M0 [(none)]>GRANT REPLICATION SLAVE  ON *.* TO ‘repluser‘@‘HOST‘ IDENTIFIED BY ‘replpass‘; 

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

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

七,在M1上安裝mairadb

    yum install mairadb-server

八,修改M1配置文件

     vim /etc/my.cnf
        在[mysqld]配置塊中添加如下配置
        [mysqld]
        server_id=0             #設置為當前節點設置一個全局惟一的ID號
        innodb_file_per_table #啟用數據庫儀表結構分離存放在兩個不同文件
        auto_increment_offset=2    #設置字段自動增長的起始值2
        auto_increment_increment=2  #增長的幅度為2
        log_bin                     #啟用二進制日誌

九,啟動M1的mairadb服務

    systemctl restart mariadb

十,為了安全在M1執行下面的命令

    "mysql_secure_installation"

    第一項問你:輸入root密碼  回車即可,因為沒有
    第二項問你:需要設置root密碼麽,
    第三項問你:需要刪除空賬號用戶麽,
    第四項問你:禁止root用戶遠程登入麽,
    第五項問你:需要刪除test測試數據庫麽,
    第六項問你:現在重新加載權限表嗎 ,

十一,在M1上恢復備份數據

    登入mysql終端執行下面的命令

     M1 [(none)]>source /data/all.sql

十二,在M1上同樣也創建一個擁有復制權限的用戶賬號

     M1 [(none)]>GRANT REPLICATION SLAVE  ON *.* TO ‘repluser‘@‘HOST‘ IDENTIFIED BY ‘replpass‘; 

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

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

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

1,使用有復制權限的用戶賬號連接至主服務器

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

2,啟動復制線程IO_THREAD和SQL_THREAD

    M1 [(none)]>START SLAVE;

3,查看線程狀態


    M1 [(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.000005
              Read_Master_Log_Pos: 245
                   Relay_Log_File: mariadb-relay-bin.000002
                    Relay_Log_Pos: 843
            Relay_Master_Log_File: mariadb-bin.000005
                 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

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

1,使用有復制權限的用戶賬號連接至主服務器

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

2,啟動復制線程IO_THREAD和SQL_THREAD

     M0 [(none)]> START SLAVE; 

3,查看線程狀態


    M0 [(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: 55732
                   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

十五,同步測試,創建表查看自動增長字段兩邊是否沖突

1,在M0上創建一張測試表

   create table t1(id int unsigned primary key auto_increment,name varchar(30));

    該命令就是在test數據庫中創建一張名為t1,有兩個字段,一個字段是id,另一個是name,其中id是整數,而且是主鍵,並且還是自動增長,name字段是任意字符,字符長度只有30個

2,查看M1是否同步

    M1 [test]> show tables;
    +----------------+
    | Tables_in_test |
    +----------------+
    | t1             |
    +----------------+

3,在M1,test數據庫的t1表中插入兩條記錄

    MariaDB [test]> insert t1(name) values(‘wang‘);
    Query OK, 1 row affected (0.01 sec)

    MariaDB [test]> insert t1(name) values(‘li‘);
    Query OK, 1 row affected (0.02 sec)

    MariaDB [test]> select * from t1
        -> ;
    +----+------+
    | id | name |
    +----+------+
    |  2 | wang |
    |  4 | li        |
    +----+------+
    2 rows in set (0.00 sec)

    "註意:
    為什麽id是2,4呢,這就是在M1的配置文件中的這兩行的作用
        auto_increment_offset=2    #設置字段自動增長的起始值2
        auto_increment_increment=2  #增長的幅度為2"
    而M0上在這張表上插入的內容就是以基數增長了,但是它不會不全前面缺的數,而是一直增張。

        M0 [test]> select * from t1;
        +----+-------+
        | id | name  |
        +----+-------+
        |  2 | wang  |
        |  4 | li         |
        |  5 | zhang |
        |  7 | huang |
        +----+-------+
        4 rows in set (0.00 sec)

總結:

  • 主主復制:互為主從
    • 容易產生的問題:數據不一致;因此慎用
  • 考慮要點:表某一個字段設置為自動增長的id值時
    • 配置一個節點使用奇數id,需要在配置文件中添加如下
      • auto_increment_offset=1 開始點
      • auto_increment_increment=2 增長幅度
    • 另一個節點使用偶數id,需要在配置文件中添加如下
      • auto_increment_offset=2
      • auto_increment_increment=2
  • 兩臺服務器都必須開啟二進制日誌功能,並且都要有授權復制數據的用戶

實現mysql主主復制架構