MySQL replication 互為主從的安裝及配置,以及數據同步

jopen 10年前發布 | 16K 次閱讀 MySQL 數據庫服務器

一,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

MySQL replication 互為主從的安裝及配置,以及數據同步

注意:

如果二臺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

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!