MySQL複製介紹及搭建

來源:互聯網
上載者:User

標籤:

MySQL複製介紹

MySQL複製就是一台MySQL伺服器(slave)從另一台MySQL伺服器(master)進行日誌的複製然後再解析日誌並應用到自身,類似Oracle中的Data Guard。

MySQL複製有那些好處:

  • 第一是解決宕機帶來的資料不一致,因為MySQL複製可以即時備份資料;
  • 第二點是減輕資料庫伺服器的壓力,多台伺服器的效能一般比單台要好。但是MySQL複製不適合大資料量,大資料量推薦使用叢集。

MySQL複製過程分成三步:

  • master將改變記錄到二進位日誌(binary log)。這些記錄過程叫做二進位日誌事件,binary log events;
  • slave將master的binary log events拷貝到它的中繼日誌(relay log);
  • slave重做中繼日誌中的事件,將改變應用到自己的資料庫中。 MySQL複製是非同步且序列化的

MySQL複製原理圖

MySQL複製搭建環境準備

master 192.168.1.5

slave 192.168.1.6

OS:Oracle Linux 6.1

MySQL:5.5.37

Master配置

1)分配複製許可權

主庫和從庫均需要執行

mysql> grant replication client,replication slave on *.* to [email protected]‘192.168.1.%‘ identified by ‘root‘;Query OK, 0 rows affected (0.00 sec)

2)清空記錄檔

主從庫都是預設開啟二進位記錄檔

mysql> show binary logs;+------------------+-----------+| Log_name         | File_size |+------------------+-----------+| mysql-bin.000001 |     26636 || mysql-bin.000002 |   1069399 || mysql-bin.000003 |     26636 || mysql-bin.000004 |   1069399 || mysql-bin.000005 |       536 |+------------------+-----------+5 rows in set (0.00 sec)mysql> reset master;Query OK, 0 rows affected (0.01 sec)mysql> show binary logs;+------------------+-----------+| Log_name         | File_size |+------------------+-----------+| mysql-bin.000001 |       107 |+------------------+-----------+1 row in set (0.00 sec)

需要注意的是,如果不想清空記錄檔的話,需要記錄當前master的log_file和log_pos,並在下面啟用複製操作時指定這兩個參數或者在slave的設定檔指定。

Slave設定

1) 修改從伺服器server-id

# vim /etc/my.cnfserver-id = 2

修改完以後需要重啟資料庫

2)清空記錄檔,同Master

3)啟用複製
讓slave串連master並開始重做master二進位日誌中的事件

mysql> change master to master_host=‘192.168.1.5‘,master_user=‘root‘,master_password=‘root‘,master_port=3306,master_log_file=‘mysql-bin.000001‘,master_log_pos=0;

master_log_pos的值為0,因為它是日誌的開始位置;master_log_file是初始記錄檔。如果master日誌沒有被清空,這裡就是當前master的日誌資訊

需要注意的是,預設情況下,會同步該使用者下所有的DB,如果想限定哪些DB,有3種思路

  • 在master上的/etc/my.inf中通過參數binlog-do-db、binlog-ignore-db設定需要同步的資料庫。
  • 在執行grant分配許可權操作的時候,限定資料庫
  • 在slave上限定資料庫使用replicate-do-db=dbname

4)開啟slave

mysql> start slave;Query OK, 0 rows affected (0.00 sec)

5)確認Slave是否和Mater成功通訊。如果 Slave_IO_Running和Slave_SQL_Running都是yes,則證明配置成功

mysql> show slave status\G;*************************** 1. row ***************************               Slave_IO_State: Waiting for master to send event                  Master_Host: 192.168.1.5                  Master_User: root                  Master_Port: 3306                Connect_Retry: 60              Master_Log_File: mysql-bin.000001          Read_Master_Log_Pos: 107               Relay_Log_File: rac-node2-relay-bin.000002                Relay_Log_Pos: 253        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: 107              Relay_Log_Space: 413              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: 0Master_SSL_Verify_Server_Cert: No                Last_IO_Errno: 0                Last_IO_Error:                Last_SQL_Errno: 0               Last_SQL_Error:   Replicate_Ignore_Server_Ids:              Master_Server_Id: 11 row in set (0.00 sec)
測試

Master建立資料庫

mysql> create database d;mysql> show databases;+--------------------+| Database           |+--------------------+| information_schema || d                  || mysql              || performance_schema || test               |+--------------------+

Slave查看資料庫已同步

mysql> show databases;+--------------------+| Database           |+--------------------+| information_schema || d                  || mysql              || performance_schema || test               |+--------------------+

Master建立表插入資料

mysql> use dmysql> create table t(id int);mysql> insert into t values(1);mysql> commit;

Slave查看

mysql> use d;mysql> show tables;mysql> select * from t;+------+| id   |+------+|    1 |+------+

通過以上驗證,可以看到主伺服器上的修改能夠正常同步到從伺服器。

補充說明

1)做了MySQL主從複製以後,使用mysqldump對資料備份時,一定要注意按照如下方式:
mysqldump –master-data –single-transaction –user=username –password=password dbname> dumpfilename
這樣就可以保留file和position的資訊,在新搭建一個slave的時候,還原完資料庫,file和position的資訊也隨之更新,接著再start slave 就可以很迅速的完成增量同步處理。

其他複製方式主主複製

master-slave只能進行單向操作,像網路中的半雙工。master-master可以實現伺服器之間互相同步,且主主複製可以避免出現單點故障後整個系統宕機。主主複製最大的問題就是資料插入或更新衝突。配置方法同主從複製,反過來讓slave同步master。注意master_log_file和master_log_pos參數要與master上對應。具體可以參考這裡

單一master和多slave

由一個master和多個slave組成的複製系統比較簡單。slave之間並不互相通訊,只能與master通訊。如果寫操作較少,讀操作很多,可以採用。可以將讀操作分布到其他slave,從而減輕master的壓力。但slave增加到一定數量時,slave對master的負載以及網路頻寬都會成為問題。

主從多級複製

讀操作很多可以採用單一maste和多slave,但增大到一定slave後連到master的slaveIO線程太多會造成master壓力增大,從而造成資料複製延時。多級複製就是為瞭解決這個問題。如果想實現主-從(主)-從多級複製,需要設定log-slave-updates參數。同時二進位日誌也必須啟用。

mysql多級複製

當然,增加複製的級聯層次,同一個變更傳到最底層的Slave所需要經過的MySQL也會更多,同樣可能造成延時較長的風險。如果條件允許,傾向於通過拆分成多個Replication叢集來解決。

參考:

http://heylinux.com/archives/1004.html

http://blog.csdn.net/hguisu/article/details/7325124

MySQL複製介紹及搭建

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.