Recent posts

MySQL Replication (Master Slave) 建置

上午9:08 0 Comments




SQL Replication是常見的 load balance 架構,可透過實作讀(Slave)寫(Master)分離進而減輕系統的loading,也可以藉由Slave複寫的資料做其他應用而不影響主要資料,例如 : 資料備份、資料分析..等。
以下分享Replication的佈置方式,在下一篇將介紹如何透過MySQL Proxy實現讀寫分離

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成唯讀:
  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 意見: