MySQL Replication (Master Slave) 建置
SQL Replication是常見的 load balance 架構,可透過實作讀(Slave)寫(Master)分離進而減輕系統的loading,也可以藉由Slave複寫的資料做其他應用而不影響主要資料,例如 : 資料備份、資料分析..等。
About SQL Replication
- Master
- 接收查詢指令 (SELECT)
- 接收資料變更指令 (INSERT、UPDATE、DELETE)
- Slave
- 接收查詢指令 (SELECT)
- 接收 Master 資料庫上設定複寫的資料庫內容更新
- MySQL 複寫機制為非同步
- MySQL 複寫機制是由 Slave 主動向 Master 要求資料庫的內容更新
- Slave 不需要一直連接 Master 才能運作,長時間中斷連線仍能回復資料庫同步的狀態
Build Environment
- OS : Ubuntu 14.10
- MySQL : 5.5
Master Setting
1. 編輯 /etc/mysql/my.cnf,在[mysqld]區段內加入以下設定:
[mysqld]
#bind-address = 127.0.0.1
// 註解此行,因linux預設MySQL只會bind本機網路介面
server-id = 1 // id為唯一值,不可重覆
log-bin=mysql-bin
// 指定產生bin log檔案名稱,使MySQL記錄所有DB交易記錄 |
若只想複寫部分資料庫,可以加上binlog-do-db參數:
binlog-do-db = db_name1
binlog-do-db = db_name2
|
儲存後,重啟MySQL:
$ /etc/init.d/mysql restart
|
登入MySQL:
$ mysql -u root -p
|
2. 在Master建立給Slave連接複寫資料的專用帳號
mysql> CREATE USER 'account'@'ip' IDENTIFIED BY 'password';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'account'@'ip';
mysql> FLUSH PRIVILEGES;
|
3. 在Master建立一次完整備份,在Replication完成前,Master跟Slave的資料必須一致,
故在匯出資料前先Lock成唯讀:
故在匯出資料前先Lock成唯讀:
mysql> FLUSH TABLES WITH READ LOCK;
|
開始備份:
$ mysqldump -u root -p --master-data --all-databases > master.sql
|
解除資料唯獨狀態:
mysql> UNLOCK TABLES;
|
Slave Setting
1. 將Master備份檔(master.sql)還原到Slave資料庫伺服器:
$ mysql -u root -p --default-character-set=utf8 < master.sql
|
2. 設定Slave的 /etc/mysql/my.cnf,在[mysqld]區段裡加入以下設定:
[mysqld]
server-id = 2
// Slave也可以設定log-bin參數,如此Slave也能當成Master供其他台複寫資料,這又是另一段故事了...more
|
儲存後,重啟MySQL:
$ /etc/init.d/mysql restart
|
3. 設定Slave資料庫,指定Master資料庫登入資訊,並啟動複寫機制:
mysql> CHANGE MASTER TO MASTER_HOST='master_ip',
MASTER_USER='account', MASTER_PASSWORD='password'; // 指定master設定的複寫專用帳號 |
啟動Slave複寫:
mysql> START SLAVE;
|
4. 檢查Slave資料庫的複寫機制是否正常運作:
mysql> SHOW SLAVE STATUS \G;
|
正常狀態:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
|
打完收工~
Resync Replication
Master Setting
1. 重置Master,並Lock資料庫:
mysql> RESET MASTER;
mysql> FLUSH TABLES WITH READ LOCK;
|
2. 建立完整備份:
$ mysqldump -u root -p --master-data --all-databases > master.sql
|
3. 解除資料唯獨狀態:
mysql> UNLOCK TABLES;
|
Slave Setting
1. 停止Slave,並將Master備份檔(master.sql)還原到Slave資料庫伺服器,再重置Slave:
mysql> STOP SLAVE;
$ mysql -u root -p --default-character-set=utf8 < master.sql
mysql> RESET SLAVE;
|
2. 指定在Master資料庫的登入資訊,並啟動複寫機制:
mysql> CHANGE MASTER TO MASTER_HOST='master_ip',
MASTER_USER='account', MASTER_PASSWORD='password'; // 指定master設定的複寫專用帳號
mysql> START SLAVE;
|
3. 檢查Slave資料庫的複寫機制是否正常運作:
mysql> SHOW SLAVE STATUS \G;
|
正常狀態:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
|
0 意見: