MySQL replication 互為主從的安裝及配置,以及數據同步
一,mysql replication是什么,干什么用的
MySQL replication提供了數據庫復制的功能,可以實現多個數據庫實時同步,具體如果下圖:
mysql replication 數據同步
我 們為什么要用mysql replication呢,當你的網站一天的獨立IP流量能達到100W時,全部流量能達到1000W時,單個服務器,根本無法滿足現有需 要,100W,1000W就是舉個例子。盡管你做了許多的技術上面的措施,比如內存緩存(如memcache),文件緩存啊,對于大數據量表進行分表啊等 等,還是網站還是挺慢的(這可能有多方面原因),在這兒只是以MYSQL為例。
二,mysql replication 的安裝和配置
mysql 3.23.15以后,裝mysql的時候,就自帶有mysql replication。我四年前做開發的,那個時候,我接觸的mysql4,如果現在還有用mysql3的,那我就表示無語了。
1)安裝mysql
下個mysql,安裝一下,導入表和內容。我就不在這兒詳細說了。
2)在192.168.1.91上修改my.ini
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
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),準備二個一樣的數據庫
從一臺機器上面的mysql中導出一個數據庫,什么數據庫都行,然后導入到另一臺機器的數據中。
方法請參考:http://blog.51yip.com/mysql/139.html
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
mysql -u xtajmd -p -h 192.168.1.91
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 5.0.27-community-nt-log MySQL Community Edition (GPL)
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>
在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:
注意:在這里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
到這里基本上算是配置好了,現在測試一下吧,在91上的數據庫test1里面,加張表試一下,看看5上面有沒有。哈哈。
來自:http://blog.51yip.com/mysql/357.html