這個是承上一篇, 裝完MySQL-Proxy後, 後續怎麼從零建置起, 第一步要先把後端的MySQL Replication建立起來.
準備好兩台機器(目前稱為Master/Slave), 首先安裝好CentOS 5之後, 一樣先把Repositories都裝好, 也都update/upgrade好, 以下是兩台共通的部份.
- 安裝一套CentOS5, 我實驗的VM是使用CentOS 5.6, 只裝了基本的Base跟Develop Tools
- 先做一次yum -y update, 更新一些套件到最新
- 安裝RPMForge & EPEL Repositories
- 再做一次yum -y update, 更新一些套件到最新
- 安裝MySQL Server, 設定好services
# yum -y install mysql-server
# /sbin/chkconfig mysqld on
# /sbin/service mysqld start
- 設定iptables, Master/Slave互相開放對方的TCP 3306 port, 其中eth0改成自己的網卡代號.
# /sbin/iptables -A INPUT -i eth0 -p tcp -m tcp –dport 3306 -j ACCEPT
接著是兩台不同的部份, 請注意前面的Hostname代表是在哪一台上
- 到Master上先設定my.cnf, 這個是可以選擇不同設定檔, 在/usr/share/mysql 下有很多個, 這裡挑選medium的, 細部設定請參考mysql網站上的文件, 這裡直接用medium的標準設定.
[Master] # /sbin/services mysqld stop
[Master] # cp /usr/share/mysql/my-medium.cnf /etc/my.cnf
- 設定 /etc/my.cnf, 務必打開log-bin
server-id = 1
log-bin = mysql-bin
其中server-id必須各自不同, 用於Replication關係中識別各Server. - 設定Replication使用的連線帳號
[Master] # /sbin/service mysqld start
[Master] # mysql -u root
mysql> GRANT REPLICATION SLAVE ON *.* TO repl@SLAVE-IP IDENTIFIED BY ‘repl_password’;
mysql> FLUSH PRIVILEGES;
其中 repl 是Slave用來連接Master使用的帳號, SLAVE-IP是Slave的ip address, 增加一個slave時必須重加, repl_password則是Slave連接Master時的密碼, 請更換成自己的. - 接著把Master的資料都Lock, 避免任何新資料寫入, 並且取得Master status
mysql> FLUSH TABLES WITH READ LOCK;
mysql> SHOW MASTER STATUS;
+——————+———-+————–+——————+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+——————+———-+————–+——————+
| mysql-bin.000001 | 759 | | |
+——————+———-+————–+——————+
上頭的File跟Position就是等等Slave設定時使用的參數 - 到Slave上, 一樣先複製一份my.cnf
[Slave] # /sbin/service mysqld stop
[Slave] # cp /usr/share/mysql/my-medium.cnf /etc/my.cnf
- 設定my.cnf, 唯一的不同是server-id一定要跟Master不同, 而且不能跟其他Slave重複
server-id = 2
log-bin = mysql-bin
server-id務必與Master不同, 也不能與其他Slave(假如有的話)相同 - 啟動Slave並設定Master相關資訊
[Slave] # /sbin/services mysqld start
[Slave] # mysql -u root
mysql> CHANGE MASTER TO
-> MASTER_HOST=Master-IP,
-> MASTER_USER=’repl’,
-> MASTER_PASSWORD=’repl_password’,
-> MASTER_LOG_FILE=’mysql-bin.000001′,
-> MASTER_LOG_POS=’759′;
其中Master-IP則為Master的IP, repl是剛剛設定在Master上的帳號, MASTER_LOG_FILE則是剛剛在Master上SHOW Master Status出現的Binary Log檔名, MASTER_LOG_POS則是現在在Binary Log檔案中的位置, 請依照前面看到的填入. - 在Slave上啟動Slave 機制
mysql> Start Slave;
Query OK, 0 rows affected, 0 warning (0.00 sec)
這樣就表示成功了, 也可以在Slave上SHOW SLAVE STATUS來看狀態
mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: xxx.xxx.xxx.xxx
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 759
Relay_Log_File: mysqld-relay-bin.000042
Relay_Log_Pos: 235
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 759
Relay_Log_Space: 235
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
1 row in set (0.00 sec)
主要要看到Slave_SQL_Running是Yes就大致ok了. - 最後回到Master上, 把剛剛Lock住的解開
[Master] # mysql -u root
mysql> UNLOCK TABLES;
接下來就可以實驗新增Db/Tables/Rows看看有沒有被Replication到Slave去.
大致這樣就乾淨的把兩台機器之間的MySQL Replication設定好了, 但是還有一些注意事項
- 絕對不要在Slave上寫入或更新任何資料, 必要時甚至只開啟Select的權限
- 必須定期檢查Slave上的Replication狀態, 是否有錯誤
- 由於開啟Binary Log後, 忙碌的MySQL Server會不停的佔用空間, 也請在確認好Replication狀態運行中的時候, 定期PURGE binary log, 相關文件請參考 這裡
- 若Replication狀態損壞時, 需要重建關係, 在Master Lock之後, 把mysql data file複製一份至Slave後, 程序相同
這裡只有簡單的run down, 中間碰到任何問題請Google解決吧.