2015年9月16日 星期三

建立 MySQL Repication 同步機制

MySQL Replication 同步機制中,資料庫有兩個角色,一個 Master,一個以上的 Slave。資料 insert update 都指到 Master 中,再同步到 Slave 上。這樣的架構叫 Active-Standby,萬一 Master 真的壞了,需要透過人手動處理,讓 Slave 變成 Master 來服務。

MySQL Cluster 機制,則是所有 Server 都是 Master,都可以同時寫入。但它們需要透過 Load Balancer(軟體的或硬體的),對上層應用來說,透過一個 Virtual IP 來存取其中一部,存取哪一個,由 Load Balancer 來分配。MySQL Cluster 是 Active-Active 架構,一台壞了,把它服務停下即可,Load Balancer 發現它死了,就不會把流量導向死掉的 server 了。


本篇是說明 Replication 的 Maser / Slave 架構如何建立。

在 Replication 架構下,Master 會將要送給 Slave 的內容,寫到一個 binary log file,這個 file 有個 position 的指標,說明寫到哪邊了。而 Slave 上,可以查看 status,檢查 position 同步到哪了,有沒有與 Master 一致。

Master 上有個 Sender Thread 負責送出 binary log 的東西,而 Slave 上有兩個 Thread 分別是 Receiver Thread(I/O Thread) 與 Applier Thread (SQL Thread),Receiver Thread 收到 Master 的東西,會寫到一個 Relay Log File,再由 Applier Thread 寫進資料庫裡。

如何架 MySQL Server,請參考MySQL TAR檔安裝方式 on Linux。後面都依循這一篇的安裝路徑做說明。

下面將兩部 MySQL 分別建成 Master 與 Slave:
1. 分別在 Master 與 Slave 主機上,編輯 /opt/mysql/my.cnf,加上這些 properties。
log-bin=mysql-bin
binlog_format=mixed
binlog_row_image=minimal

2. 分別在 Master 與 Slave 主機上,編輯 /opt/mysql/my.cnf,檢查 server-id property,兩台要設成不一樣。
 
3. 分別在 Master 與 Slave 上,重啟 MySQL 服務
/etc/init.d/mysqld restart

4. 在 Master 上,建立 Replication 用的帳號與權限
cd /opt/mysql/bin
./mysql
mysql> grant replication slave on *.* to 'repl'@'x.x.x.x' identified by 'repl';
只給這個 repl 帳號 replication 與 slave 權限。 x.x.x.x 改成 Slave IP。

5. 查看 Master 上目前 binary log 與 position
cd /opt/mysql/bin
./mysql
mysql> show master  status\G
記下 File名稱與 Position指標位置。

6. 匯出 Master 全部資料庫,然後在 Slave 匯入。
@Master 主機
cd /opt/mysql/bin
./mysqldump -A > /tmp/db_dump.sql
把 Master dump 出來的 db_dump.sql 檔案放到 Slave 上。

@Slave 主機
cd /opt/mysql/bin
./mysql < db_dump.sql

7. 在 Slave 上,設定目前 Master 的 binary log file 與 Position。
cd /opt/mysql/bin
./mysql
mysql > change master to
    master_host='x.x.x.x',
    master_port=3306,
    master_user='repl',
    master_password='repl',
    master_log_file='mysql-bin.000002',
    master_log_pos=384;
master_log_file 與 master_log_pos 改成步驟 5 記下來的 file name 與 position。x.x.x.x 改成 Master IP。

8. 在 Slave 上,啟動 slave 服務。
cd /opt/mysql
./mysql
mysql>  start slave;
若有修復 Replication,需重作步驟 6, 7, 8。即重新 dump Master DB,再匯入 Slave。然後在 Slave 上,要重作 change Master to..., stop slave與start slave。

9. 在 Slave 上,檢查是否 Slave Threads 是否啟動。
cd /opt/mysql
./mysql
mysql> show slave status\G;


應該要有
Slave_IO_Running: Yes  (No: 表示連不到 Master)
Slave_SQL_Running: Yes  (No: Master/Slave 不一致了)
若有Fail,在 Last_IO_Error 或 Last_SQL_Error,會說明詳細的錯誤原因。 


到這,Master 與 Slave 應該已經有同步了。

10. 在 Slave 上,把 DB 設成 Read Only。
其實 Slave 也是可以寫入的,但會造成 Master 與 Slave 資料不一致,所以把 Slave 設成 Read Only。
cd /opt/mysql/bin
./mysql
mysql> flush tables with read lock;
mysql> set global read_only = on;
好了,Slave 只能 select 不能做 insert, update 了。

若 Master 毀了,要讓 Slave 可以寫入,則
mysql> set global read_only = off;
mysql> unlock tables;




基本上,就是這樣啦~~~~



沒有留言: