MySQL復制介紹及搭建
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 rac1-node.tp-link.net
slave 192.168.1.6 rac2-node.tp-link.net
OS:Oracle Linux 6.1
MySQL:5.5.37
Master配置
分配復制權限
mysql> grant replication client,replication slave on *.* to root@'192.168.1.%' identified by 'root';
Query OK, 0 rows affected (0.00 sec) 清空日志文件
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)
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 107 |
+------------------+-----------+
1 row in set (0.00 sec) Slave設置
1) 修改從服務器server-id
# vim /etc/my.cnf
server-id = 2 修改完以后需要重啟數據庫
2)清空日志文件,同Master
3)讓slave連接master并開始重做master二進制日志中的事件
mysql> change master to
MASTER_LOG_POS的值為0,因為它是日志的開始位置
這里注意:默認情況下,會同步該用戶下所有的DB,可以在/etc/my.inf中通過參數binlog-do-db、binlog-ignore-db設置需要同步的數據庫。
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: 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創建數據庫
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 |
+--------------------+
mysql> use d
mysql> create table t(id int); Slave查看
mysql> show tables;
mysql> select * from t;
+------+
| 1 |
+------+ 通過以上驗證,可以看到主服務器上的修改能夠正常同步到從服務器。
其他復制方式
主主復制
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壓力增大,從而造成數據復制延時。
多級復制就是為了解決這個問題。
當然,增加復制的級聯層次,同一個變更傳到最底層的Slave所需要經過的MySQL也會更多,同樣可能造成延時較長的風險。如果條件允許,傾向于通過拆分成多個Replication集群來解決