-以下這份文件是針對兩台MySQL伺服器進行One-way Replication 
-Starting in Version 3.23.15, MySQL supports one-way replication internally. 
-參考文件 
1. 
http://www.mysql.com/doc/en/Replication.html 
-測試環境 
RedHat 7.3 + MySQL 3.23.49 
MySQL資料庫路徑: /var/lib/mysql 
MySQL設定檔: /etc/my.cnf 
Master IP: 192.168.1.1 
Slave IP: 192.168.1.2 
-設定步驟Master/Slave 
-設定Master 
1.確認Master/Slave機器上所裝的MySQL版本能進行replication.Use Version 3.23.29 or higher. 
2.在Master MySQL上開放一個帳號給Slave 
#mysql –u root –p 
mysql>GRANT FILE ON *.* TO 
[email protected] IDENTIFIED BY ‘abc123’; 
mysql>\q 
# 
上面是Master開放一個帳號repl密碼abc123給IP:192.168.1.2有檔案處理的權限. 
3.shutdown MySQL on the Master 
#mysqladmin –u root –p shutdown 
4.備份Master所有資料庫..通常都用tar指令. 
#tar –cvf /tmp/mysql-snapshot.tar /var/lib/mysql 
注意:tar的時候,MySQL是要在stop情況下 
不過在mysql網站的FAQ有不用shutdown的方法 
5.在master機器上修改/etc/my.cnf 
在[mysqld]區段內加入參數 
log-bin 
server-id=這邊設定server-id=1 
sql-bin-update-same 
binlog-do-db=phpBB只針對phpBB資料庫做紀錄 
6.Restart MySQL on the master 
此時因為有加入log-bin參數,因此開始有index產生了,在/var/lib/mysql目錄下有.index檔案紀錄資料庫的異動log. 
-接下來設定Slave 
7.在slave設定/etc/my.cnf 
在[mysqld]區段加入 
master-host= 
master-user= 
master-password= 
master-port= 
server-id= 
這邊設定 
master-host=192.168.1.1 
master-user=repl 
master-password=abc123 
master-port=3306 
server-id=2 
master-connect-retry=60預設重試間隔60秒 
replicate-do-db=phpBB告訴slave只做phpBB資料庫的更新 
log-slave-updates 
8.將master上的mysql-snapshot.tar copy到slave上 
用ftp傳到slave的/tmp 
9.解壓縮 
#cd /var/lib/ 
#tar xvf /tmp/mysql-snapshot.tar 
#chown –R mysql:mysql mysql 
#chmod –R 770 mysql(視情況) 
10.Restart MySQL on the slave server 
這時在/var/lib/mysql目錄會出現master.info,此檔案紀錄了Master MySQL server的資訊. 
-狀況測試 
1.Master跟Slave網路及服務都正常情況下,由Master端異動資料後,
        到Slave端瀏覽資料,檢視是否有進行replication?! 
2.模擬Slave掛點,可用在於slave真的掛點,或是slave不一定需要一直跟master connect.
        將Slave MySQL server shutdown,由Master端異動資料,到slave端瀏覽,
        此時Slave應該沒有被replication更新,然後再將Slave端MySQL server start起來,
        預設60秒後Slave會嘗試跟Master要求進行replication.再去Slave端檢視是否有更新資料?! 
3.模擬Master掛點.那沒搞頭了,因為是設定One-way replication.一旦Master掛點,
        Slave端沒有Master的source可以download,所以沒搞頭了. 
4.基於第3點狀況於是發展雙向Replication,即A/B都分別擔任Master/Slave身分 
-以下是針對兩台MySQL伺服器進行雙向Replication 
觀念同單向replication只是改成Master也有Slave身分, Slave也有Master的身分. 
先分別在A/B都去grant一個進行replication的身分 
[A]mysql>GRANT FILE ON *.* TO 
[email protected] IDENTIFIED BY ‘abc123’; 
[B]mysql> GRANT FILE ON *.* TO 
[email protected] IDENTIFIED BY ‘abc123’; 
做完單向replication後,stop A/B MySQL service,此時A/B資料是一樣的. 
修改/etc/my.cnf設定 
範例: 
Server A 
[mysqld] 
datadir=/var/lib/mysql 
socket=/var/lib/mysql/mysql.sock 
server-id=1 
log-bin 
sql-bin-update-same 
binlog-do-db=phpBB 
master-host=192.168.1.2 
master-user=repl 
master-password=abc123 
log-slave-updates 
master-connect-retry=60 
replicate-do-db=phpBB 
Server B 
[mysqld] 
datadir=/var/lib/mysql 
socket=/var/lib/mysql/mysql.sock 
server-id=2 
log-bin 
sql-bin-update-same 
binlog-do-db=phpBB 
master-host=192.168.1.1 
master-user=repl 
master-password=abc123 
log-slave-updates 
master-connect-retry=60 
replicate-do-db=phpBB 
分別start A/B MySQL後,此時雙方都是Master/Slave身分,
        一但哪一方資料異動就會通知對方來replication. 
-若replication失效,我的做法是將A/B的master.info及.index,.00x都砍掉,
        然後分別restart MySQL server,進行測試.檢視成果. 
-再來由雙向replication延伸出replication chain/(circular),即A->B->C->…(->A) 
觀念chain是單向replication的延伸, circular是chain的尾巴接回頭. 
舉例A-B-C-A 
A為B的master,B是C的master,而C是A的master. 
反過來說 
B是A的slave,C是B的slave,而A是C的slave. 
只要將/etc/my.cnf檔案[mysqld]區段都加入master/slave對應的參數 
宣告為master是 
server-id=x其中x為主機id=1,2,3 
log-bin 
sql-bin-update-same 
binlog-do-db=phpBB 
定義slave是 
master-host=192.168.1.x其中x為主機ip=1,2,3 
master-user=repl 
master-password=abc123 
log-slave-updates 
master-connect-retry=60 
replicate-do-db=phpBB 
-測試 
1.各server(A/B/C)都運作正常下,任一台異動資料,就會通知slave進行replication 
2.模擬其中一台掛點.如B,則A異動時,因為B掛點,故此chain已經斷了,所以C並不會被更新. 
所以這種chain的方式缺點在於說其中一個環節點失效時,其後的都不會更新了,
但可由手動方式change master將下個節點change master from掛點的 to 上一個ok的節點. 
優點是有很多台server都有replication備份.