2008年4月12日 星期六

03)Replication in MySQL

MySQL 在 3.23.29 版以後, 已提供了資料覆寫 (Replication) 功能, 設定的方法很簡單:

※範例環境說明:
 Linux OS
 MySQL 資料庫路徑: /var/lib/mysql
 MySQL 設定檔: /etc/my.cnf
 Master IP: 192.168.1.1
 Slave IP: 192.168.1.2
 要進行資料同步的資料庫: abc

※Master 的設定說明:

Step 1.
 確認 Master 與 Slave 機器上所安裝的 MySQL 版本是否為 3.23.29 或更高的版本.

 #rpm -q mysql

Step 2.
 在 MySQL 開放一個帳號給 Slave:

 #mysql -u root -p 

 mysql>grant file on *.* to repl@192.168.1.2 identified by 'abc123';

 *註mysql>quit
 *註: MySQL 4.0.2 以後的版本, 請將 GRANT FILE 改為 GRANT REPLICATION SLAVE.

Step 3.
 停止 MySQL:

 #/etc/rc.d/init.d/mysqld stop

 或 #mysqladmin -u root -p shutdown

Step 4.
 使用 tar 指令, 將 abc 資料庫備份到 /tmp:

 #cd /var/lib/mysql

 #tar -zcpf /tmp/mysql_snapshot.tar.gz ./abc

 請注意 tar 指令加了參數 p, 將檔案權限一併記錄起來, 解壓縮的時候才不用再變更檔案屬性.

Step 5.
 修改 /etc/my.cnf, 在 [mysqld] 區段內加入以下參數:

 server-id=1log-binsql-bin-update-samebinlog-do-db=abc

 (針對 abc 這個 database 做記錄)

Step 6.
 啟動 MySQL:

 #/etc/rc.d/init.d/mysqld start

 此時因為有加入 log-bin 參數, 因此開始有 index 產生了,

 在 /var/lib/mysql 目錄下可以發現 .index 檔案記錄資料庫的異動 log.

Step 7.
 將備份資料庫檔案複製到 Slave 機器上:

 #scp /tmp/mysql_snapshot.tar.gz root@192.168.1.2:/tmp


※Slave 的設定說明:

Step 1.
 停止 MySQL:

 #/etc/rc.d/init.d/mysqld stop

 或 #mysqladmin -u root -p shutdown

Step 2.
 修改 /etc/my.cnf, 在 [mysqld] 區段加入以下參數:

 server-id=2log-slave-updatesreplicate-do-db=abc

 (告訴 slave 只做 abc 資料庫的更新)

 master-host=192.168.1.1master-user=replmaster-password=abc123master-port=3306master-connect-retry=60

 (預設重試間隔 60 秒)

Step 3.
 解開 Master 備份好的資料庫檔案:

 #cd /var/lib/mysql

 #tar -zxf /tmp/mysql_snapshot.tar.gz

 如果解出來的檔案、目錄權限不對的話, 記得要用 chown、chmod 修正.

Step 4.
 啟動 MySQL:/etc/rc.d/init.d/mysqld start此時,

 在 /var/lib/mysql 目錄裡會出現 master.info,

 這個檔案記錄了 Master MySQL Server 的資訊.

以上步驟完成後, 只要在 Master 異動 abc 資料庫的資料, Slave 的 abc 資料庫亦會跟著變更; 如果 Slave 掛點, 不影響 Master 的運作, 待 Slave 恢復後, 會自動進行覆寫的動作.
如果 Slave 重新啟動後, 覆寫功能並未恢復者, 將 /var/lib/mysql 裡的 *.index 與 *.001, .002... 都刪除掉後, 再重新啟動 Master 與 Slave 的 MySQL 即可.

若要讓兩台機器同時具備 Master 與 Slave 的功能, 只要在兩台機器都執行 Master 的 Step 2. (mysql grant command), 然後將上述 Master 與 Slave 的設定都寫入 /etc/my.cnf 即可. 要注意的是 server-id 一定要錯開, 不能使用相同的 server-id. 這樣不管是在哪台機器異動資料, 都會互相進行覆寫的動作.

※參考資料:
 Instructions for setting up MySQL Replication (作者: myz)
 MySQL 官方文件: Replication in MySQL

引用

沒有留言: