CentOS 7 MySQL(MariaDB) Replication 主從式架構設定



安裝MySQL(MariaDB)的流程,可以參考這篇(CentOS 7 安裝MySQL (更新為MariaDB))
這邊直接進行Replication 設定的部分。

1. 設定Master

#開通防火牆
firewall-cmd --permanent --add-port=3306/tcp

#套用規則
firewall-cmd --reload

#開啟my.cnf檔
vim /etc/my.cnf

在[mysqld]部分新增以下幾行

[mysqld]
#---------- replication master set ----------
server_id=1
log-basename=master
log-bin
binlog-format=row
binlog-do-db=輸入要同步的DB名稱(這邊用test)
...

如果要多個Database可以這樣輸入
binlog-do-db=db1
binlog-do-db=db2
...

儲存後,重啟mariadb
systemctl restart mariadb

#登入mysql
mysql -u root -p

#停止Slave
MariaDB [(none)]> STOP SLAVE;

#新建replication的使用者
MariaDB [(none)]> GRANT REPLICATION SLAVE ON *.* TO '輸入使用者名稱'@'輸入來源(%為任意主機)' IDENTIFIED BY '輸入密碼';

#讓新增的使用者設定權限立即生效
MariaDB [(none)]> FLUSH PRIVILEGES;

#鎖定寫入功能在所有的Table,避免同步過程中資料不同步的情況
MariaDB [(none)]> FLUSH TABLES WITH READ LOCK;

#查看Master狀態
MariaDB [(none)]> SHOW MASTER STATUS;
+--------------------+----------+--------------+------------------+
| File               | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+--------------------+----------+--------------+------------------+
| mariadb-bin.000001 |      479 | test         |                  |
+--------------------+----------+--------------+------------------+

#離開MySQL
MariaDB [(none)]> exit

這邊的File (mariadb-bin.000001) 跟Position (479)欄位等等設定Slave時會用到,可以先記起來,我們先將master DB備份一份出來

mysqldump --all-databases --user=root --password --master-data > masterdatabase.sql

#登入mysql
mysql -u root -p

#解除Table的鎖定
MariaDB [(none)]> UNLOCK TABLES;

#離開
MariaDB [(none)]> exit

將剛才產生的備份sql檔,複製到slave主機home中,
scp masterdatabase.sql root@輸入slave主機來源:/home


2. 設定Slave

同樣的必須先裝好MariaDB套件,裝好後繼續以下動作。

#開啟my.cnf檔
vim /etc/my.cnf

在[mysqld]部分新增以下幾行

[mysqld]
server-id = 2
replicate-do-db=輸入要同步的DB名稱(這邊用test)
...

將複製過來的sql檔倒進去
mysql -u root -p < /home/masterdatabase.sql

重啟MariaDB
systemctl restart mariadb

#登入mysql
mysql -u root -p

#停止Slave
MariaDB [(none)]> STOP SLAVE;

#設定Master參數
MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='輸入Master主機ip', MASTER_USER='輸入使用者名稱', MASTER_PASSWORD='輸入密碼', MASTER_LOG_FILE='mariadb-bin.000001', MASTER_LOG_POS=479;

#啟動Slave
MariaDB [(none)]> SLAVE START;

#查看Slave狀態
MariaDB [(none)]> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 顯示Master IP
                  Master_User: 使用者名稱
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mariadb-bin.000001
          Read_Master_Log_Pos: 479
               Relay_Log_File: mariadb-relay-bin.000002
                Relay_Log_Pos: 918
        Relay_Master_Log_File: mariadb-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: test
          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: 479
              Relay_Log_Space: 1214
              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
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 row in set (0.00 sec)

3.  Master 測試DB


#登入mysql
mysql -u root -p

#新增Database(輸入上述設定的資料庫名稱)
MariaDB [(none)]> create database test;

#使用此DB
MariaDB [(none)]> use test;

#新增測試Table
MariaDB [test]> create table test_table (test_field int);

#新增一筆測試資料
MariaDB [test]> insert into test_table (test_field) values (1);

#查詢剛剛新增的資料
MariaDB [test]> select * from sample;
+---------------+
| test_field    |
+---------------+
|             1 |
+---------------+
1 row in set (0.00 sec)

4.  Slave 測試DB有無同步


#登入mysql
mysql -u root -p

#使用DB
MariaDB [(none)]> use test;

#查詢是否與Master
MariaDB [test]> select * from test_table;
+---------------+
| test_field    |
+---------------+
|             1 |
+---------------+
1 row in set (0.00 sec)

看到有資料後,即完成Replication 主從式架構設定


5.  同步失敗情況

請回到步驟2,重新設定Slave的Master_Log_File、Read_Master_Log_Pos對應到目前Master使用的參數

留言