一,mysql replication是什麼,幹什麼用的
MySQL replication提供了數據庫複製的功能,可以實現多個數據庫實時同步,具體如果下圖:
我們爲什麼要用mysql replication呢,當你的網站一天的獨立IP流量能達到100W時,全部流量能達到1000W時,單個服務器,根本無法滿足現有需要,100W,1000W就是舉個例子。儘管你做了許多的技術上面的措施,比如內存緩存(如memcache),文件緩存啊,對於大數據量表進行分表啊等等,還是網站還是挺慢的(這可能有多方面原因),在這兒只是以MYSQL爲例。
二,mysql replication 的安裝和配置
1)在192.168.1.91上修改my.ini(主機/master)
日誌文件必須設置
a,在192.168.1.91上修改mysql的配置文件my.ini,master是windows系統
- server-id=1
- binlog-do-db=test1
- auto_increment_offset= 2
- log-bin=d:/wamp/mysql/master-bin.log
- log-bin-index = d:/wamp/mysql/master-log-bin.index
- log-error = d:/wamp/mysql/master-error.log
- relay-log = d:/wamp/mysql/slave-relay.log
- relay-log-info-file = d:/wamp/mysql/slave-relay-log.info
- relay-log-index = d:/wamp/mysql/slave-relay-log.index
- set-variable=max_connections=500
b, 其次仍然在該區域修改, 配置爲以該機爲slave
- master-host=192.168.1.5
- master-user=xtajmd
- master-password=xtajmd
- master-port=3306
- master-connect-retry=60
- replicate-do-db=test1
- log-slave-updates
解釋:
server-id=1表示是本機的序號爲1,一般來講就是master的意思.
binlog-do-db=test1表示需要備份的數據庫是test這個數據庫,
replicate-do-db=test1 表示同步test數據庫;
如果需要備份多個數據庫,那麼應該寫多行,如下所示:
binlog-do-db=test1
binlog-do-db=test2
binlog-do-db=test3
log-bin表示打開binlog,打開該選項纔可以通過I/O寫到Slave的relay-log,也是可以進行replication的前提;
auto_increment_increment定義下一次AUTO_INCREMENT的步長
auto_increment_offset= 1定義AUTO_INCREMENT的起點值
這兩個參數用於避免多master情況下,多個master同時存取字段類型爲AUTO_INCREMENT的衝突。其它幾個字段爲日誌文件配置信息
set-variable=max_connections=500 設定數據庫最大連接數爲500
master-host=192.168.1.91 表示本機做slave時的master爲192.168.1.91;
master-user=xtajmd 這裏表示master(192.168.1.91)上開放的一個有權限的用戶,使其可以從slave連接到master並進行復制; 建議兩臺主機的授權用戶和密碼完全相同。
master-password=xtajmd 表示授權用戶的密碼;
master-port=3306 表示master(192.168.1.91)上MySQL服務Listen3306端口;
master-connect-retry=60 同步間隔時間;
log-slave-updates:從master讀到的更新操作都記錄到slave二進制日誌中
3)在192.168.1.5上修改my.cnf(slove/從)
vi my.cnf
找到
# The MySQL server
[mysqld]
在mysqld裏面加上以下部分
- server-id=2 #表示本機序號,不要和主機相同
- binlog-do-db=test1
- log-bin=/usr/local/mysql/master-bin.log
- log-bin-index = /usr/local/mysql/master-log-bin.index
- log-error = /usr/local/mysql/master-error.log
- relay-log = /usr/local/mysql/slave-relay.log
- relay-log-info-file = /usr/local/mysql/slave-relay-log.info
- relay-log-index = /usr/local/mysql/slave-relay-log.index
- set-variable=max_connections=500
- master-host=192.168.1.91
- master-user=xtajmd
- master-password=xtajmd
- master-port=3306
- master-connect-retry=60
- replicate-do-db=test1
- log-slave-updates
4),準備二個一樣的數據庫
5) 建立賬戶,分配權限
在192.168.1.91和192.168.1.5上使用mysql登陸,分別操作如下操作:
GRANT FILE,SELECT,REPLICATION SLAVE ON *.* TO xtajmd@'%' IDENTIFIED BY 'xtajmd';
flush
在192.168.1.91和192.168.1.5上分別測試所添加用戶能否正常登陸另外一臺服務器。
在192.168.1.5上:mysql -u xtajmd -p -h 192.168.1.91
在192.168.1.91上:mysql -u xtajmd -p -h 192.168.1.5
注意:
如果二臺linux系統間的數據同步的話,請確認兩臺服務器上iptables的3306端口已經開通,以保證通信正常。
如果是windows和linux系統間的數據同步的話,確保linux服務器上iptables的3306端口已經開通,windows下面防火牆,殺毒軟件是不是允許外界通過3306來連接本地數據庫
6) 二臺服務器都重起mysql,查master,slave狀態,以及注意問題
在192.168.1.91上
mysql> show master status;
+-------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-bin.000072 | 98 |
test1 | |
+-------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
在192.168.1.5上
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.91
Master_User: xtajmd
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master-bin.000072
Read_Master_Log_Pos: 98
Relay_Log_File: slave-relay.000330
Relay_Log_Pos: 244
Relay_Master_Log_File: master-bin.000072
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: test1
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
老實說,我在本地配置成功成功以後, show master status的結果都是空。反而在兩臺服務器上都能使用show slave status\G;命令都能成功。
注意:在這裏Slave_IO_State:後面有可能沒有任何參數,或者是Waitting to connect
我們一定要確保,master裏面File和Master_Log_File內容是一樣的,position和Read_Log_File_Pos要一樣的。
反過來也要一樣。如果不一樣怎麼辦呢?如下
解決步驟:
重啓master庫:
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000072 | 98 | test1 | |
+------------------+----------+--------------+------------------+
mysql> slave stop;
mysql> change master to Master_Log_File='mysql-bin.000072',Master_Log_Pos=98;
mysql> slave start;
mysql> show slave status\G
到這裏基本上算是配置好了,現在測試一下吧
轉自(海底蒼鷹的博客,http://blog.51yip.com/mysql/357.html)