前陣子有在做公司MySQL Replication的主從式架構,因為是測試環境, 所以我們主要是讓開發人員能夠將資料寫入和資料檢索的部分分開,讓資料庫的負擔可以減輕,將Server的壓力做分散。MySQL Replication 同時也會做資料庫的同步,由Slave的機器去同步Master上面的資料,也做到備援的機制。
目錄
MySQL Replication 原理
今天是以兩台機器,一台Master一台Slave作為實驗,MySQL Replication的原理是,Master的機器上面在執行SQL會記錄在Binary Log裡面,然後Master會再將Binary Log傳到Slave的Relay log裡面,Slave再去執行Relay log 裡面的SQL,然後將Relay log移除。
MySQL Replication 實作
今天就不說明怎麼安裝MySQL了,直接說明如何設定來啟動MySQL Replication。
首先我們先看Master機器上的設定,找到Master Sever 裡面的/etc/my.cnf
[mysqld]
server-id=1 #master id
log-bin=mysql-bin #binlog file name
expire_logs_days=3 #binlog expire days 這是binlog保留的份數,如果不設定會無限長大
然後要創建一個replication使用的user,並且給他權限
CREATE USER 'replicate_username'@'master_server_ip' IDENTIFIED BY 'replicate_password';
GRANT REPLICATION SLAVE ON *.* TO 'replicate_username'@'master_server_ip';
FLUSH PRIVILEGES;
然後重啟MySQL
systemctl restart mysql #本篇以CentOS7為作業系統
可以輸入SQL指令查看一下Master的狀態
SHOW MASTER STATUS \G;
應該可以看到目前binlog的檔案和Position的位置
File: mysql-bin.000001
Position: 312
接下來我們設定一下Slave,一樣找到Slave Sever 裡面的/etc/my.cnf
[mysqld]
server-id=2 #slave id
replicate-ignore-db=mysql #這是不要同步的DB
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schemas
然後重啟MySQL
在設定Master登入資訊啟動Slave之前,你必須先讓兩邊的資料一致,因此我會先在Master做DB Lock的動作,然後將資料Dump匯入到Slave裡面。
接著要輸入SQL指令,讓Slave指定Master的登入資料
CHANGE MASTER TO MASTER_HOST='master_server_ip', MASTER_PORT=3306, MASTER_USER='replicate_username', MASTER_PASSWORD='replicate_password', MASTER_LOG_FILE='mysql-bin.000001' , MASTER_LOG_POS=312;
START SLAVE;
一樣可以查看一下Slave的狀態
SHOW SLAVE STATUS \G
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
基本上如果這兩個狀態顯示Yes就表示Slave正常的在運作了。
你也可以解除Master的Lock然後試著新增或是修改資料看看,如果Slave有跟著同步的話就代表成功囉。
結論
在做MySQL Replication的部分基本上就是要記得匯入資料的時候要先把DB鎖住,不然如果你會有一些自動寫入的部分就會同步不成功,Slave要注意的部分就是一開始啟動的位置要和Master的Position的位置是一樣的,我通常都會確認一次。