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複製搭建
環境準備
master 192.168.1.5
slave 192.168.1.6
OS:Oracle Linux 6.1
MySQL:5.5.37
Master配置
1)分配複製許可權
主庫和從庫均需要執行
1 2 |
mysql> grant replication client,replication slave on *.* to root@'192.168.1.%' identified by 'root'; Query OK, 0 rows affected (0.00 sec) |
2)清空日誌檔案
主從庫都是預設開啟二進位制日誌檔案
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
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
1 2 |
# vim /etc/my.cnf server-id = 2 |
修改完以後需要重啟資料庫
2)清空日誌檔案,同Master
3)啟用複製
讓slave連線master並開始重做master二進位制日誌中的事件
1 2 |
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
1 2 |
mysql> start slave; Query OK, 0 rows affected (0.00 sec) |
5)確認Slave是否和Mater成功通訊。如果 Slave_IO_Running和Slave_SQL_Running都是yes,則證明配置成功
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
mysql> show slave statusG; *************************** 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: 0 Master_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: 1 1 row in set (0.00 sec) |
測試
Master建立資料庫
1 2 3 4 5 6 7 8 9 10 11 |
mysql> create database d; mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | d | | mysql | | performance_schema | | test | +--------------------+ |
Slave檢視資料庫已同步
1 2 3 4 5 6 7 8 9 10 |
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | d | | mysql | | performance_schema | | test | +--------------------+ |
Master建立表插入資料
1 2 3 4 |
mysql> use d mysql> create table t(id int); mysql> insert into t values(1); mysql> commit; |
Slave檢視
1 2 3 4 5 6 7 8 |
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引數。同時二進位制日誌也必須啟用。
當然,增加複製的級聯層次,同一個變更傳到最底層的Slave所需要經過的MySQL也會更多,同樣可能造成延時較長的風險。如果條件允許,傾向於通過拆分成多個Replication叢集來解決。
參考: