實現mysql主主複製架構

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







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

一,對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_THREADvim

M1 [(none)]>START SLAVE;

3,查看線程狀態centos

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上建立一張測試表ide

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
  • 兩臺服務器都必須開啓二進制日誌功能,而且都要有受權複製數據的用戶
相關文章
相關標籤/搜索